This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: $^CHILD_ERROR_NATIVE issues (with attachment)
[perl5.git] / perl.c
1 /*    perl.c
2  *
3  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
13  */
14
15 /* This file contains the top-level functions that are used to create, use
16  * and destroy a perl interpreter, plus the functions used by XS code to
17  * call back into perl. Note that it does not contain the actual main()
18  * function of the interpreter; that can be found in perlmain.c
19  */
20
21 /* PSz 12 Nov 03
22  * 
23  * Be proud that perl(1) may proclaim:
24  *   Setuid Perl scripts are safer than C programs ...
25  * Do not abandon (deprecate) suidperl. Do not advocate C wrappers.
26  * 
27  * The flow was: perl starts, notices script is suid, execs suidperl with same
28  * arguments; suidperl opens script, checks many things, sets itself with
29  * right UID, execs perl with similar arguments but with script pre-opened on
30  * /dev/fd/xxx; perl checks script is as should be and does work. This was
31  * insecure: see perlsec(1) for many problems with this approach.
32  * 
33  * The "correct" flow should be: perl starts, opens script and notices it is
34  * suid, checks many things, execs suidperl with similar arguments but with
35  * script on /dev/fd/xxx; suidperl checks script and /dev/fd/xxx object are
36  * same, checks arguments match #! line, sets itself with right UID, execs
37  * perl with same arguments; perl checks many things and does work.
38  * 
39  * (Opening the script in perl instead of suidperl, we "lose" scripts that
40  * are readable to the target UID but not to the invoker. Where did
41  * unreadable scripts work anyway?)
42  * 
43  * For now, suidperl and perl are pretty much the same large and cumbersome
44  * program, so suidperl can check its argument list (see comments elsewhere).
45  * 
46  * References:
47  * Original bug report:
48  *   http://bugs.perl.org/index.html?req=bug_id&bug_id=20010322.218
49  *   http://rt.perl.org/rt2/Ticket/Display.html?id=6511
50  * Comments and discussion with Debian:
51  *   http://bugs.debian.org/203426
52  *   http://bugs.debian.org/220486
53  * Debian Security Advisory DSA 431-1 (does not fully fix problem):
54  *   http://www.debian.org/security/2004/dsa-431
55  * CVE candidate:
56  *   http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2003-0618
57  * Previous versions of this patch sent to perl5-porters:
58  *   http://www.mail-archive.com/perl5-porters@perl.org/msg71953.html
59  *   http://www.mail-archive.com/perl5-porters@perl.org/msg75245.html
60  *   http://www.mail-archive.com/perl5-porters@perl.org/msg75563.html
61  *   http://www.mail-archive.com/perl5-porters@perl.org/msg75635.html
62  * 
63 Paul Szabo - psz@maths.usyd.edu.au  http://www.maths.usyd.edu.au:8000/u/psz/
64 School of Mathematics and Statistics  University of Sydney   2006  Australia
65  * 
66  */
67 /* PSz 13 Nov 03
68  * Use truthful, neat, specific error messages.
69  * Cannot always hide the truth; security must not depend on doing so.
70  */
71
72 /* PSz 18 Feb 04
73  * Use global(?), thread-local fdscript for easier checks.
74  * (I do not understand how we could possibly get a thread race:
75  * do not all threads go through the same initialization? Or in
76  * fact, are not threads started only after we get the script and
77  * so know what to do? Oh well, make things super-safe...)
78  */
79
80 #include "EXTERN.h"
81 #define PERL_IN_PERL_C
82 #include "perl.h"
83 #include "patchlevel.h"                 /* for local_patches */
84
85 #ifdef NETWARE
86 #include "nwutil.h"     
87 char *nw_get_sitelib(const char *pl);
88 #endif
89
90 /* XXX If this causes problems, set i_unistd=undef in the hint file.  */
91 #ifdef I_UNISTD
92 #include <unistd.h>
93 #endif
94
95 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
96 #  ifdef I_SYS_WAIT
97 #   include <sys/wait.h>
98 #  endif
99 #  ifdef I_SYSUIO
100 #    include <sys/uio.h>
101 #  endif
102
103 union control_un {
104   struct cmsghdr cm;
105   char control[CMSG_SPACE(sizeof(int))];
106 };
107
108 #endif
109
110 #ifdef __BEOS__
111 #  define HZ 1000000
112 #endif
113
114 #ifndef HZ
115 #  ifdef CLK_TCK
116 #    define HZ CLK_TCK
117 #  else
118 #    define HZ 60
119 #  endif
120 #endif
121
122 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE) && !defined(PERL_MICRO)
123 char *getenv (char *); /* Usually in <stdlib.h> */
124 #endif
125
126 static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen);
127
128 #ifdef IAMSUID
129 #ifndef DOSUID
130 #define DOSUID
131 #endif
132 #endif /* IAMSUID */
133
134 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
135 #ifdef DOSUID
136 #undef DOSUID
137 #endif
138 #endif
139
140 static void
141 S_init_tls_and_interp(PerlInterpreter *my_perl)
142 {
143     dVAR;
144     if (!PL_curinterp) {                        
145         PERL_SET_INTERP(my_perl);
146 #if defined(USE_ITHREADS)
147         INIT_THREADS;
148         ALLOC_THREAD_KEY;
149         PERL_SET_THX(my_perl);
150         OP_REFCNT_INIT;
151         MUTEX_INIT(&PL_dollarzero_mutex);
152 #  endif
153     }
154     else {
155         PERL_SET_THX(my_perl);
156     }
157 }
158
159 #ifdef PERL_IMPLICIT_SYS
160 PerlInterpreter *
161 perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
162                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
163                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
164                  struct IPerlDir* ipD, struct IPerlSock* ipS,
165                  struct IPerlProc* ipP)
166 {
167     PerlInterpreter *my_perl;
168     /* Newx() needs interpreter, so call malloc() instead */
169     my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
170     S_init_tls_and_interp(my_perl);
171     Zero(my_perl, 1, PerlInterpreter);
172     PL_Mem = ipM;
173     PL_MemShared = ipMS;
174     PL_MemParse = ipMP;
175     PL_Env = ipE;
176     PL_StdIO = ipStd;
177     PL_LIO = ipLIO;
178     PL_Dir = ipD;
179     PL_Sock = ipS;
180     PL_Proc = ipP;
181
182     return my_perl;
183 }
184 #else
185
186 /*
187 =head1 Embedding Functions
188
189 =for apidoc perl_alloc
190
191 Allocates a new Perl interpreter.  See L<perlembed>.
192
193 =cut
194 */
195
196 PerlInterpreter *
197 perl_alloc(void)
198 {
199     PerlInterpreter *my_perl;
200
201     /* Newx() needs interpreter, so call malloc() instead */
202     my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
203
204     S_init_tls_and_interp(my_perl);
205     return (PerlInterpreter *) ZeroD(my_perl, 1, PerlInterpreter);
206 }
207 #endif /* PERL_IMPLICIT_SYS */
208
209 /*
210 =for apidoc perl_construct
211
212 Initializes a new Perl interpreter.  See L<perlembed>.
213
214 =cut
215 */
216
217 void
218 perl_construct(pTHXx)
219 {
220     dVAR;
221     PERL_UNUSED_ARG(my_perl);
222 #ifdef MULTIPLICITY
223     init_interp();
224     PL_perl_destruct_level = 1;
225 #else
226    if (PL_perl_destruct_level > 0)
227        init_interp();
228 #endif
229    /* Init the real globals (and main thread)? */
230     if (!PL_linestr) {
231         PL_curcop = &PL_compiling;      /* needed by ckWARN, right away */
232
233         PL_linestr = NEWSV(65,79);
234         sv_upgrade(PL_linestr,SVt_PVIV);
235
236         if (!SvREADONLY(&PL_sv_undef)) {
237             /* set read-only and try to insure than we wont see REFCNT==0
238                very often */
239
240             SvREADONLY_on(&PL_sv_undef);
241             SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
242
243             sv_setpv(&PL_sv_no,PL_No);
244             /* value lookup in void context - happens to have the side effect
245                of caching the numeric forms.  */
246             SvIV(&PL_sv_no);
247             SvNV(&PL_sv_no);
248             SvREADONLY_on(&PL_sv_no);
249             SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
250
251             sv_setpv(&PL_sv_yes,PL_Yes);
252             SvIV(&PL_sv_yes);
253             SvNV(&PL_sv_yes);
254             SvREADONLY_on(&PL_sv_yes);
255             SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
256
257             SvREADONLY_on(&PL_sv_placeholder);
258             SvREFCNT(&PL_sv_placeholder) = (~(U32)0)/2;
259         }
260
261         PL_sighandlerp = (Sighandler_t) Perl_sighandler;
262         PL_pidstatus = newHV();
263     }
264
265     PL_rs = newSVpvn("\n", 1);
266
267     init_stacks();
268
269     init_ids();
270     PL_lex_state = LEX_NOTPARSING;
271
272     JMPENV_BOOTSTRAP;
273     STATUS_ALL_SUCCESS;
274
275     init_i18nl10n(1);
276     SET_NUMERIC_STANDARD();
277
278 #if defined(LOCAL_PATCH_COUNT)
279     PL_localpatches = local_patches;    /* For possible -v */
280 #endif
281
282 #ifdef HAVE_INTERP_INTERN
283     sys_intern_init();
284 #endif
285
286     PerlIO_init(aTHX);                  /* Hook to IO system */
287
288     PL_fdpid = newAV();                 /* for remembering popen pids by fd */
289     PL_modglobal = newHV();             /* pointers to per-interpreter module globals */
290     PL_errors = newSVpvn("",0);
291     sv_setpvn(PERL_DEBUG_PAD(0), "", 0);        /* For regex debugging. */
292     sv_setpvn(PERL_DEBUG_PAD(1), "", 0);        /* ext/re needs these */
293     sv_setpvn(PERL_DEBUG_PAD(2), "", 0);        /* even without DEBUGGING. */
294 #ifdef USE_ITHREADS
295     PL_regex_padav = newAV();
296     av_push(PL_regex_padav,(SV*)newAV());    /* First entry is an array of empty elements */
297     PL_regex_pad = AvARRAY(PL_regex_padav);
298 #endif
299 #ifdef USE_REENTRANT_API
300     Perl_reentrant_init(aTHX);
301 #endif
302
303     /* Note that strtab is a rather special HV.  Assumptions are made
304        about not iterating on it, and not adding tie magic to it.
305        It is properly deallocated in perl_destruct() */
306     PL_strtab = newHV();
307
308     HvSHAREKEYS_off(PL_strtab);                 /* mandatory */
309     hv_ksplit(PL_strtab, 512);
310
311 #if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
312     _dyld_lookup_and_bind
313         ("__environ", (unsigned long *) &environ_pointer, NULL);
314 #endif /* environ */
315
316 #ifndef PERL_MICRO
317 #   ifdef  USE_ENVIRON_ARRAY
318     PL_origenviron = environ;
319 #   endif
320 #endif
321
322     /* Use sysconf(_SC_CLK_TCK) if available, if not
323      * available or if the sysconf() fails, use the HZ.
324      * BeOS has those, but returns the wrong value.
325      * The HZ if not originally defined has been by now
326      * been defined as CLK_TCK, if available. */
327 #if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK) && !defined(__BEOS__)
328     PL_clocktick = sysconf(_SC_CLK_TCK);
329     if (PL_clocktick <= 0)
330 #endif
331          PL_clocktick = HZ;
332
333     PL_stashcache = newHV();
334
335     PL_patchlevel = Perl_newSVpvf(aTHX_ "%d.%d.%d", (int)PERL_REVISION,
336                                   (int)PERL_VERSION, (int)PERL_SUBVERSION);
337
338 #ifdef HAS_MMAP
339     if (!PL_mmap_page_size) {
340 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_MMAP_PAGE_SIZE))
341       {
342         SETERRNO(0, SS_NORMAL);
343 #   ifdef _SC_PAGESIZE
344         PL_mmap_page_size = sysconf(_SC_PAGESIZE);
345 #   else
346         PL_mmap_page_size = sysconf(_SC_MMAP_PAGE_SIZE);
347 #   endif
348         if ((long) PL_mmap_page_size < 0) {
349           if (errno) {
350             SV *error = ERRSV;
351             (void) SvUPGRADE(error, SVt_PV);
352             Perl_croak(aTHX_ "panic: sysconf: %s", SvPV_nolen_const(error));
353           }
354           else
355             Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
356         }
357       }
358 #else
359 #   ifdef HAS_GETPAGESIZE
360       PL_mmap_page_size = getpagesize();
361 #   else
362 #       if defined(I_SYS_PARAM) && defined(PAGESIZE)
363       PL_mmap_page_size = PAGESIZE;       /* compiletime, bad */
364 #       endif
365 #   endif
366 #endif
367       if (PL_mmap_page_size <= 0)
368         Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
369                    (IV) PL_mmap_page_size);
370     }
371 #endif /* HAS_MMAP */
372
373 #if defined(HAS_TIMES) && defined(PERL_NEED_TIMESBASE)
374     PL_timesbase.tms_utime  = 0;
375     PL_timesbase.tms_stime  = 0;
376     PL_timesbase.tms_cutime = 0;
377     PL_timesbase.tms_cstime = 0;
378 #endif
379
380     ENTER;
381 }
382
383 /*
384 =for apidoc nothreadhook
385
386 Stub that provides thread hook for perl_destruct when there are
387 no threads.
388
389 =cut
390 */
391
392 int
393 Perl_nothreadhook(pTHX)
394 {
395     return 0;
396 }
397
398 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
399 void
400 Perl_dump_sv_child(pTHX_ SV *sv)
401 {
402     ssize_t got;
403     const int sock = PL_dumper_fd;
404     const int debug_fd = PerlIO_fileno(Perl_debug_log);
405     union control_un control;
406     struct msghdr msg;
407     struct iovec vec[2];
408     struct cmsghdr *cmptr;
409     int returned_errno;
410     unsigned char buffer[256];
411
412     if(sock == -1 || debug_fd == -1)
413         return;
414
415     PerlIO_flush(Perl_debug_log);
416
417     /* All these shenanigans are to pass a file descriptor over to our child for
418        it to dump out to.  We can't let it hold open the file descriptor when it
419        forks, as the file descriptor it will dump to can turn out to be one end
420        of pipe that some other process will wait on for EOF. (So as it would
421        be open, the wait would be forever.  */
422
423     msg.msg_control = control.control;
424     msg.msg_controllen = sizeof(control.control);
425     /* We're a connected socket so we don't need a destination  */
426     msg.msg_name = NULL;
427     msg.msg_namelen = 0;
428     msg.msg_iov = vec;
429     msg.msg_iovlen = 1;
430
431     cmptr = CMSG_FIRSTHDR(&msg);
432     cmptr->cmsg_len = CMSG_LEN(sizeof(int));
433     cmptr->cmsg_level = SOL_SOCKET;
434     cmptr->cmsg_type = SCM_RIGHTS;
435     *((int *)CMSG_DATA(cmptr)) = 1;
436
437     vec[0].iov_base = (void*)&sv;
438     vec[0].iov_len = sizeof(sv);
439     got = sendmsg(sock, &msg, 0);
440
441     if(got < 0) {
442         perror("Debug leaking scalars parent sendmsg failed");
443         abort();
444     }
445     if(got < sizeof(sv)) {
446         perror("Debug leaking scalars parent short sendmsg");
447         abort();
448     }
449
450     /* Return protocol is
451        int:             errno value
452        unsigned char:   length of location string (0 for empty)
453        unsigned char*:  string (not terminated)
454     */
455     vec[0].iov_base = (void*)&returned_errno;
456     vec[0].iov_len = sizeof(returned_errno);
457     vec[1].iov_base = buffer;
458     vec[1].iov_len = 1;
459
460     got = readv(sock, vec, 2);
461
462     if(got < 0) {
463         perror("Debug leaking scalars parent read failed");
464         PerlIO_flush(PerlIO_stderr());
465         abort();
466     }
467     if(got < sizeof(returned_errno) + 1) {
468         perror("Debug leaking scalars parent short read");
469         PerlIO_flush(PerlIO_stderr());
470         abort();
471     }
472
473     if (*buffer) {
474         got = read(sock, buffer + 1, *buffer);
475         if(got < 0) {
476             perror("Debug leaking scalars parent read 2 failed");
477             PerlIO_flush(PerlIO_stderr());
478             abort();
479         }
480
481         if(got < *buffer) {
482             perror("Debug leaking scalars parent short read 2");
483             PerlIO_flush(PerlIO_stderr());
484             abort();
485         }
486     }
487
488     if (returned_errno || *buffer) {
489         Perl_warn(aTHX_ "Debug leaking scalars child failed%s%.*s with errno"
490                   " %d: %s", (*buffer ? " at " : ""), (int) *buffer, buffer + 1,
491                   returned_errno, strerror(returned_errno));
492     }
493 }
494 #endif
495
496 /*
497 =for apidoc perl_destruct
498
499 Shuts down a Perl interpreter.  See L<perlembed>.
500
501 =cut
502 */
503
504 int
505 perl_destruct(pTHXx)
506 {
507     dVAR;
508     volatile int destruct_level;  /* 0=none, 1=full, 2=full with checks */
509     HV *hv;
510 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
511     pid_t child;
512 #endif
513
514     PERL_UNUSED_ARG(my_perl);
515
516     /* wait for all pseudo-forked children to finish */
517     PERL_WAIT_FOR_CHILDREN;
518
519     destruct_level = PL_perl_destruct_level;
520 #ifdef DEBUGGING
521     {
522         const char * const s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL");
523         if (s) {
524             const int i = atoi(s);
525             if (destruct_level < i)
526                 destruct_level = i;
527         }
528     }
529 #endif
530
531     if (PL_exit_flags & PERL_EXIT_DESTRUCT_END) {
532         dJMPENV;
533         int x = 0;
534
535         JMPENV_PUSH(x);
536         PERL_UNUSED_VAR(x);
537         if (PL_endav && !PL_minus_c)
538             call_list(PL_scopestack_ix, PL_endav);
539         JMPENV_POP;
540     }
541     LEAVE;
542     FREETMPS;
543
544     /* Need to flush since END blocks can produce output */
545     my_fflush_all();
546
547     if (CALL_FPTR(PL_threadhook)(aTHX)) {
548         /* Threads hook has vetoed further cleanup */
549         return STATUS_EXIT;
550     }
551
552 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
553     if (destruct_level != 0) {
554         /* Fork here to create a child. Our child's job is to preserve the
555            state of scalars prior to destruction, so that we can instruct it
556            to dump any scalars that we later find have leaked.
557            There's no subtlety in this code - it assumes POSIX, and it doesn't
558            fail gracefully  */
559         int fd[2];
560
561         if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) {
562             perror("Debug leaking scalars socketpair failed");
563             abort();
564         }
565
566         child = fork();
567         if(child == -1) {
568             perror("Debug leaking scalars fork failed");
569             abort();
570         }
571         if (!child) {
572             /* We are the child */
573             const int sock = fd[1];
574             const int debug_fd = PerlIO_fileno(Perl_debug_log);
575             int f;
576             const char *where;
577             /* Our success message is an integer 0, and a char 0  */
578             static const char success[sizeof(int) + 1];
579
580             close(fd[0]);
581
582             /* We need to close all other file descriptors otherwise we end up
583                with interesting hangs, where the parent closes its end of a
584                pipe, and sits waiting for (another) child to terminate. Only
585                that child never terminates, because it never gets EOF, because
586                we also have the far end of the pipe open.  We even need to
587                close the debugging fd, because sometimes it happens to be one
588                end of a pipe, and a process is waiting on the other end for
589                EOF. Normally it would be closed at some point earlier in
590                destruction, but if we happen to cause the pipe to remain open,
591                EOF never occurs, and we get an infinite hang. Hence all the
592                games to pass in a file descriptor if it's actually needed.  */
593
594             f = sysconf(_SC_OPEN_MAX);
595             if(f < 0) {
596                 where = "sysconf failed";
597                 goto abort;
598             }
599             while (f--) {
600                 if (f == sock)
601                     continue;
602                 close(f);
603             }
604
605             while (1) {
606                 SV *target;
607                 union control_un control;
608                 struct msghdr msg;
609                 struct iovec vec[1];
610                 struct cmsghdr *cmptr;
611                 ssize_t got;
612                 int got_fd;
613
614                 msg.msg_control = control.control;
615                 msg.msg_controllen = sizeof(control.control);
616                 /* We're a connected socket so we don't need a source  */
617                 msg.msg_name = NULL;
618                 msg.msg_namelen = 0;
619                 msg.msg_iov = vec;
620                 msg.msg_iovlen = sizeof(vec)/sizeof(vec[0]);
621
622                 vec[0].iov_base = (void*)&target;
623                 vec[0].iov_len = sizeof(target);
624       
625                 got = recvmsg(sock, &msg, 0);
626
627                 if(got == 0)
628                     break;
629                 if(got < 0) {
630                     where = "recv failed";
631                     goto abort;
632                 }
633                 if(got < sizeof(target)) {
634                     where = "short recv";
635                     goto abort;
636                 }
637
638                 if(!(cmptr = CMSG_FIRSTHDR(&msg))) {
639                     where = "no cmsg";
640                     goto abort;
641                 }
642                 if(cmptr->cmsg_len != CMSG_LEN(sizeof(int))) {
643                     where = "wrong cmsg_len";
644                     goto abort;
645                 }
646                 if(cmptr->cmsg_level != SOL_SOCKET) {
647                     where = "wrong cmsg_level";
648                     goto abort;
649                 }
650                 if(cmptr->cmsg_type != SCM_RIGHTS) {
651                     where = "wrong cmsg_type";
652                     goto abort;
653                 }
654
655                 got_fd = *(int*)CMSG_DATA(cmptr);
656                 /* For our last little bit of trickery, put the file descriptor
657                    back into Perl_debug_log, as if we never actually closed it
658                 */
659                 if(got_fd != debug_fd) {
660                     if (dup2(got_fd, debug_fd) == -1) {
661                         where = "dup2";
662                         goto abort;
663                     }
664                 }
665                 sv_dump(target);
666
667                 PerlIO_flush(Perl_debug_log);
668
669                 got = write(sock, &success, sizeof(success));
670
671                 if(got < 0) {
672                     where = "write failed";
673                     goto abort;
674                 }
675                 if(got < sizeof(success)) {
676                     where = "short write";
677                     goto abort;
678                 }
679             }
680             _exit(0);
681         abort:
682             {
683                 int send_errno = errno;
684                 unsigned char length = (unsigned char) strlen(where);
685                 struct iovec failure[3] = {
686                     {(void*)&send_errno, sizeof(send_errno)},
687                     {&length, 1},
688                     {(void*)where, length}
689                 };
690                 int got = writev(sock, failure, 3);
691                 /* Bad news travels fast. Faster than data. We'll get a SIGPIPE
692                    in the parent if we try to read from the socketpair after the
693                    child has exited, even if there was data to read.
694                    So sleep a bit to give the parent a fighting chance of
695                    reading the data.  */
696                 sleep(2);
697                 _exit((got == -1) ? errno : 0);
698             }
699             /* End of child.  */
700         }
701         PL_dumper_fd = fd[0];
702         close(fd[1]);
703     }
704 #endif
705     
706     /* We must account for everything.  */
707
708     /* Destroy the main CV and syntax tree */
709     /* Do this now, because destroying ops can cause new SVs to be generated
710        in Perl_pad_swipe, and when running with -DDEBUG_LEAKING_SCALARS they
711        PL_curcop to point to a valid op from which the filename structure
712        member is copied.  */
713     PL_curcop = &PL_compiling;
714     if (PL_main_root) {
715         /* ensure comppad/curpad to refer to main's pad */
716         if (CvPADLIST(PL_main_cv)) {
717             PAD_SET_CUR_NOSAVE(CvPADLIST(PL_main_cv), 1);
718         }
719         op_free(PL_main_root);
720         PL_main_root = Nullop;
721     }
722     PL_main_start = Nullop;
723     SvREFCNT_dec(PL_main_cv);
724     PL_main_cv = Nullcv;
725     PL_dirty = TRUE;
726
727     /* Tell PerlIO we are about to tear things apart in case
728        we have layers which are using resources that should
729        be cleaned up now.
730      */
731
732     PerlIO_destruct(aTHX);
733
734     if (PL_sv_objcount) {
735         /*
736          * Try to destruct global references.  We do this first so that the
737          * destructors and destructees still exist.  Some sv's might remain.
738          * Non-referenced objects are on their own.
739          */
740         sv_clean_objs();
741         PL_sv_objcount = 0;
742         if (PL_defoutgv && !SvREFCNT(PL_defoutgv))
743             PL_defoutgv = Nullgv; /* may have been freed */
744     }
745
746     /* unhook hooks which will soon be, or use, destroyed data */
747     SvREFCNT_dec(PL_warnhook);
748     PL_warnhook = Nullsv;
749     SvREFCNT_dec(PL_diehook);
750     PL_diehook = Nullsv;
751
752     /* call exit list functions */
753     while (PL_exitlistlen-- > 0)
754         PL_exitlist[PL_exitlistlen].fn(aTHX_ PL_exitlist[PL_exitlistlen].ptr);
755
756     Safefree(PL_exitlist);
757
758     PL_exitlist = NULL;
759     PL_exitlistlen = 0;
760
761     if (destruct_level == 0){
762
763         DEBUG_P(debprofdump());
764
765 #if defined(PERLIO_LAYERS)
766         /* No more IO - including error messages ! */
767         PerlIO_cleanup(aTHX);
768 #endif
769
770         /* The exit() function will do everything that needs doing. */
771         return STATUS_EXIT;
772     }
773
774     /* jettison our possibly duplicated environment */
775     /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied
776      * so we certainly shouldn't free it here
777      */
778 #ifndef PERL_MICRO
779 #if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV)
780     if (environ != PL_origenviron && !PL_use_safe_putenv
781 #ifdef USE_ITHREADS
782         /* only main thread can free environ[0] contents */
783         && PL_curinterp == aTHX
784 #endif
785         )
786     {
787         I32 i;
788
789         for (i = 0; environ[i]; i++)
790             safesysfree(environ[i]);
791
792         /* Must use safesysfree() when working with environ. */
793         safesysfree(environ);           
794
795         environ = PL_origenviron;
796     }
797 #endif
798 #endif /* !PERL_MICRO */
799
800     /* reset so print() ends up where we expect */
801     setdefout(Nullgv);
802
803 #ifdef USE_ITHREADS
804     /* the syntax tree is shared between clones
805      * so op_free(PL_main_root) only ReREFCNT_dec's
806      * REGEXPs in the parent interpreter
807      * we need to manually ReREFCNT_dec for the clones
808      */
809     {
810         I32 i = AvFILLp(PL_regex_padav) + 1;
811         SV **ary = AvARRAY(PL_regex_padav);
812
813         while (i) {
814             SV *resv = ary[--i];
815
816             if (SvFLAGS(resv) & SVf_BREAK) {
817                 /* this is PL_reg_curpm, already freed
818                  * flag is set in regexec.c:S_regtry
819                  */
820                 SvFLAGS(resv) &= ~SVf_BREAK;
821             }
822             else if(SvREPADTMP(resv)) {
823               SvREPADTMP_off(resv);
824             }
825             else if(SvIOKp(resv)) {
826                 REGEXP *re = INT2PTR(REGEXP *,SvIVX(resv));
827                 ReREFCNT_dec(re);
828             }
829         }
830     }
831     SvREFCNT_dec(PL_regex_padav);
832     PL_regex_padav = Nullav;
833     PL_regex_pad = NULL;
834 #endif
835
836     SvREFCNT_dec((SV*) PL_stashcache);
837     PL_stashcache = NULL;
838
839     /* loosen bonds of global variables */
840
841     if(PL_rsfp) {
842         (void)PerlIO_close(PL_rsfp);
843         PL_rsfp = Nullfp;
844     }
845
846     /* Filters for program text */
847     SvREFCNT_dec(PL_rsfp_filters);
848     PL_rsfp_filters = Nullav;
849
850     /* switches */
851     PL_preprocess   = FALSE;
852     PL_minus_n      = FALSE;
853     PL_minus_p      = FALSE;
854     PL_minus_l      = FALSE;
855     PL_minus_a      = FALSE;
856     PL_minus_F      = FALSE;
857     PL_doswitches   = FALSE;
858     PL_dowarn       = G_WARN_OFF;
859     PL_doextract    = FALSE;
860     PL_sawampersand = FALSE;    /* must save all match strings */
861     PL_unsafe       = FALSE;
862
863     Safefree(PL_inplace);
864     PL_inplace = Nullch;
865     SvREFCNT_dec(PL_patchlevel);
866
867     if (PL_e_script) {
868         SvREFCNT_dec(PL_e_script);
869         PL_e_script = Nullsv;
870     }
871
872     PL_perldb = 0;
873
874     /* magical thingies */
875
876     SvREFCNT_dec(PL_ofs_sv);    /* $, */
877     PL_ofs_sv = Nullsv;
878
879     SvREFCNT_dec(PL_ors_sv);    /* $\ */
880     PL_ors_sv = Nullsv;
881
882     SvREFCNT_dec(PL_rs);        /* $/ */
883     PL_rs = Nullsv;
884
885     PL_multiline = 0;           /* $* */
886     Safefree(PL_osname);        /* $^O */
887     PL_osname = Nullch;
888
889     SvREFCNT_dec(PL_statname);
890     PL_statname = Nullsv;
891     PL_statgv = Nullgv;
892
893     /* defgv, aka *_ should be taken care of elsewhere */
894
895     /* clean up after study() */
896     SvREFCNT_dec(PL_lastscream);
897     PL_lastscream = Nullsv;
898     Safefree(PL_screamfirst);
899     PL_screamfirst = 0;
900     Safefree(PL_screamnext);
901     PL_screamnext  = 0;
902
903     /* float buffer */
904     Safefree(PL_efloatbuf);
905     PL_efloatbuf = Nullch;
906     PL_efloatsize = 0;
907
908     /* startup and shutdown function lists */
909     SvREFCNT_dec(PL_beginav);
910     SvREFCNT_dec(PL_beginav_save);
911     SvREFCNT_dec(PL_endav);
912     SvREFCNT_dec(PL_checkav);
913     SvREFCNT_dec(PL_checkav_save);
914     SvREFCNT_dec(PL_initav);
915     PL_beginav = Nullav;
916     PL_beginav_save = Nullav;
917     PL_endav = Nullav;
918     PL_checkav = Nullav;
919     PL_checkav_save = Nullav;
920     PL_initav = Nullav;
921
922     /* shortcuts just get cleared */
923     PL_envgv = Nullgv;
924     PL_incgv = Nullgv;
925     PL_hintgv = Nullgv;
926     PL_errgv = Nullgv;
927     PL_argvgv = Nullgv;
928     PL_argvoutgv = Nullgv;
929     PL_stdingv = Nullgv;
930     PL_stderrgv = Nullgv;
931     PL_last_in_gv = Nullgv;
932     PL_replgv = Nullgv;
933     PL_DBgv = Nullgv;
934     PL_DBline = Nullgv;
935     PL_DBsub = Nullgv;
936     PL_DBsingle = Nullsv;
937     PL_DBtrace = Nullsv;
938     PL_DBsignal = Nullsv;
939     PL_DBassertion = Nullsv;
940     PL_DBcv = Nullcv;
941     PL_dbargs = Nullav;
942     PL_debstash = Nullhv;
943
944     SvREFCNT_dec(PL_argvout_stack);
945     PL_argvout_stack = Nullav;
946
947     SvREFCNT_dec(PL_modglobal);
948     PL_modglobal = Nullhv;
949     SvREFCNT_dec(PL_preambleav);
950     PL_preambleav = Nullav;
951     SvREFCNT_dec(PL_subname);
952     PL_subname = Nullsv;
953     SvREFCNT_dec(PL_linestr);
954     PL_linestr = Nullsv;
955     SvREFCNT_dec(PL_pidstatus);
956     PL_pidstatus = Nullhv;
957     SvREFCNT_dec(PL_toptarget);
958     PL_toptarget = Nullsv;
959     SvREFCNT_dec(PL_bodytarget);
960     PL_bodytarget = Nullsv;
961     PL_formtarget = Nullsv;
962
963     /* free locale stuff */
964 #ifdef USE_LOCALE_COLLATE
965     Safefree(PL_collation_name);
966     PL_collation_name = Nullch;
967 #endif
968
969 #ifdef USE_LOCALE_NUMERIC
970     Safefree(PL_numeric_name);
971     PL_numeric_name = Nullch;
972     SvREFCNT_dec(PL_numeric_radix_sv);
973     PL_numeric_radix_sv = Nullsv;
974 #endif
975
976     /* clear utf8 character classes */
977     SvREFCNT_dec(PL_utf8_alnum);
978     SvREFCNT_dec(PL_utf8_alnumc);
979     SvREFCNT_dec(PL_utf8_ascii);
980     SvREFCNT_dec(PL_utf8_alpha);
981     SvREFCNT_dec(PL_utf8_space);
982     SvREFCNT_dec(PL_utf8_cntrl);
983     SvREFCNT_dec(PL_utf8_graph);
984     SvREFCNT_dec(PL_utf8_digit);
985     SvREFCNT_dec(PL_utf8_upper);
986     SvREFCNT_dec(PL_utf8_lower);
987     SvREFCNT_dec(PL_utf8_print);
988     SvREFCNT_dec(PL_utf8_punct);
989     SvREFCNT_dec(PL_utf8_xdigit);
990     SvREFCNT_dec(PL_utf8_mark);
991     SvREFCNT_dec(PL_utf8_toupper);
992     SvREFCNT_dec(PL_utf8_totitle);
993     SvREFCNT_dec(PL_utf8_tolower);
994     SvREFCNT_dec(PL_utf8_tofold);
995     SvREFCNT_dec(PL_utf8_idstart);
996     SvREFCNT_dec(PL_utf8_idcont);
997     PL_utf8_alnum       = Nullsv;
998     PL_utf8_alnumc      = Nullsv;
999     PL_utf8_ascii       = Nullsv;
1000     PL_utf8_alpha       = Nullsv;
1001     PL_utf8_space       = Nullsv;
1002     PL_utf8_cntrl       = Nullsv;
1003     PL_utf8_graph       = Nullsv;
1004     PL_utf8_digit       = Nullsv;
1005     PL_utf8_upper       = Nullsv;
1006     PL_utf8_lower       = Nullsv;
1007     PL_utf8_print       = Nullsv;
1008     PL_utf8_punct       = Nullsv;
1009     PL_utf8_xdigit      = Nullsv;
1010     PL_utf8_mark        = Nullsv;
1011     PL_utf8_toupper     = Nullsv;
1012     PL_utf8_totitle     = Nullsv;
1013     PL_utf8_tolower     = Nullsv;
1014     PL_utf8_tofold      = Nullsv;
1015     PL_utf8_idstart     = Nullsv;
1016     PL_utf8_idcont      = Nullsv;
1017
1018     if (!specialWARN(PL_compiling.cop_warnings))
1019         SvREFCNT_dec(PL_compiling.cop_warnings);
1020     PL_compiling.cop_warnings = Nullsv;
1021     if (!specialCopIO(PL_compiling.cop_io))
1022         SvREFCNT_dec(PL_compiling.cop_io);
1023     PL_compiling.cop_io = Nullsv;
1024     CopFILE_free(&PL_compiling);
1025     CopSTASH_free(&PL_compiling);
1026
1027     /* Prepare to destruct main symbol table.  */
1028
1029     hv = PL_defstash;
1030     PL_defstash = 0;
1031     SvREFCNT_dec(hv);
1032     SvREFCNT_dec(PL_curstname);
1033     PL_curstname = Nullsv;
1034
1035     /* clear queued errors */
1036     SvREFCNT_dec(PL_errors);
1037     PL_errors = Nullsv;
1038
1039     FREETMPS;
1040     if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
1041         if (PL_scopestack_ix != 0)
1042             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
1043                  "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
1044                  (long)PL_scopestack_ix);
1045         if (PL_savestack_ix != 0)
1046             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
1047                  "Unbalanced saves: %ld more saves than restores\n",
1048                  (long)PL_savestack_ix);
1049         if (PL_tmps_floor != -1)
1050             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced tmps: %ld more allocs than frees\n",
1051                  (long)PL_tmps_floor + 1);
1052         if (cxstack_ix != -1)
1053             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced context: %ld more PUSHes than POPs\n",
1054                  (long)cxstack_ix + 1);
1055     }
1056
1057     /* Now absolutely destruct everything, somehow or other, loops or no. */
1058     SvFLAGS(PL_fdpid) |= SVTYPEMASK;            /* don't clean out pid table now */
1059     SvFLAGS(PL_strtab) |= SVTYPEMASK;           /* don't clean out strtab now */
1060
1061     /* the 2 is for PL_fdpid and PL_strtab */
1062     while (PL_sv_count > 2 && sv_clean_all())
1063         ;
1064
1065     SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
1066     SvFLAGS(PL_fdpid) |= SVt_PVAV;
1067     SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
1068     SvFLAGS(PL_strtab) |= SVt_PVHV;
1069
1070     AvREAL_off(PL_fdpid);               /* no surviving entries */
1071     SvREFCNT_dec(PL_fdpid);             /* needed in io_close() */
1072     PL_fdpid = Nullav;
1073
1074 #ifdef HAVE_INTERP_INTERN
1075     sys_intern_clear();
1076 #endif
1077
1078     /* Destruct the global string table. */
1079     {
1080         /* Yell and reset the HeVAL() slots that are still holding refcounts,
1081          * so that sv_free() won't fail on them.
1082          * Now that the global string table is using a single hunk of memory
1083          * for both HE and HEK, we either need to explicitly unshare it the
1084          * correct way, or actually free things here.
1085          */
1086         I32 riter = 0;
1087         const I32 max = HvMAX(PL_strtab);
1088         HE **array = HvARRAY(PL_strtab);
1089         HE *hent = array[0];
1090
1091         for (;;) {
1092             if (hent && ckWARN_d(WARN_INTERNAL)) {
1093                 HE *next = HeNEXT(hent);
1094                 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
1095                      "Unbalanced string table refcount: (%d) for \"%s\"",
1096                      HeVAL(hent) - Nullsv, HeKEY(hent));
1097                 Safefree(hent);
1098                 hent = next;
1099             }
1100             if (!hent) {
1101                 if (++riter > max)
1102                     break;
1103                 hent = array[riter];
1104             }
1105         }
1106
1107         Safefree(array);
1108         HvARRAY(PL_strtab) = 0;
1109         HvTOTALKEYS(PL_strtab) = 0;
1110         HvFILL(PL_strtab) = 0;
1111     }
1112     SvREFCNT_dec(PL_strtab);
1113
1114 #ifdef USE_ITHREADS
1115     /* free the pointer tables used for cloning */
1116     ptr_table_free(PL_ptr_table);
1117     PL_ptr_table = (PTR_TBL_t*)NULL;
1118 #endif
1119
1120     /* free special SVs */
1121
1122     SvREFCNT(&PL_sv_yes) = 0;
1123     sv_clear(&PL_sv_yes);
1124     SvANY(&PL_sv_yes) = NULL;
1125     SvFLAGS(&PL_sv_yes) = 0;
1126
1127     SvREFCNT(&PL_sv_no) = 0;
1128     sv_clear(&PL_sv_no);
1129     SvANY(&PL_sv_no) = NULL;
1130     SvFLAGS(&PL_sv_no) = 0;
1131
1132     {
1133         int i;
1134         for (i=0; i<=2; i++) {
1135             SvREFCNT(PERL_DEBUG_PAD(i)) = 0;
1136             sv_clear(PERL_DEBUG_PAD(i));
1137             SvANY(PERL_DEBUG_PAD(i)) = NULL;
1138             SvFLAGS(PERL_DEBUG_PAD(i)) = 0;
1139         }
1140     }
1141
1142     if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
1143         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Scalars leaked: %ld\n", (long)PL_sv_count);
1144
1145 #ifdef DEBUG_LEAKING_SCALARS
1146     if (PL_sv_count != 0) {
1147         SV* sva;
1148         SV* sv;
1149         register SV* svend;
1150
1151         for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
1152             svend = &sva[SvREFCNT(sva)];
1153             for (sv = sva + 1; sv < svend; ++sv) {
1154                 if (SvTYPE(sv) != SVTYPEMASK) {
1155                     PerlIO_printf(Perl_debug_log, "leaked: sv=0x%p"
1156                         " flags=0x%"UVxf
1157                         " refcnt=%"UVuf pTHX__FORMAT "\n"
1158                         "\tallocated at %s:%d %s %s%s\n",
1159                         sv, sv->sv_flags, sv->sv_refcnt pTHX__VALUE,
1160                         sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1161                         sv->sv_debug_line,
1162                         sv->sv_debug_inpad ? "for" : "by",
1163                         sv->sv_debug_optype ?
1164                             PL_op_name[sv->sv_debug_optype]: "(none)",
1165                         sv->sv_debug_cloned ? " (cloned)" : ""
1166                     );
1167 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1168                     Perl_dump_sv_child(aTHX_ sv);
1169 #endif
1170                 }
1171             }
1172         }
1173     }
1174 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1175     {
1176         int status;
1177         fd_set rset;
1178         /* Wait for up to 4 seconds for child to terminate.
1179            This seems to be the least effort way of timing out on reaping
1180            its exit status.  */
1181         struct timeval waitfor = {4, 0};
1182         int sock = PL_dumper_fd;
1183
1184         shutdown(sock, 1);
1185         FD_ZERO(&rset);
1186         FD_SET(sock, &rset);
1187         select(sock + 1, &rset, NULL, NULL, &waitfor);
1188         waitpid(child, &status, WNOHANG);
1189         close(sock);
1190     }
1191 #endif
1192 #endif
1193     PL_sv_count = 0;
1194
1195
1196 #if defined(PERLIO_LAYERS)
1197     /* No more IO - including error messages ! */
1198     PerlIO_cleanup(aTHX);
1199 #endif
1200
1201     /* sv_undef needs to stay immortal until after PerlIO_cleanup
1202        as currently layers use it rather than Nullsv as a marker
1203        for no arg - and will try and SvREFCNT_dec it.
1204      */
1205     SvREFCNT(&PL_sv_undef) = 0;
1206     SvREADONLY_off(&PL_sv_undef);
1207
1208     Safefree(PL_origfilename);
1209     PL_origfilename = Nullch;
1210     Safefree(PL_reg_start_tmp);
1211     PL_reg_start_tmp = (char**)NULL;
1212     PL_reg_start_tmpl = 0;
1213     Safefree(PL_reg_curpm);
1214     Safefree(PL_reg_poscache);
1215     free_tied_hv_pool();
1216     Safefree(PL_op_mask);
1217     Safefree(PL_psig_ptr);
1218     PL_psig_ptr = (SV**)NULL;
1219     Safefree(PL_psig_name);
1220     PL_psig_name = (SV**)NULL;
1221     Safefree(PL_bitcount);
1222     PL_bitcount = Nullch;
1223     Safefree(PL_psig_pend);
1224     PL_psig_pend = (int*)NULL;
1225     PL_formfeed = Nullsv;
1226     nuke_stacks();
1227     PL_tainting = FALSE;
1228     PL_taint_warn = FALSE;
1229     PL_hints = 0;               /* Reset hints. Should hints be per-interpreter ? */
1230     PL_debug = 0;
1231
1232     DEBUG_P(debprofdump());
1233
1234 #ifdef USE_REENTRANT_API
1235     Perl_reentrant_free(aTHX);
1236 #endif
1237
1238     sv_free_arenas();
1239
1240     /* As the absolutely last thing, free the non-arena SV for mess() */
1241
1242     if (PL_mess_sv) {
1243         /* we know that type == SVt_PVMG */
1244
1245         /* it could have accumulated taint magic */
1246         MAGIC* mg;
1247         MAGIC* moremagic;
1248         for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
1249             moremagic = mg->mg_moremagic;
1250             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global
1251                 && mg->mg_len >= 0)
1252                 Safefree(mg->mg_ptr);
1253             Safefree(mg);
1254         }
1255
1256         /* we know that type >= SVt_PV */
1257         SvPV_free(PL_mess_sv);
1258         Safefree(SvANY(PL_mess_sv));
1259         Safefree(PL_mess_sv);
1260         PL_mess_sv = Nullsv;
1261     }
1262     return STATUS_EXIT;
1263 }
1264
1265 /*
1266 =for apidoc perl_free
1267
1268 Releases a Perl interpreter.  See L<perlembed>.
1269
1270 =cut
1271 */
1272
1273 void
1274 perl_free(pTHXx)
1275 {
1276 #if defined(WIN32) || defined(NETWARE)
1277 #  if defined(PERL_IMPLICIT_SYS)
1278 #    ifdef NETWARE
1279     void *host = nw_internal_host;
1280 #    else
1281     void *host = w32_internal_host;
1282 #    endif
1283     PerlMem_free(aTHXx);
1284 #    ifdef NETWARE
1285     nw_delete_internal_host(host);
1286 #    else
1287     win32_delete_internal_host(host);
1288 #    endif
1289 #  else
1290     PerlMem_free(aTHXx);
1291 #  endif
1292 #else
1293     PerlMem_free(aTHXx);
1294 #endif
1295 }
1296
1297 #if defined(USE_5005THREADS) || defined(USE_ITHREADS)
1298 /* provide destructors to clean up the thread key when libperl is unloaded */
1299 #ifndef WIN32 /* handled during DLL_PROCESS_DETACH in win32/perllib.c */
1300
1301 #if defined(__hpux) && __ux_version > 1020 && !defined(__GNUC__)
1302 #pragma fini "perl_fini"
1303 #endif
1304
1305 static void
1306 #if defined(__GNUC__)
1307 __attribute__((destructor))
1308 #endif
1309 perl_fini(void)
1310 {
1311     dVAR;
1312     if (PL_curinterp)
1313         FREE_THREAD_KEY;
1314 }
1315
1316 #endif /* WIN32 */
1317 #endif /* THREADS */
1318
1319 void
1320 Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
1321 {
1322     Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
1323     PL_exitlist[PL_exitlistlen].fn = fn;
1324     PL_exitlist[PL_exitlistlen].ptr = ptr;
1325     ++PL_exitlistlen;
1326 }
1327
1328 #ifdef HAS_PROCSELFEXE
1329 /* This is a function so that we don't hold on to MAXPATHLEN
1330    bytes of stack longer than necessary
1331  */
1332 STATIC void
1333 S_procself_val(pTHX_ SV *sv, const char *arg0)
1334 {
1335     char buf[MAXPATHLEN];
1336     int len = readlink(PROCSELFEXE_PATH, buf, sizeof(buf) - 1);
1337
1338     /* On Playstation2 Linux V1.0 (kernel 2.2.1) readlink(/proc/self/exe)
1339        includes a spurious NUL which will cause $^X to fail in system
1340        or backticks (this will prevent extensions from being built and
1341        many tests from working). readlink is not meant to add a NUL.
1342        Normal readlink works fine.
1343      */
1344     if (len > 0 && buf[len-1] == '\0') {
1345       len--;
1346     }
1347
1348     /* FreeBSD's implementation is acknowledged to be imperfect, sometimes
1349        returning the text "unknown" from the readlink rather than the path
1350        to the executable (or returning an error from the readlink).  Any valid
1351        path has a '/' in it somewhere, so use that to validate the result.
1352        See http://www.freebsd.org/cgi/query-pr.cgi?pr=35703
1353     */
1354     if (len > 0 && memchr(buf, '/', len)) {
1355         sv_setpvn(sv,buf,len);
1356     }
1357     else {
1358         sv_setpv(sv,arg0);
1359     }
1360 }
1361 #endif /* HAS_PROCSELFEXE */
1362
1363 STATIC void
1364 S_set_caret_X(pTHX) {
1365     GV* tmpgv = gv_fetchpv("\030",TRUE, SVt_PV); /* $^X */
1366     if (tmpgv) {
1367 #ifdef HAS_PROCSELFEXE
1368         S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
1369 #else
1370 #ifdef OS2
1371         sv_setpv(GvSVn(tmpgv), os2_execname(aTHX));
1372 #else
1373         sv_setpv(GvSVn(tmpgv),PL_origargv[0]);
1374 #endif
1375 #endif
1376     }
1377 }
1378
1379 /*
1380 =for apidoc perl_parse
1381
1382 Tells a Perl interpreter to parse a Perl script.  See L<perlembed>.
1383
1384 =cut
1385 */
1386
1387 int
1388 perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
1389 {
1390     dVAR;
1391     I32 oldscope;
1392     int ret;
1393     dJMPENV;
1394
1395     PERL_UNUSED_VAR(my_perl);
1396
1397 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
1398 #ifdef IAMSUID
1399 #undef IAMSUID
1400     Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
1401 setuid perl scripts securely.\n");
1402 #endif /* IAMSUID */
1403 #endif
1404
1405 #if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT)
1406     /* [perl #22371] Algorimic Complexity Attack on Perl 5.6.1, 5.8.0
1407      * This MUST be done before any hash stores or fetches take place.
1408      * If you set PL_rehash_seed (and assumedly also PL_rehash_seed_set)
1409      * yourself, it is your responsibility to provide a good random seed!
1410      * You can also define PERL_HASH_SEED in compile time, see hv.h. */
1411     if (!PL_rehash_seed_set)
1412          PL_rehash_seed = get_hash_seed();
1413     {
1414         const char * const s = PerlEnv_getenv("PERL_HASH_SEED_DEBUG");
1415
1416         if (s && (atoi(s) == 1))
1417             PerlIO_printf(Perl_debug_log, "HASH_SEED = %"UVuf"\n", PL_rehash_seed);
1418     }
1419 #endif /* #if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT) */
1420
1421     PL_origargc = argc;
1422     PL_origargv = argv;
1423
1424     {
1425         /* Set PL_origalen be the sum of the contiguous argv[]
1426          * elements plus the size of the env in case that it is
1427          * contiguous with the argv[].  This is used in mg.c:Perl_magic_set()
1428          * as the maximum modifiable length of $0.  In the worst case
1429          * the area we are able to modify is limited to the size of
1430          * the original argv[0].  (See below for 'contiguous', though.)
1431          * --jhi */
1432          const char *s = NULL;
1433          int i;
1434          const UV mask =
1435            ~(UV)(PTRSIZE == 4 ? 3 : PTRSIZE == 8 ? 7 : PTRSIZE == 16 ? 15 : 0);
1436          /* Do the mask check only if the args seem like aligned. */
1437          const UV aligned =
1438            (mask < ~(UV)0) && ((PTR2UV(argv[0]) & mask) == PTR2UV(argv[0]));
1439
1440          /* See if all the arguments are contiguous in memory.  Note
1441           * that 'contiguous' is a loose term because some platforms
1442           * align the argv[] and the envp[].  If the arguments look
1443           * like non-aligned, assume that they are 'strictly' or
1444           * 'traditionally' contiguous.  If the arguments look like
1445           * aligned, we just check that they are within aligned
1446           * PTRSIZE bytes.  As long as no system has something bizarre
1447           * like the argv[] interleaved with some other data, we are
1448           * fine.  (Did I just evoke Murphy's Law?)  --jhi */
1449          if (PL_origargv && PL_origargc >= 1 && (s = PL_origargv[0])) {
1450               while (*s) s++;
1451               for (i = 1; i < PL_origargc; i++) {
1452                    if ((PL_origargv[i] == s + 1
1453 #ifdef OS2
1454                         || PL_origargv[i] == s + 2
1455 #endif 
1456                             )
1457                        ||
1458                        (aligned &&
1459                         (PL_origargv[i] >  s &&
1460                          PL_origargv[i] <=
1461                          INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1462                         )
1463                    {
1464                         s = PL_origargv[i];
1465                         while (*s) s++;
1466                    }
1467                    else
1468                         break;
1469               }
1470          }
1471          /* Can we grab env area too to be used as the area for $0? */
1472          if (PL_origenviron) {
1473               if ((PL_origenviron[0] == s + 1
1474 #ifdef OS2
1475                    || (PL_origenviron[0] == s + 9 && (s += 8))
1476 #endif 
1477                   )
1478                   ||
1479                   (aligned &&
1480                    (PL_origenviron[0] >  s &&
1481                     PL_origenviron[0] <=
1482                     INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1483                  )
1484               {
1485 #ifndef OS2
1486                    s = PL_origenviron[0];
1487                    while (*s) s++;
1488 #endif
1489                    my_setenv("NoNe  SuCh", Nullch);
1490                    /* Force copy of environment. */
1491                    for (i = 1; PL_origenviron[i]; i++) {
1492                         if (PL_origenviron[i] == s + 1
1493                             ||
1494                             (aligned &&
1495                              (PL_origenviron[i] >  s &&
1496                               PL_origenviron[i] <=
1497                               INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1498                            )
1499                         {
1500                              s = PL_origenviron[i];
1501                              while (*s) s++;
1502                         }
1503                         else
1504                              break;
1505                    }
1506               }
1507          }
1508          PL_origalen = s - PL_origargv[0] + 1;
1509     }
1510
1511     if (PL_do_undump) {
1512
1513         /* Come here if running an undumped a.out. */
1514
1515         PL_origfilename = savepv(argv[0]);
1516         PL_do_undump = FALSE;
1517         cxstack_ix = -1;                /* start label stack again */
1518         init_ids();
1519         assert (!PL_tainted);
1520         TAINT;
1521         S_set_caret_X(aTHX);
1522         TAINT_NOT;
1523         init_postdump_symbols(argc,argv,env);
1524         return 0;
1525     }
1526
1527     if (PL_main_root) {
1528         op_free(PL_main_root);
1529         PL_main_root = Nullop;
1530     }
1531     PL_main_start = Nullop;
1532     SvREFCNT_dec(PL_main_cv);
1533     PL_main_cv = Nullcv;
1534
1535     time(&PL_basetime);
1536     oldscope = PL_scopestack_ix;
1537     PL_dowarn = G_WARN_OFF;
1538
1539     JMPENV_PUSH(ret);
1540     switch (ret) {
1541     case 0:
1542         parse_body(env,xsinit);
1543         if (PL_checkav)
1544             call_list(oldscope, PL_checkav);
1545         ret = 0;
1546         break;
1547     case 1:
1548         STATUS_ALL_FAILURE;
1549         /* FALL THROUGH */
1550     case 2:
1551         /* my_exit() was called */
1552         while (PL_scopestack_ix > oldscope)
1553             LEAVE;
1554         FREETMPS;
1555         PL_curstash = PL_defstash;
1556         if (PL_checkav)
1557             call_list(oldscope, PL_checkav);
1558         ret = STATUS_EXIT;
1559         break;
1560     case 3:
1561         PerlIO_printf(Perl_error_log, "panic: top_env\n");
1562         ret = 1;
1563         break;
1564     }
1565     JMPENV_POP;
1566     return ret;
1567 }
1568
1569 STATIC void *
1570 S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
1571 {
1572     dVAR;
1573     int argc = PL_origargc;
1574     char **argv = PL_origargv;
1575     const char *scriptname = NULL;
1576     VOL bool dosearch = FALSE;
1577     const char *validarg = "";
1578     register SV *sv;
1579     register char *s;
1580     const char *cddir = Nullch;
1581 #ifdef USE_SITECUSTOMIZE
1582     bool minus_f = FALSE;
1583 #endif
1584
1585     PL_fdscript = -1;
1586     PL_suidscript = -1;
1587     sv_setpvn(PL_linestr,"",0);
1588     sv = newSVpvn("",0);                /* first used for -I flags */
1589     SAVEFREESV(sv);
1590     init_main_stash();
1591
1592     for (argc--,argv++; argc > 0; argc--,argv++) {
1593         if (argv[0][0] != '-' || !argv[0][1])
1594             break;
1595 #ifdef DOSUID
1596     if (*validarg)
1597         validarg = " PHOOEY ";
1598     else
1599         validarg = argv[0];
1600     /*
1601      * Can we rely on the kernel to start scripts with argv[1] set to
1602      * contain all #! line switches (the whole line)? (argv[0] is set to
1603      * the interpreter name, argv[2] to the script name; argv[3] and
1604      * above may contain other arguments.)
1605      */
1606 #endif
1607         s = argv[0]+1;
1608       reswitch:
1609         switch (*s) {
1610         case 'C':
1611 #ifndef PERL_STRICT_CR
1612         case '\r':
1613 #endif
1614         case ' ':
1615         case '0':
1616         case 'F':
1617         case 'a':
1618         case 'c':
1619         case 'd':
1620         case 'D':
1621         case 'h':
1622         case 'i':
1623         case 'l':
1624         case 'M':
1625         case 'm':
1626         case 'n':
1627         case 'p':
1628         case 's':
1629         case 'u':
1630         case 'U':
1631         case 'v':
1632         case 'W':
1633         case 'X':
1634         case 'w':
1635         case 'A':
1636             if ((s = moreswitches(s)))
1637                 goto reswitch;
1638             break;
1639
1640         case 't':
1641             CHECK_MALLOC_TOO_LATE_FOR('t');
1642             if( !PL_tainting ) {
1643                  PL_taint_warn = TRUE;
1644                  PL_tainting = TRUE;
1645             }
1646             s++;
1647             goto reswitch;
1648         case 'T':
1649             CHECK_MALLOC_TOO_LATE_FOR('T');
1650             PL_tainting = TRUE;
1651             PL_taint_warn = FALSE;
1652             s++;
1653             goto reswitch;
1654
1655         case 'e':
1656 #ifdef MACOS_TRADITIONAL
1657             /* ignore -e for Dev:Pseudo argument */
1658             if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
1659                 break;
1660 #endif
1661             forbid_setid("-e");
1662             if (!PL_e_script) {
1663                 PL_e_script = newSVpvn("",0);
1664                 filter_add(read_e_script, NULL);
1665             }
1666             if (*++s)
1667                 sv_catpv(PL_e_script, s);
1668             else if (argv[1]) {
1669                 sv_catpv(PL_e_script, argv[1]);
1670                 argc--,argv++;
1671             }
1672             else
1673                 Perl_croak(aTHX_ "No code specified for -e");
1674             sv_catpv(PL_e_script, "\n");
1675             break;
1676
1677         case 'f':
1678 #ifdef USE_SITECUSTOMIZE
1679             minus_f = TRUE;
1680 #endif
1681             s++;
1682             goto reswitch;
1683
1684         case 'I':       /* -I handled both here and in moreswitches() */
1685             forbid_setid("-I");
1686             if (!*++s && (s=argv[1]) != Nullch) {
1687                 argc--,argv++;
1688             }
1689             if (s && *s) {
1690                 STRLEN len = strlen(s);
1691                 const char * const p = savepvn(s, len);
1692                 incpush(p, TRUE, TRUE, FALSE, FALSE);
1693                 sv_catpvn(sv, "-I", 2);
1694                 sv_catpvn(sv, p, len);
1695                 sv_catpvn(sv, " ", 1);
1696                 Safefree(p);
1697             }
1698             else
1699                 Perl_croak(aTHX_ "No directory specified for -I");
1700             break;
1701         case 'P':
1702             forbid_setid("-P");
1703             PL_preprocess = TRUE;
1704             s++;
1705             goto reswitch;
1706         case 'S':
1707             forbid_setid("-S");
1708             dosearch = TRUE;
1709             s++;
1710             goto reswitch;
1711         case 'V':
1712             {
1713                 SV *opts_prog;
1714
1715                 if (!PL_preambleav)
1716                     PL_preambleav = newAV();
1717                 av_push(PL_preambleav,
1718                         newSVpv("use Config;",0));
1719                 if (*++s != ':')  {
1720                     STRLEN opts;
1721                 
1722                     opts_prog = newSVpv("print Config::myconfig(),",0);
1723 #ifdef VMS
1724                     sv_catpv(opts_prog,"\"\\nCharacteristics of this PERLSHR image: \\n\",");
1725 #else
1726                     sv_catpv(opts_prog,"\"\\nCharacteristics of this binary (from libperl): \\n\",");
1727 #endif
1728                     opts = SvCUR(opts_prog);
1729
1730                     Perl_sv_catpv(aTHX_ opts_prog,"\"  Compile-time options:"
1731 #  ifdef DEBUGGING
1732                              " DEBUGGING"
1733 #  endif
1734 #  ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1735                              " DEBUG_LEAKING_SCALARS_FORK_DUMP"
1736 #  endif
1737 #  ifdef FAKE_THREADS
1738                              " FAKE_THREADS"
1739 #  endif
1740 #  ifdef MULTIPLICITY
1741                              " MULTIPLICITY"
1742 #  endif
1743 #  ifdef MYMALLOC
1744                              " MYMALLOC"
1745 #  endif
1746 #  ifdef PERL_DONT_CREATE_GVSV
1747                              " PERL_DONT_CREATE_GVSV"
1748 #  endif
1749 #  ifdef PERL_GLOBAL_STRUCT
1750                              " PERL_GLOBAL_STRUCT"
1751 #  endif
1752 #  ifdef PERL_IMPLICIT_CONTEXT
1753                              " PERL_IMPLICIT_CONTEXT"
1754 #  endif
1755 #  ifdef PERL_IMPLICIT_SYS
1756                              " PERL_IMPLICIT_SYS"
1757 #  endif
1758 #  ifdef PERL_MALLOC_WRAP
1759                              " PERL_MALLOC_WRAP"
1760 #  endif
1761 #  ifdef PERL_NEED_APPCTX
1762                              " PERL_NEED_APPCTX"
1763 #  endif
1764 #  ifdef PERL_NEED_TIMESBASE
1765                              " PERL_NEED_TIMESBASE"
1766 #  endif
1767 #  ifdef PERL_OLD_COPY_ON_WRITE
1768                              " PERL_OLD_COPY_ON_WRITE"
1769 #  endif
1770 #  ifdef PL_OP_SLAB_ALLOC
1771                              " PL_OP_SLAB_ALLOC"
1772 #  endif
1773 #  ifdef THREADS_HAVE_PIDS
1774                              " THREADS_HAVE_PIDS"
1775 #  endif
1776 #  ifdef USE_5005THREADS
1777                              " USE_5005THREADS"
1778 #  endif
1779 #  ifdef USE_64_BIT_ALL
1780                              " USE_64_BIT_ALL"
1781 #  endif
1782 #  ifdef USE_64_BIT_INT
1783                              " USE_64_BIT_INT"
1784 #  endif
1785 #  ifdef USE_ITHREADS
1786                              " USE_ITHREADS"
1787 #  endif
1788 #  ifdef USE_LARGE_FILES
1789                              " USE_LARGE_FILES"
1790 #  endif
1791 #  ifdef USE_LONG_DOUBLE
1792                              " USE_LONG_DOUBLE"
1793 #  endif
1794 #  ifdef USE_PERLIO
1795                              " USE_PERLIO"
1796 #  endif
1797 #  ifdef USE_REENTRANT_API
1798                              " USE_REENTRANT_API"
1799 #  endif
1800 #  ifdef USE_SFIO
1801                              " USE_SFIO"
1802 #  endif
1803 #  ifdef USE_SITECUSTOMIZE
1804                              " USE_SITECUSTOMIZE"
1805 #  endif               
1806 #  ifdef USE_SOCKS
1807                              " USE_SOCKS"
1808 #  endif
1809                              );
1810
1811                     while (SvCUR(opts_prog) > opts+76) {
1812                         /* find last space after "options: " and before col 76
1813                          */
1814
1815                         const char *space;
1816                         char *pv = SvPV_nolen(opts_prog);
1817                         const char c = pv[opts+76];
1818                         pv[opts+76] = '\0';
1819                         space = strrchr(pv+opts+26, ' ');
1820                         pv[opts+76] = c;
1821                         if (!space) break; /* "Can't happen" */
1822
1823                         /* break the line before that space */
1824
1825                         opts = space - pv;
1826                         sv_insert(opts_prog, opts, 0,
1827                                   "\\n                       ", 25);
1828                     }
1829
1830                     sv_catpv(opts_prog,"\\n\",");
1831
1832 #if defined(LOCAL_PATCH_COUNT)
1833                     if (LOCAL_PATCH_COUNT > 0) {
1834                         int i;
1835                         sv_catpv(opts_prog,
1836                                  "\"  Locally applied patches:\\n\",");
1837                         for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1838                             if (PL_localpatches[i])
1839                                 Perl_sv_catpvf(aTHX_ opts_prog,"q%c\t%s\n%c,",
1840                                                0, PL_localpatches[i], 0);
1841                         }
1842                     }
1843 #endif
1844                     Perl_sv_catpvf(aTHX_ opts_prog,
1845                                    "\"  Built under %s\\n\"",OSNAME);
1846 #ifdef __DATE__
1847 #  ifdef __TIME__
1848                     Perl_sv_catpvf(aTHX_ opts_prog,
1849                                    ",\"  Compiled at %s %s\\n\"",__DATE__,
1850                                    __TIME__);
1851 #  else
1852                     Perl_sv_catpvf(aTHX_ opts_prog,",\"  Compiled on %s\\n\"",
1853                                    __DATE__);
1854 #  endif
1855 #endif
1856                     sv_catpv(opts_prog, "; $\"=\"\\n    \"; "
1857                              "@env = map { \"$_=\\\"$ENV{$_}\\\"\" } "
1858                              "sort grep {/^PERL/} keys %ENV; ");
1859 #ifdef __CYGWIN__
1860                     sv_catpv(opts_prog,
1861                              "push @env, \"CYGWIN=\\\"$ENV{CYGWIN}\\\"\";");
1862 #endif
1863                     sv_catpv(opts_prog, 
1864                              "print \"  \\%ENV:\\n    @env\\n\" if @env;"
1865                              "print \"  \\@INC:\\n    @INC\\n\";");
1866                 }
1867                 else {
1868                     ++s;
1869                     opts_prog = Perl_newSVpvf(aTHX_
1870                                               "Config::config_vars(qw%c%s%c)",
1871                                               0, s, 0);
1872                     s += strlen(s);
1873                 }
1874                 av_push(PL_preambleav, opts_prog);
1875                 /* don't look for script or read stdin */
1876                 scriptname = BIT_BUCKET;
1877                 goto reswitch;
1878             }
1879         case 'x':
1880             PL_doextract = TRUE;
1881             s++;
1882             if (*s)
1883                 cddir = s;
1884             break;
1885         case 0:
1886             break;
1887         case '-':
1888             if (!*++s || isSPACE(*s)) {
1889                 argc--,argv++;
1890                 goto switch_end;
1891             }
1892             /* catch use of gnu style long options */
1893             if (strEQ(s, "version")) {
1894                 s = (char *)"v";
1895                 goto reswitch;
1896             }
1897             if (strEQ(s, "help")) {
1898                 s = (char *)"h";
1899                 goto reswitch;
1900             }
1901             s--;
1902             /* FALL THROUGH */
1903         default:
1904             Perl_croak(aTHX_ "Unrecognized switch: -%s  (-h will show valid options)",s);
1905         }
1906     }
1907   switch_end:
1908
1909     if (
1910 #ifndef SECURE_INTERNAL_GETENV
1911         !PL_tainting &&
1912 #endif
1913         (s = PerlEnv_getenv("PERL5OPT")))
1914     {
1915         const char *popt = s;
1916         while (isSPACE(*s))
1917             s++;
1918         if (*s == '-' && *(s+1) == 'T') {
1919             CHECK_MALLOC_TOO_LATE_FOR('T');
1920             PL_tainting = TRUE;
1921             PL_taint_warn = FALSE;
1922         }
1923         else {
1924             char *popt_copy = Nullch;
1925             while (s && *s) {
1926                 char *d;
1927                 while (isSPACE(*s))
1928                     s++;
1929                 if (*s == '-') {
1930                     s++;
1931                     if (isSPACE(*s))
1932                         continue;
1933                 }
1934                 d = s;
1935                 if (!*s)
1936                     break;
1937                 if (!strchr("DIMUdmtwA", *s))
1938                     Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
1939                 while (++s && *s) {
1940                     if (isSPACE(*s)) {
1941                         if (!popt_copy) {
1942                             popt_copy = SvPVX(sv_2mortal(newSVpv(popt,0)));
1943                             s = popt_copy + (s - popt);
1944                             d = popt_copy + (d - popt);
1945                         }
1946                         *s++ = '\0';
1947                         break;
1948                     }
1949                 }
1950                 if (*d == 't') {
1951                     if( !PL_tainting ) {
1952                         PL_taint_warn = TRUE;
1953                         PL_tainting = TRUE;
1954                     }
1955                 } else {
1956                     moreswitches(d);
1957                 }
1958             }
1959         }
1960     }
1961
1962 #ifdef USE_SITECUSTOMIZE
1963     if (!minus_f) {
1964         if (!PL_preambleav)
1965             PL_preambleav = newAV();
1966         av_unshift(PL_preambleav, 1);
1967         (void)av_store(PL_preambleav, 0, Perl_newSVpvf(aTHX_ "BEGIN { do '%s/sitecustomize.pl' }", SITELIB_EXP));
1968     }
1969 #endif
1970
1971     if (PL_taint_warn && PL_dowarn != G_WARN_ALL_OFF) {
1972        PL_compiling.cop_warnings = newSVpvn(WARN_TAINTstring, WARNsize);
1973     }
1974
1975     if (!scriptname)
1976         scriptname = argv[0];
1977     if (PL_e_script) {
1978         argc++,argv--;
1979         scriptname = BIT_BUCKET;        /* don't look for script or read stdin */
1980     }
1981     else if (scriptname == Nullch) {
1982 #ifdef MSDOS
1983         if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
1984             moreswitches("h");
1985 #endif
1986         scriptname = "-";
1987     }
1988
1989     /* Set $^X early so that it can be used for relocatable paths in @INC  */
1990     assert (!PL_tainted);
1991     TAINT;
1992     S_set_caret_X(aTHX);
1993     TAINT_NOT;
1994     init_perllib();
1995
1996     open_script(scriptname,dosearch,sv);
1997
1998     validate_suid(validarg, scriptname);
1999
2000 #ifndef PERL_MICRO
2001 #if defined(SIGCHLD) || defined(SIGCLD)
2002     {
2003 #ifndef SIGCHLD
2004 #  define SIGCHLD SIGCLD
2005 #endif
2006         Sighandler_t sigstate = rsignal_state(SIGCHLD);
2007         if (sigstate == (Sighandler_t) SIG_IGN) {
2008             if (ckWARN(WARN_SIGNAL))
2009                 Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
2010                             "Can't ignore signal CHLD, forcing to default");
2011             (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
2012         }
2013     }
2014 #endif
2015 #endif
2016
2017 #ifdef MACOS_TRADITIONAL
2018     if (PL_doextract || gMacPerl_AlwaysExtract) {
2019 #else
2020     if (PL_doextract) {
2021 #endif
2022         find_beginning();
2023         if (cddir && PerlDir_chdir( (char *)cddir ) < 0)
2024             Perl_croak(aTHX_ "Can't chdir to %s",cddir);
2025
2026     }
2027
2028     PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
2029     sv_upgrade((SV *)PL_compcv, SVt_PVCV);
2030     CvUNIQUE_on(PL_compcv);
2031
2032     CvPADLIST(PL_compcv) = pad_new(0);
2033 #ifdef USE_5005THREADS
2034     CvOWNER(PL_compcv) = 0;
2035     Newx(CvMUTEXP(PL_compcv), 1, perl_mutex);
2036     MUTEX_INIT(CvMUTEXP(PL_compcv));
2037 #endif /* USE_5005THREADS */
2038
2039     boot_core_PerlIO();
2040     boot_core_UNIVERSAL();
2041     boot_core_xsutils();
2042
2043     if (xsinit)
2044         (*xsinit)(aTHX);        /* in case linked C routines want magical variables */
2045 #ifndef PERL_MICRO
2046 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC)
2047     init_os_extras();
2048 #endif
2049 #endif
2050
2051 #ifdef USE_SOCKS
2052 #   ifdef HAS_SOCKS5_INIT
2053     socks5_init(argv[0]);
2054 #   else
2055     SOCKSinit(argv[0]);
2056 #   endif
2057 #endif
2058
2059     init_predump_symbols();
2060     /* init_postdump_symbols not currently designed to be called */
2061     /* more than once (ENV isn't cleared first, for example)     */
2062     /* But running with -u leaves %ENV & @ARGV undefined!    XXX */
2063     if (!PL_do_undump)
2064         init_postdump_symbols(argc,argv,env);
2065
2066     /* PL_unicode is turned on by -C, or by $ENV{PERL_UNICODE},
2067      * or explicitly in some platforms.
2068      * locale.c:Perl_init_i18nl10n() if the environment
2069      * look like the user wants to use UTF-8. */
2070 #if defined(SYMBIAN)
2071     PL_unicode = PERL_UNICODE_STD_FLAG; /* See PERL_SYMBIAN_CONSOLE_UTF8. */
2072 #endif
2073     if (PL_unicode) {
2074          /* Requires init_predump_symbols(). */
2075          if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
2076               IO* io;
2077               PerlIO* fp;
2078               SV* sv;
2079
2080               /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
2081                * and the default open disciplines. */
2082               if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
2083                   PL_stdingv  && (io = GvIO(PL_stdingv)) &&
2084                   (fp = IoIFP(io)))
2085                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2086               if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
2087                   PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
2088                   (fp = IoOFP(io)))
2089                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2090               if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
2091                   PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
2092                   (fp = IoOFP(io)))
2093                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2094               if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
2095                   (sv = GvSV(gv_fetchpv("\017PEN", TRUE, SVt_PV)))) {
2096                    U32 in  = PL_unicode & PERL_UNICODE_IN_FLAG;
2097                    U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
2098                    if (in) {
2099                         if (out)
2100                              sv_setpvn(sv, ":utf8\0:utf8", 11);
2101                         else
2102                              sv_setpvn(sv, ":utf8\0", 6);
2103                    }
2104                    else if (out)
2105                         sv_setpvn(sv, "\0:utf8", 6);
2106                    SvSETMAGIC(sv);
2107               }
2108          }
2109     }
2110
2111     if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
2112          if (strEQ(s, "unsafe"))
2113               PL_signals |=  PERL_SIGNALS_UNSAFE_FLAG;
2114          else if (strEQ(s, "safe"))
2115               PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
2116          else
2117               Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
2118     }
2119
2120     init_lexer();
2121
2122     /* now parse the script */
2123
2124     SETERRNO(0,SS_NORMAL);
2125     PL_error_count = 0;
2126 #ifdef MACOS_TRADITIONAL
2127     if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) {
2128         if (PL_minus_c)
2129             Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
2130         else {
2131             Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
2132                        MacPerl_MPWFileName(PL_origfilename));
2133         }
2134     }
2135 #else
2136     if (yyparse() || PL_error_count) {
2137         if (PL_minus_c)
2138             Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
2139         else {
2140             Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
2141                        PL_origfilename);
2142         }
2143     }
2144 #endif
2145     CopLINE_set(PL_curcop, 0);
2146     PL_curstash = PL_defstash;
2147     PL_preprocess = FALSE;
2148     if (PL_e_script) {
2149         SvREFCNT_dec(PL_e_script);
2150         PL_e_script = Nullsv;
2151     }
2152
2153     if (PL_do_undump)
2154         my_unexec();
2155
2156     if (isWARN_ONCE) {
2157         SAVECOPFILE(PL_curcop);
2158         SAVECOPLINE(PL_curcop);
2159         gv_check(PL_defstash);
2160     }
2161
2162     LEAVE;
2163     FREETMPS;
2164
2165 #ifdef MYMALLOC
2166     if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
2167         dump_mstats("after compilation:");
2168 #endif
2169
2170     ENTER;
2171     PL_restartop = 0;
2172     return NULL;
2173 }
2174
2175 /*
2176 =for apidoc perl_run
2177
2178 Tells a Perl interpreter to run.  See L<perlembed>.
2179
2180 =cut
2181 */
2182
2183 int
2184 perl_run(pTHXx)
2185 {
2186     I32 oldscope;
2187     int ret = 0;
2188     dJMPENV;
2189
2190     PERL_UNUSED_ARG(my_perl);
2191
2192     oldscope = PL_scopestack_ix;
2193 #ifdef VMS
2194     VMSISH_HUSHED = 0;
2195 #endif
2196
2197     JMPENV_PUSH(ret);
2198     switch (ret) {
2199     case 1:
2200         cxstack_ix = -1;                /* start context stack again */
2201         goto redo_body;
2202     case 0:                             /* normal completion */
2203  redo_body:
2204         run_body(oldscope);
2205         /* FALL THROUGH */
2206     case 2:                             /* my_exit() */
2207         while (PL_scopestack_ix > oldscope)
2208             LEAVE;
2209         FREETMPS;
2210         PL_curstash = PL_defstash;
2211         if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
2212             PL_endav && !PL_minus_c)
2213             call_list(oldscope, PL_endav);
2214 #ifdef MYMALLOC
2215         if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
2216             dump_mstats("after execution:  ");
2217 #endif
2218         ret = STATUS_EXIT;
2219         break;
2220     case 3:
2221         if (PL_restartop) {
2222             POPSTACK_TO(PL_mainstack);
2223             goto redo_body;
2224         }
2225         PerlIO_printf(Perl_error_log, "panic: restartop\n");
2226         FREETMPS;
2227         ret = 1;
2228         break;
2229     }
2230
2231     JMPENV_POP;
2232     return ret;
2233 }
2234
2235
2236 STATIC void
2237 S_run_body(pTHX_ I32 oldscope)
2238 {
2239     DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
2240                     PL_sawampersand ? "Enabling" : "Omitting"));
2241
2242     if (!PL_restartop) {
2243         DEBUG_x(dump_all());
2244 #ifdef DEBUGGING
2245         if (!DEBUG_q_TEST)
2246           PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
2247 #endif
2248         DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
2249                               PTR2UV(thr)));
2250
2251         if (PL_minus_c) {
2252 #ifdef MACOS_TRADITIONAL
2253             PerlIO_printf(Perl_error_log, "%s%s syntax OK\n",
2254                 (gMacPerl_ErrorFormat ? "# " : ""),
2255                 MacPerl_MPWFileName(PL_origfilename));
2256 #else
2257             PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
2258 #endif
2259             my_exit(0);
2260         }
2261         if (PERLDB_SINGLE && PL_DBsingle)
2262             sv_setiv(PL_DBsingle, 1);
2263         if (PL_initav)
2264             call_list(oldscope, PL_initav);
2265     }
2266
2267     /* do it */
2268
2269     if (PL_restartop) {
2270         PL_op = PL_restartop;
2271         PL_restartop = 0;
2272         CALLRUNOPS(aTHX);
2273     }
2274     else if (PL_main_start) {
2275         CvDEPTH(PL_main_cv) = 1;
2276         PL_op = PL_main_start;
2277         CALLRUNOPS(aTHX);
2278     }
2279     my_exit(0);
2280     /* NOTREACHED */
2281 }
2282
2283 /*
2284 =head1 SV Manipulation Functions
2285
2286 =for apidoc p||get_sv
2287
2288 Returns the SV of the specified Perl scalar.  If C<create> is set and the
2289 Perl variable does not exist then it will be created.  If C<create> is not
2290 set and the variable does not exist then NULL is returned.
2291
2292 =cut
2293 */
2294
2295 SV*
2296 Perl_get_sv(pTHX_ const char *name, I32 create)
2297 {
2298     GV *gv;
2299 #ifdef USE_5005THREADS
2300     if (name[1] == '\0' && !isALPHA(name[0])) {
2301         PADOFFSET tmp = find_threadsv(name);
2302         if (tmp != NOT_IN_PAD)
2303             return THREADSV(tmp);
2304     }
2305 #endif /* USE_5005THREADS */
2306     gv = gv_fetchpv(name, create, SVt_PV);
2307     if (gv)
2308         return GvSV(gv);
2309     return Nullsv;
2310 }
2311
2312 /*
2313 =head1 Array Manipulation Functions
2314
2315 =for apidoc p||get_av
2316
2317 Returns the AV of the specified Perl array.  If C<create> is set and the
2318 Perl variable does not exist then it will be created.  If C<create> is not
2319 set and the variable does not exist then NULL is returned.
2320
2321 =cut
2322 */
2323
2324 AV*
2325 Perl_get_av(pTHX_ const char *name, I32 create)
2326 {
2327     GV* gv = gv_fetchpv(name, create, SVt_PVAV);
2328     if (create)
2329         return GvAVn(gv);
2330     if (gv)
2331         return GvAV(gv);
2332     return Nullav;
2333 }
2334
2335 /*
2336 =head1 Hash Manipulation Functions
2337
2338 =for apidoc p||get_hv
2339
2340 Returns the HV of the specified Perl hash.  If C<create> is set and the
2341 Perl variable does not exist then it will be created.  If C<create> is not
2342 set and the variable does not exist then NULL is returned.
2343
2344 =cut
2345 */
2346
2347 HV*
2348 Perl_get_hv(pTHX_ const char *name, I32 create)
2349 {
2350     GV* const gv = gv_fetchpv(name, create, SVt_PVHV);
2351     if (create)
2352         return GvHVn(gv);
2353     if (gv)
2354         return GvHV(gv);
2355     return Nullhv;
2356 }
2357
2358 /*
2359 =head1 CV Manipulation Functions
2360
2361 =for apidoc p||get_cv
2362
2363 Returns the CV of the specified Perl subroutine.  If C<create> is set and
2364 the Perl subroutine does not exist then it will be declared (which has the
2365 same effect as saying C<sub name;>).  If C<create> is not set and the
2366 subroutine does not exist then NULL is returned.
2367
2368 =cut
2369 */
2370
2371 CV*
2372 Perl_get_cv(pTHX_ const char *name, I32 create)
2373 {
2374     GV* gv = gv_fetchpv(name, create, SVt_PVCV);
2375     /* XXX unsafe for threads if eval_owner isn't held */
2376     /* XXX this is probably not what they think they're getting.
2377      * It has the same effect as "sub name;", i.e. just a forward
2378      * declaration! */
2379     if (create && !GvCVu(gv))
2380         return newSUB(start_subparse(FALSE, 0),
2381                       newSVOP(OP_CONST, 0, newSVpv(name,0)),
2382                       Nullop,
2383                       Nullop);
2384     if (gv)
2385         return GvCVu(gv);
2386     return Nullcv;
2387 }
2388
2389 /* Be sure to refetch the stack pointer after calling these routines. */
2390
2391 /*
2392
2393 =head1 Callback Functions
2394
2395 =for apidoc p||call_argv
2396
2397 Performs a callback to the specified Perl sub.  See L<perlcall>.
2398
2399 =cut
2400 */
2401
2402 I32
2403 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
2404
2405                         /* See G_* flags in cop.h */
2406                         /* null terminated arg list */
2407 {
2408     dSP;
2409
2410     PUSHMARK(SP);
2411     if (argv) {
2412         while (*argv) {
2413             XPUSHs(sv_2mortal(newSVpv(*argv,0)));
2414             argv++;
2415         }
2416         PUTBACK;
2417     }
2418     return call_pv(sub_name, flags);
2419 }
2420
2421 /*
2422 =for apidoc p||call_pv
2423
2424 Performs a callback to the specified Perl sub.  See L<perlcall>.
2425
2426 =cut
2427 */
2428
2429 I32
2430 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
2431                         /* name of the subroutine */
2432                         /* See G_* flags in cop.h */
2433 {
2434     return call_sv((SV*)get_cv(sub_name, TRUE), flags);
2435 }
2436
2437 /*
2438 =for apidoc p||call_method
2439
2440 Performs a callback to the specified Perl method.  The blessed object must
2441 be on the stack.  See L<perlcall>.
2442
2443 =cut
2444 */
2445
2446 I32
2447 Perl_call_method(pTHX_ const char *methname, I32 flags)
2448                         /* name of the subroutine */
2449                         /* See G_* flags in cop.h */
2450 {
2451     return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
2452 }
2453
2454 /* May be called with any of a CV, a GV, or an SV containing the name. */
2455 /*
2456 =for apidoc p||call_sv
2457
2458 Performs a callback to the Perl sub whose name is in the SV.  See
2459 L<perlcall>.
2460
2461 =cut
2462 */
2463
2464 I32
2465 Perl_call_sv(pTHX_ SV *sv, I32 flags)
2466                         /* See G_* flags in cop.h */
2467 {
2468     dVAR; dSP;
2469     LOGOP myop;         /* fake syntax tree node */
2470     UNOP method_op;
2471     I32 oldmark;
2472     volatile I32 retval = 0;
2473     I32 oldscope;
2474     bool oldcatch = CATCH_GET;
2475     int ret;
2476     OP* oldop = PL_op;
2477     dJMPENV;
2478
2479     if (flags & G_DISCARD) {
2480         ENTER;
2481         SAVETMPS;
2482     }
2483
2484     Zero(&myop, 1, LOGOP);
2485     myop.op_next = Nullop;
2486     if (!(flags & G_NOARGS))
2487         myop.op_flags |= OPf_STACKED;
2488     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
2489                       (flags & G_ARRAY) ? OPf_WANT_LIST :
2490                       OPf_WANT_SCALAR);
2491     SAVEOP();
2492     PL_op = (OP*)&myop;
2493
2494     EXTEND(PL_stack_sp, 1);
2495     *++PL_stack_sp = sv;
2496     oldmark = TOPMARK;
2497     oldscope = PL_scopestack_ix;
2498
2499     if (PERLDB_SUB && PL_curstash != PL_debstash
2500            /* Handle first BEGIN of -d. */
2501           && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
2502            /* Try harder, since this may have been a sighandler, thus
2503             * curstash may be meaningless. */
2504           && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
2505           && !(flags & G_NODEBUG))
2506         PL_op->op_private |= OPpENTERSUB_DB;
2507
2508     if (flags & G_METHOD) {
2509         Zero(&method_op, 1, UNOP);
2510         method_op.op_next = PL_op;
2511         method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
2512         myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
2513         PL_op = (OP*)&method_op;
2514     }
2515
2516     if (!(flags & G_EVAL)) {
2517         CATCH_SET(TRUE);
2518         call_body((OP*)&myop, FALSE);
2519         retval = PL_stack_sp - (PL_stack_base + oldmark);
2520         CATCH_SET(oldcatch);
2521     }
2522     else {
2523         myop.op_other = (OP*)&myop;
2524         PL_markstack_ptr--;
2525         /* we're trying to emulate pp_entertry() here */
2526         {
2527             register PERL_CONTEXT *cx;
2528             const I32 gimme = GIMME_V;
2529         
2530             ENTER;
2531             SAVETMPS;
2532         
2533             PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
2534             PUSHEVAL(cx, 0, 0);
2535             PL_eval_root = PL_op;             /* Only needed so that goto works right. */
2536         
2537             PL_in_eval = EVAL_INEVAL;
2538             if (flags & G_KEEPERR)
2539                 PL_in_eval |= EVAL_KEEPERR;
2540             else
2541                 sv_setpvn(ERRSV,"",0);
2542         }
2543         PL_markstack_ptr++;
2544
2545         JMPENV_PUSH(ret);
2546         switch (ret) {
2547         case 0:
2548  redo_body:
2549             call_body((OP*)&myop, FALSE);
2550             retval = PL_stack_sp - (PL_stack_base + oldmark);
2551             if (!(flags & G_KEEPERR))
2552                 sv_setpvn(ERRSV,"",0);
2553             break;
2554         case 1:
2555             STATUS_ALL_FAILURE;
2556             /* FALL THROUGH */
2557         case 2:
2558             /* my_exit() was called */
2559             PL_curstash = PL_defstash;
2560             FREETMPS;
2561             JMPENV_POP;
2562             if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2563                 Perl_croak(aTHX_ "Callback called exit");
2564             my_exit_jump();
2565             /* NOTREACHED */
2566         case 3:
2567             if (PL_restartop) {
2568                 PL_op = PL_restartop;
2569                 PL_restartop = 0;
2570                 goto redo_body;
2571             }
2572             PL_stack_sp = PL_stack_base + oldmark;
2573             if (flags & G_ARRAY)
2574                 retval = 0;
2575             else {
2576                 retval = 1;
2577                 *++PL_stack_sp = &PL_sv_undef;
2578             }
2579             break;
2580         }
2581
2582         if (PL_scopestack_ix > oldscope) {
2583             SV **newsp;
2584             PMOP *newpm;
2585             I32 gimme;
2586             register PERL_CONTEXT *cx;
2587             I32 optype;
2588
2589             POPBLOCK(cx,newpm);
2590             POPEVAL(cx);
2591             PL_curpm = newpm;
2592             LEAVE;
2593             PERL_UNUSED_VAR(newsp);
2594             PERL_UNUSED_VAR(gimme);
2595             PERL_UNUSED_VAR(optype);
2596         }
2597         JMPENV_POP;
2598     }
2599
2600     if (flags & G_DISCARD) {
2601         PL_stack_sp = PL_stack_base + oldmark;
2602         retval = 0;
2603         FREETMPS;
2604         LEAVE;
2605     }
2606     PL_op = oldop;
2607     return retval;
2608 }
2609
2610 STATIC void
2611 S_call_body(pTHX_ const OP *myop, bool is_eval)
2612 {
2613     if (PL_op == myop) {
2614         if (is_eval)
2615             PL_op = Perl_pp_entereval(aTHX);    /* this doesn't do a POPMARK */
2616         else
2617             PL_op = Perl_pp_entersub(aTHX);     /* this does */
2618     }
2619     if (PL_op)
2620         CALLRUNOPS(aTHX);
2621 }
2622
2623 /* Eval a string. The G_EVAL flag is always assumed. */
2624
2625 /*
2626 =for apidoc p||eval_sv
2627
2628 Tells Perl to C<eval> the string in the SV.
2629
2630 =cut
2631 */
2632
2633 I32
2634 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
2635
2636                         /* See G_* flags in cop.h */
2637 {
2638     dSP;
2639     UNOP myop;          /* fake syntax tree node */
2640     volatile I32 oldmark = SP - PL_stack_base;
2641     volatile I32 retval = 0;
2642     int ret;
2643     OP* oldop = PL_op;
2644     dJMPENV;
2645
2646     if (flags & G_DISCARD) {
2647         ENTER;
2648         SAVETMPS;
2649     }
2650
2651     SAVEOP();
2652     PL_op = (OP*)&myop;
2653     Zero(PL_op, 1, UNOP);
2654     EXTEND(PL_stack_sp, 1);
2655     *++PL_stack_sp = sv;
2656
2657     if (!(flags & G_NOARGS))
2658         myop.op_flags = OPf_STACKED;
2659     myop.op_next = Nullop;
2660     myop.op_type = OP_ENTEREVAL;
2661     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
2662                       (flags & G_ARRAY) ? OPf_WANT_LIST :
2663                       OPf_WANT_SCALAR);
2664     if (flags & G_KEEPERR)
2665         myop.op_flags |= OPf_SPECIAL;
2666
2667     /* fail now; otherwise we could fail after the JMPENV_PUSH but
2668      * before a PUSHEVAL, which corrupts the stack after a croak */
2669     TAINT_PROPER("eval_sv()");
2670
2671     JMPENV_PUSH(ret);
2672     switch (ret) {
2673     case 0:
2674  redo_body:
2675         call_body((OP*)&myop,TRUE);
2676         retval = PL_stack_sp - (PL_stack_base + oldmark);
2677         if (!(flags & G_KEEPERR))
2678             sv_setpvn(ERRSV,"",0);
2679         break;
2680     case 1:
2681         STATUS_ALL_FAILURE;
2682         /* FALL THROUGH */
2683     case 2:
2684         /* my_exit() was called */
2685         PL_curstash = PL_defstash;
2686         FREETMPS;
2687         JMPENV_POP;
2688         if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2689             Perl_croak(aTHX_ "Callback called exit");
2690         my_exit_jump();
2691         /* NOTREACHED */
2692     case 3:
2693         if (PL_restartop) {
2694             PL_op = PL_restartop;
2695             PL_restartop = 0;
2696             goto redo_body;
2697         }
2698         PL_stack_sp = PL_stack_base + oldmark;
2699         if (flags & G_ARRAY)
2700             retval = 0;
2701         else {
2702             retval = 1;
2703             *++PL_stack_sp = &PL_sv_undef;
2704         }
2705         break;
2706     }
2707
2708     JMPENV_POP;
2709     if (flags & G_DISCARD) {
2710         PL_stack_sp = PL_stack_base + oldmark;
2711         retval = 0;
2712         FREETMPS;
2713         LEAVE;
2714     }
2715     PL_op = oldop;
2716     return retval;
2717 }
2718
2719 /*
2720 =for apidoc p||eval_pv
2721
2722 Tells Perl to C<eval> the given string and return an SV* result.
2723
2724 =cut
2725 */
2726
2727 SV*
2728 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
2729 {
2730     dSP;
2731     SV* sv = newSVpv(p, 0);
2732
2733     eval_sv(sv, G_SCALAR);
2734     SvREFCNT_dec(sv);
2735
2736     SPAGAIN;
2737     sv = POPs;
2738     PUTBACK;
2739
2740     if (croak_on_error && SvTRUE(ERRSV)) {
2741         Perl_croak(aTHX_ SvPVx_nolen_const(ERRSV));
2742     }
2743
2744     return sv;
2745 }
2746
2747 /* Require a module. */
2748
2749 /*
2750 =head1 Embedding Functions
2751
2752 =for apidoc p||require_pv
2753
2754 Tells Perl to C<require> the file named by the string argument.  It is
2755 analogous to the Perl code C<eval "require '$file'">.  It's even
2756 implemented that way; consider using load_module instead.
2757
2758 =cut */
2759
2760 void
2761 Perl_require_pv(pTHX_ const char *pv)
2762 {
2763     SV* sv;
2764     dSP;
2765     PUSHSTACKi(PERLSI_REQUIRE);
2766     PUTBACK;
2767     sv = Perl_newSVpvf(aTHX_ "require q%c%s%c", 0, pv, 0);
2768     eval_sv(sv_2mortal(sv), G_DISCARD);
2769     SPAGAIN;
2770     POPSTACK;
2771 }
2772
2773 void
2774 Perl_magicname(pTHX_ const char *sym, const char *name, I32 namlen)
2775 {
2776     register GV *gv;
2777
2778     if ((gv = gv_fetchpv(sym,TRUE, SVt_PV)))
2779         sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, namlen);
2780 }
2781
2782 STATIC void
2783 S_usage(pTHX_ const char *name)         /* XXX move this out into a module ? */
2784 {
2785     /* This message really ought to be max 23 lines.
2786      * Removed -h because the user already knows that option. Others? */
2787
2788     static const char * const usage_msg[] = {
2789 "-0[octal]         specify record separator (\\0, if no argument)",
2790 "-A[mod][=pattern] activate all/given assertions",
2791 "-a                autosplit mode with -n or -p (splits $_ into @F)",
2792 "-C[number/list]   enables the listed Unicode features",
2793 "-c                check syntax only (runs BEGIN and CHECK blocks)",
2794 "-d[:debugger]     run program under debugger",
2795 "-D[number/list]   set debugging flags (argument is a bit mask or alphabets)",
2796 "-e program        one line of program (several -e's allowed, omit programfile)",
2797 "-f                don't do $sitelib/sitecustomize.pl at startup",
2798 "-F/pattern/       split() pattern for -a switch (//'s are optional)",
2799 "-i[extension]     edit <> files in place (makes backup if extension supplied)",
2800 "-Idirectory       specify @INC/#include directory (several -I's allowed)",
2801 "-l[octal]         enable line ending processing, specifies line terminator",
2802 "-[mM][-]module    execute \"use/no module...\" before executing program",
2803 "-n                assume \"while (<>) { ... }\" loop around program",
2804 "-p                assume loop like -n but print line also, like sed",
2805 "-P                run program through C preprocessor before compilation",
2806 "-s                enable rudimentary parsing for switches after programfile",
2807 "-S                look for programfile using PATH environment variable",
2808 "-t                enable tainting warnings",
2809 "-T                enable tainting checks",
2810 "-u                dump core after parsing program",
2811 "-U                allow unsafe operations",
2812 "-v                print version, subversion (includes VERY IMPORTANT perl info)",
2813 "-V[:variable]     print configuration summary (or a single Config.pm variable)",
2814 "-w                enable many useful warnings (RECOMMENDED)",
2815 "-W                enable all warnings",
2816 "-x[directory]     strip off text before #!perl line and perhaps cd to directory",
2817 "-X                disable all warnings",
2818 "\n",
2819 NULL
2820 };
2821     const char * const *p = usage_msg;
2822
2823     PerlIO_printf(PerlIO_stdout(),
2824                   "\nUsage: %s [switches] [--] [programfile] [arguments]",
2825                   name);
2826     while (*p)
2827         PerlIO_printf(PerlIO_stdout(), "\n  %s", *p++);
2828 }
2829
2830 /* convert a string of -D options (or digits) into an int.
2831  * sets *s to point to the char after the options */
2832
2833 #ifdef DEBUGGING
2834 int
2835 Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
2836 {
2837     static const char * const usage_msgd[] = {
2838       " Debugging flag values: (see also -d)",
2839       "  p  Tokenizing and parsing (with v, displays parse stack)",
2840       "  s  Stack snapshots (with v, displays all stacks)",
2841       "  l  Context (loop) stack processing",
2842       "  t  Trace execution",
2843       "  o  Method and overloading resolution",
2844       "  c  String/numeric conversions",
2845       "  P  Print profiling info, preprocessor command for -P, source file input state",
2846       "  m  Memory allocation",
2847       "  f  Format processing",
2848       "  r  Regular expression parsing and execution",
2849       "  x  Syntax tree dump",
2850       "  u  Tainting checks",
2851       "  H  Hash dump -- usurps values()",
2852       "  X  Scratchpad allocation",
2853       "  D  Cleaning up",
2854       "  S  Thread synchronization",
2855       "  T  Tokenising",
2856       "  R  Include reference counts of dumped variables (eg when using -Ds)",
2857       "  J  Do not s,t,P-debug (Jump over) opcodes within package DB",
2858       "  v  Verbose: use in conjunction with other flags",
2859       "  C  Copy On Write",
2860       "  A  Consistency checks on internal structures",
2861       "  q  quiet - currently only suppresses the 'EXECUTING' message",
2862       NULL
2863     };
2864     int i = 0;
2865     if (isALPHA(**s)) {
2866         /* if adding extra options, remember to update DEBUG_MASK */
2867         static const char debopts[] = "psltocPmfrxu HXDSTRJvCAq";
2868
2869         for (; isALNUM(**s); (*s)++) {
2870             const char *d = strchr(debopts,**s);
2871             if (d)
2872                 i |= 1 << (d - debopts);
2873             else if (ckWARN_d(WARN_DEBUGGING))
2874                 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2875                     "invalid option -D%c, use -D'' to see choices\n", **s);
2876         }
2877     }
2878     else if (isDIGIT(**s)) {
2879         i = atoi(*s);
2880         for (; isALNUM(**s); (*s)++) ;
2881     }
2882     else if (givehelp) {
2883       char **p = (char **)usage_msgd;
2884       while (*p) PerlIO_printf(PerlIO_stdout(), "%s\n", *p++);
2885     }
2886 #  ifdef EBCDIC
2887     if ((i & DEBUG_p_FLAG) && ckWARN_d(WARN_DEBUGGING))
2888         Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2889                 "-Dp not implemented on this platform\n");
2890 #  endif
2891     return i;
2892 }
2893 #endif
2894
2895 /* This routine handles any switches that can be given during run */
2896
2897 char *
2898 Perl_moreswitches(pTHX_ char *s)
2899 {
2900     dVAR;
2901     UV rschar;
2902
2903     switch (*s) {
2904     case '0':
2905     {
2906          I32 flags = 0;
2907          STRLEN numlen;
2908
2909          SvREFCNT_dec(PL_rs);
2910          if (s[1] == 'x' && s[2]) {
2911               const char *e = s+=2;
2912               U8 *tmps;
2913
2914               while (*e)
2915                 e++;
2916               numlen = e - s;
2917               flags = PERL_SCAN_SILENT_ILLDIGIT;
2918               rschar = (U32)grok_hex(s, &numlen, &flags, NULL);
2919               if (s + numlen < e) {
2920                    rschar = 0; /* Grandfather -0xFOO as -0 -xFOO. */
2921                    numlen = 0;
2922                    s--;
2923               }
2924               PL_rs = newSVpvn("", 0);
2925               SvGROW(PL_rs, (STRLEN)(UNISKIP(rschar) + 1));
2926               tmps = (U8*)SvPVX(PL_rs);
2927               uvchr_to_utf8(tmps, rschar);
2928               SvCUR_set(PL_rs, UNISKIP(rschar));
2929               SvUTF8_on(PL_rs);
2930          }
2931          else {
2932               numlen = 4;
2933               rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
2934               if (rschar & ~((U8)~0))
2935                    PL_rs = &PL_sv_undef;
2936               else if (!rschar && numlen >= 2)
2937                    PL_rs = newSVpvn("", 0);
2938               else {
2939                    char ch = (char)rschar;
2940                    PL_rs = newSVpvn(&ch, 1);
2941               }
2942          }
2943          sv_setsv(get_sv("/", TRUE), PL_rs);
2944          return s + numlen;
2945     }
2946     case 'C':
2947         s++;
2948         PL_unicode = parse_unicode_opts( (const char **)&s );
2949         return s;
2950     case 'F':
2951         PL_minus_F = TRUE;
2952         PL_splitstr = ++s;
2953         while (*s && !isSPACE(*s)) ++s;
2954         *s = '\0';
2955         PL_splitstr = savepv(PL_splitstr);
2956         return s;
2957     case 'a':
2958         PL_minus_a = TRUE;
2959         s++;
2960         return s;
2961     case 'c':
2962         PL_minus_c = TRUE;
2963         s++;
2964         return s;
2965     case 'd':
2966         forbid_setid("-d");
2967         s++;
2968
2969         /* -dt indicates to the debugger that threads will be used */
2970         if (*s == 't' && !isALNUM(s[1])) {
2971             ++s;
2972             my_setenv("PERL5DB_THREADED", "1");
2973         }
2974
2975         /* The following permits -d:Mod to accepts arguments following an =
2976            in the fashion that -MSome::Mod does. */
2977         if (*s == ':' || *s == '=') {
2978             const char *start;
2979             SV *sv;
2980             sv = newSVpv("use Devel::", 0);
2981             start = ++s;
2982             /* We now allow -d:Module=Foo,Bar */
2983             while(isALNUM(*s) || *s==':') ++s;
2984             if (*s != '=')
2985                 sv_catpv(sv, start);
2986             else {
2987                 sv_catpvn(sv, start, s-start);
2988                 Perl_sv_catpvf(aTHX_ sv, " split(/,/,q%c%s%c)", 0, ++s, 0);
2989             }
2990             s += strlen(s);
2991             my_setenv("PERL5DB", SvPV_nolen_const(sv));
2992         }
2993         if (!PL_perldb) {
2994             PL_perldb = PERLDB_ALL;
2995             init_debugger();
2996         }
2997         return s;
2998     case 'D':
2999     {   
3000 #ifdef DEBUGGING
3001         forbid_setid("-D");
3002         s++;
3003         PL_debug = get_debug_opts( (const char **)&s, 1) | DEBUG_TOP_FLAG;
3004 #else /* !DEBUGGING */
3005         if (ckWARN_d(WARN_DEBUGGING))
3006             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3007                    "Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)\n");
3008         for (s++; isALNUM(*s); s++) ;
3009 #endif
3010         return s;
3011     }   
3012     case 'h':
3013         usage(PL_origargv[0]);
3014         my_exit(0);
3015     case 'i':
3016         Safefree(PL_inplace);
3017 #if defined(__CYGWIN__) /* do backup extension automagically */
3018         if (*(s+1) == '\0') {
3019         PL_inplace = savepv(".bak");
3020         return s+1;
3021         }
3022 #endif /* __CYGWIN__ */
3023         PL_inplace = savepv(s+1);
3024         for (s = PL_inplace; *s && !isSPACE(*s); s++)
3025             ;
3026         if (*s) {
3027             *s++ = '\0';
3028             if (*s == '-')      /* Additional switches on #! line. */
3029                 s++;
3030         }
3031         return s;
3032     case 'I':   /* -I handled both here and in parse_body() */
3033         forbid_setid("-I");
3034         ++s;
3035         while (*s && isSPACE(*s))
3036             ++s;
3037         if (*s) {
3038             char *e, *p;
3039             p = s;
3040             /* ignore trailing spaces (possibly followed by other switches) */
3041             do {
3042                 for (e = p; *e && !isSPACE(*e); e++) ;
3043                 p = e;
3044                 while (isSPACE(*p))
3045                     p++;
3046             } while (*p && *p != '-');
3047             e = savepvn(s, e-s);
3048             incpush(e, TRUE, TRUE, FALSE, FALSE);
3049             Safefree(e);
3050             s = p;
3051             if (*s == '-')
3052                 s++;
3053         }
3054         else
3055             Perl_croak(aTHX_ "No directory specified for -I");
3056         return s;
3057     case 'l':
3058         PL_minus_l = TRUE;
3059         s++;
3060         if (PL_ors_sv) {
3061             SvREFCNT_dec(PL_ors_sv);
3062             PL_ors_sv = Nullsv;
3063         }
3064         if (isDIGIT(*s)) {
3065             I32 flags = 0;
3066             STRLEN numlen;
3067             PL_ors_sv = newSVpvn("\n",1);
3068             numlen = 3 + (*s == '0');
3069             *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
3070             s += numlen;
3071         }
3072         else {
3073             if (RsPARA(PL_rs)) {
3074                 PL_ors_sv = newSVpvn("\n\n",2);
3075             }
3076             else {
3077                 PL_ors_sv = newSVsv(PL_rs);
3078             }
3079         }
3080         return s;
3081     case 'A':
3082         forbid_setid("-A");
3083         if (!PL_preambleav)
3084             PL_preambleav = newAV();
3085         s++;
3086         {
3087             char *start = s;
3088             SV *sv = newSVpv("use assertions::activate", 24);
3089             while(isALNUM(*s) || *s == ':') ++s;
3090             if (s != start) {
3091                 sv_catpvn(sv, "::", 2);
3092                 sv_catpvn(sv, start, s-start);
3093             }
3094             if (*s == '=') {
3095                 Perl_sv_catpvf(aTHX_ sv, " split(/,/,q%c%s%c)", 0, ++s, 0);
3096                 s+=strlen(s);
3097             }
3098             else if (*s != '\0') {
3099                 Perl_croak(aTHX_ "Can't use '%c' after -A%.*s", *s, s-start, start);
3100             }
3101             av_push(PL_preambleav, sv);
3102             return s;
3103         }
3104     case 'M':
3105         forbid_setid("-M");     /* XXX ? */
3106         /* FALL THROUGH */
3107     case 'm':
3108         forbid_setid("-m");     /* XXX ? */
3109         if (*++s) {
3110             char *start;
3111             SV *sv;
3112             const char *use = "use ";
3113             /* -M-foo == 'no foo'       */
3114             /* Leading space on " no " is deliberate, to make both
3115                possibilities the same length.  */
3116             if (*s == '-') { use = " no "; ++s; }
3117             sv = newSVpvn(use,4);
3118             start = s;
3119             /* We allow -M'Module qw(Foo Bar)'  */
3120             while(isALNUM(*s) || *s==':') ++s;
3121             if (*s != '=') {
3122                 sv_catpv(sv, start);
3123                 if (*(start-1) == 'm') {
3124                     if (*s != '\0')
3125                         Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
3126                     sv_catpv( sv, " ()");
3127                 }
3128             } else {
3129                 if (s == start)
3130                     Perl_croak(aTHX_ "Module name required with -%c option",
3131                                s[-1]);
3132                 sv_catpvn(sv, start, s-start);
3133                 sv_catpv(sv, " split(/,/,q");
3134                 sv_catpvn(sv, "\0)", 1);        /* Use NUL as q//-delimiter. */
3135                 sv_catpv(sv, ++s);
3136                 sv_catpvn(sv,  "\0)", 2);
3137             }
3138             s += strlen(s);
3139             if (!PL_preambleav)
3140                 PL_preambleav = newAV();
3141             av_push(PL_preambleav, sv);
3142         }
3143         else
3144             Perl_croak(aTHX_ "Missing argument to -%c", *(s-1));
3145         return s;
3146     case 'n':
3147         PL_minus_n = TRUE;
3148         s++;
3149         return s;
3150     case 'p':
3151         PL_minus_p = TRUE;
3152         s++;
3153         return s;
3154     case 's':
3155         forbid_setid("-s");
3156         PL_doswitches = TRUE;
3157         s++;
3158         return s;
3159     case 't':
3160         if (!PL_tainting)
3161             TOO_LATE_FOR('t');
3162         s++;
3163         return s;
3164     case 'T':
3165         if (!PL_tainting)
3166             TOO_LATE_FOR('T');
3167         s++;
3168         return s;
3169     case 'u':
3170 #ifdef MACOS_TRADITIONAL
3171         Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
3172 #endif
3173         PL_do_undump = TRUE;
3174         s++;
3175         return s;
3176     case 'U':
3177         PL_unsafe = TRUE;
3178         s++;
3179         return s;
3180     case 'v':
3181         if (!sv_derived_from(PL_patchlevel, "version"))
3182                 (void *)upg_version(PL_patchlevel);
3183 #if !defined(DGUX)
3184         PerlIO_printf(PerlIO_stdout(),
3185                 Perl_form(aTHX_ "\nThis is perl, %"SVf" built for %s",
3186                     vstringify(PL_patchlevel),
3187                     ARCHNAME));
3188 #else /* DGUX */
3189 /* Adjust verbose output as in the perl that ships with the DG/UX OS from EMC */
3190         PerlIO_printf(PerlIO_stdout(),
3191                 Perl_form(aTHX_ "\nThis is perl, %"SVf"\n",
3192                     vstringify(PL_patchlevel)));
3193         PerlIO_printf(PerlIO_stdout(),
3194                         Perl_form(aTHX_ "        built under %s at %s %s\n",
3195                                         OSNAME, __DATE__, __TIME__));
3196         PerlIO_printf(PerlIO_stdout(),
3197                         Perl_form(aTHX_ "        OS Specific Release: %s\n",
3198                                         OSVERS));
3199 #endif /* !DGUX */
3200
3201 #if defined(LOCAL_PATCH_COUNT)
3202         if (LOCAL_PATCH_COUNT > 0)
3203             PerlIO_printf(PerlIO_stdout(),
3204                           "\n(with %d registered patch%s, "
3205                           "see perl -V for more detail)",
3206                           (int)LOCAL_PATCH_COUNT,
3207                           (LOCAL_PATCH_COUNT!=1) ? "es" : "");
3208 #endif
3209
3210         PerlIO_printf(PerlIO_stdout(),
3211                       "\n\nCopyright 1987-2005, Larry Wall\n");
3212 #ifdef MACOS_TRADITIONAL
3213         PerlIO_printf(PerlIO_stdout(),
3214                       "\nMac OS port Copyright 1991-2002, Matthias Neeracher;\n"
3215                       "maintained by Chris Nandor\n");
3216 #endif
3217 #ifdef MSDOS
3218         PerlIO_printf(PerlIO_stdout(),
3219                       "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
3220 #endif
3221 #ifdef DJGPP
3222         PerlIO_printf(PerlIO_stdout(),
3223                       "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
3224                       "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
3225 #endif
3226 #ifdef OS2
3227         PerlIO_printf(PerlIO_stdout(),
3228                       "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
3229                       "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
3230 #endif
3231 #ifdef atarist
3232         PerlIO_printf(PerlIO_stdout(),
3233                       "atariST series port, ++jrb  bammi@cadence.com\n");
3234 #endif
3235 #ifdef __BEOS__
3236         PerlIO_printf(PerlIO_stdout(),
3237                       "BeOS port Copyright Tom Spindler, 1997-1999\n");
3238 #endif
3239 #ifdef MPE
3240         PerlIO_printf(PerlIO_stdout(),
3241                       "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-2003\n");
3242 #endif
3243 #ifdef OEMVS
3244         PerlIO_printf(PerlIO_stdout(),
3245                       "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
3246 #endif
3247 #ifdef __VOS__
3248         PerlIO_printf(PerlIO_stdout(),
3249                       "Stratus VOS port by Paul.Green@stratus.com, 1997-2002\n");
3250 #endif
3251 #ifdef __OPEN_VM
3252         PerlIO_printf(PerlIO_stdout(),
3253                       "VM/ESA port by Neale Ferguson, 1998-1999\n");
3254 #endif
3255 #ifdef POSIX_BC
3256         PerlIO_printf(PerlIO_stdout(),
3257                       "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
3258 #endif
3259 #ifdef __MINT__
3260         PerlIO_printf(PerlIO_stdout(),
3261                       "MiNT port by Guido Flohr, 1997-1999\n");
3262 #endif
3263 #ifdef EPOC
3264         PerlIO_printf(PerlIO_stdout(),
3265                       "EPOC port by Olaf Flebbe, 1999-2002\n");
3266 #endif
3267 #ifdef UNDER_CE
3268         PerlIO_printf(PerlIO_stdout(),"WINCE port by Rainer Keuchel, 2001-2002\n");
3269         PerlIO_printf(PerlIO_stdout(),"Built on " __DATE__ " " __TIME__ "\n\n");
3270         wce_hitreturn();
3271 #endif
3272 #ifdef SYMBIAN
3273         PerlIO_printf(PerlIO_stdout(),
3274                       "Symbian port by Nokia, 2004-2005\n");
3275 #endif
3276 #ifdef BINARY_BUILD_NOTICE
3277         BINARY_BUILD_NOTICE;
3278 #endif
3279         PerlIO_printf(PerlIO_stdout(),
3280                       "\n\
3281 Perl may be copied only under the terms of either the Artistic License or the\n\
3282 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
3283 Complete documentation for Perl, including FAQ lists, should be found on\n\
3284 this system using \"man perl\" or \"perldoc perl\".  If you have access to the\n\
3285 Internet, point your browser at http://www.perl.org/, the Perl Home Page.\n\n");
3286         my_exit(0);
3287     case 'w':
3288         if (! (PL_dowarn & G_WARN_ALL_MASK))
3289             PL_dowarn |= G_WARN_ON;
3290         s++;
3291         return s;
3292     case 'W':
3293         PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
3294         if (!specialWARN(PL_compiling.cop_warnings))
3295             SvREFCNT_dec(PL_compiling.cop_warnings);
3296         PL_compiling.cop_warnings = pWARN_ALL ;
3297         s++;
3298         return s;
3299     case 'X':
3300         PL_dowarn = G_WARN_ALL_OFF;
3301         if (!specialWARN(PL_compiling.cop_warnings))
3302             SvREFCNT_dec(PL_compiling.cop_warnings);
3303         PL_compiling.cop_warnings = pWARN_NONE ;
3304         s++;
3305         return s;
3306     case '*':
3307     case ' ':
3308         if (s[1] == '-')        /* Additional switches on #! line. */
3309             return s+2;
3310         break;
3311     case '-':
3312     case 0:
3313 #if defined(WIN32) || !defined(PERL_STRICT_CR)
3314     case '\r':
3315 #endif
3316     case '\n':
3317     case '\t':
3318         break;
3319 #ifdef ALTERNATE_SHEBANG
3320     case 'S':                   /* OS/2 needs -S on "extproc" line. */
3321         break;
3322 #endif
3323     case 'P':
3324         if (PL_preprocess)
3325             return s+1;
3326         /* FALL THROUGH */
3327     default:
3328         Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
3329     }
3330     return Nullch;
3331 }
3332
3333 /* compliments of Tom Christiansen */
3334
3335 /* unexec() can be found in the Gnu emacs distribution */
3336 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
3337
3338 void
3339 Perl_my_unexec(pTHX)
3340 {
3341 #ifdef UNEXEC
3342     SV*    prog;
3343     SV*    file;
3344     int    status = 1;
3345     extern int etext;
3346
3347     prog = newSVpv(BIN_EXP, 0);
3348     sv_catpv(prog, "/perl");
3349     file = newSVpv(PL_origfilename, 0);
3350     sv_catpv(file, ".perldump");
3351
3352     unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
3353     /* unexec prints msg to stderr in case of failure */
3354     PerlProc_exit(status);
3355 #else
3356 #  ifdef VMS
3357 #    include <lib$routines.h>
3358      lib$signal(SS$_DEBUG);  /* ssdef.h #included from vmsish.h */
3359 #  else
3360     ABORT();            /* for use with undump */
3361 #  endif
3362 #endif
3363 }
3364
3365 /* initialize curinterp */
3366 STATIC void
3367 S_init_interp(pTHX)
3368 {
3369
3370 #ifdef MULTIPLICITY
3371 #  define PERLVAR(var,type)
3372 #  define PERLVARA(var,n,type)
3373 #  if defined(PERL_IMPLICIT_CONTEXT)
3374 #    if defined(USE_5005THREADS)
3375 #      define PERLVARI(var,type,init)           PERL_GET_INTERP->var = init;
3376 #      define PERLVARIC(var,type,init)          PERL_GET_INTERP->var = init;
3377 #    else /* !USE_5005THREADS */
3378 #      define PERLVARI(var,type,init)           aTHX->var = init;
3379 #      define PERLVARIC(var,type,init)  aTHX->var = init;
3380 #    endif /* USE_5005THREADS */
3381 #  else
3382 #    define PERLVARI(var,type,init)     PERL_GET_INTERP->var = init;
3383 #    define PERLVARIC(var,type,init)    PERL_GET_INTERP->var = init;
3384 #  endif
3385 #  include "intrpvar.h"
3386 #  ifndef USE_5005THREADS
3387 #    include "thrdvar.h"
3388 #  endif
3389 #  undef PERLVAR
3390 #  undef PERLVARA
3391 #  undef PERLVARI
3392 #  undef PERLVARIC
3393 #else
3394 #  define PERLVAR(var,type)
3395 #  define PERLVARA(var,n,type)
3396 #  define PERLVARI(var,type,init)       PL_##var = init;
3397 #  define PERLVARIC(var,type,init)      PL_##var = init;
3398 #  include "intrpvar.h"
3399 #  ifndef USE_5005THREADS
3400 #    include "thrdvar.h"
3401 #  endif
3402 #  undef PERLVAR
3403 #  undef PERLVARA
3404 #  undef PERLVARI
3405 #  undef PERLVARIC
3406 #endif
3407
3408 }
3409
3410 STATIC void
3411 S_init_main_stash(pTHX)
3412 {
3413     GV *gv;
3414
3415     PL_curstash = PL_defstash = newHV();
3416     PL_curstname = newSVpvn("main",4);
3417     gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
3418     SvREFCNT_dec(GvHV(gv));
3419     GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
3420     SvREADONLY_on(gv);
3421     hv_name_set(PL_defstash, "main", 4, 0);
3422     PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
3423     GvMULTI_on(PL_incgv);
3424     PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
3425     GvMULTI_on(PL_hintgv);
3426     PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
3427     PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
3428     GvMULTI_on(PL_errgv);
3429     PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
3430     GvMULTI_on(PL_replgv);
3431     (void)Perl_form(aTHX_ "%240s","");  /* Preallocate temp - for immediate signals. */
3432 #ifdef PERL_DONT_CREATE_GVSV
3433     gv_SVadd(PL_errgv);
3434 #endif
3435     sv_grow(ERRSV, 240);        /* Preallocate - for immediate signals. */
3436     sv_setpvn(ERRSV, "", 0);
3437     PL_curstash = PL_defstash;
3438     CopSTASH_set(&PL_compiling, PL_defstash);
3439     PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
3440     PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
3441     /* We must init $/ before switches are processed. */
3442     sv_setpvn(get_sv("/", TRUE), "\n", 1);
3443 }
3444
3445 /* PSz 18 Nov 03  fdscript now global but do not change prototype */
3446 STATIC void
3447 S_open_script(pTHX_ const char *scriptname, bool dosearch, SV *sv)
3448 {
3449 #ifndef IAMSUID
3450     const char *quote;
3451     const char *code;
3452     const char *cpp_discard_flag;
3453     const char *perl;
3454 #endif
3455     dVAR;
3456
3457     PL_fdscript = -1;
3458     PL_suidscript = -1;
3459
3460     if (PL_e_script) {
3461         PL_origfilename = savepvn("-e", 2);
3462     }
3463     else {
3464         /* if find_script() returns, it returns a malloc()-ed value */
3465         scriptname = PL_origfilename = find_script(scriptname, dosearch, NULL, 1);
3466
3467         if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
3468             const char *s = scriptname + 8;
3469             PL_fdscript = atoi(s);
3470             while (isDIGIT(*s))
3471                 s++;
3472             if (*s) {
3473                 /* PSz 18 Feb 04
3474                  * Tell apart "normal" usage of fdscript, e.g.
3475                  * with bash on FreeBSD:
3476                  *   perl <( echo '#!perl -DA'; echo 'print "$0\n"')
3477                  * from usage in suidperl.
3478                  * Does any "normal" usage leave garbage after the number???
3479                  * Is it a mistake to use a similar /dev/fd/ construct for
3480                  * suidperl?
3481                  */
3482                 PL_suidscript = 1;
3483                 /* PSz 20 Feb 04  
3484                  * Be supersafe and do some sanity-checks.
3485                  * Still, can we be sure we got the right thing?
3486                  */
3487                 if (*s != '/') {
3488                     Perl_croak(aTHX_ "Wrong syntax (suid) fd script name \"%s\"\n", s);
3489                 }
3490                 if (! *(s+1)) {
3491                     Perl_croak(aTHX_ "Missing (suid) fd script name\n");
3492                 }
3493                 scriptname = savepv(s + 1);
3494                 Safefree(PL_origfilename);
3495                 PL_origfilename = (char *)scriptname;
3496             }
3497         }
3498     }
3499
3500     CopFILE_free(PL_curcop);
3501     CopFILE_set(PL_curcop, PL_origfilename);
3502     if (*PL_origfilename == '-' && PL_origfilename[1] == '\0')
3503         scriptname = (char *)"";
3504     if (PL_fdscript >= 0) {
3505         PL_rsfp = PerlIO_fdopen(PL_fdscript,PERL_SCRIPT_MODE);
3506 #       if defined(HAS_FCNTL) && defined(F_SETFD)
3507             if (PL_rsfp)
3508                 /* ensure close-on-exec */
3509                 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
3510 #       endif
3511     }
3512 #ifdef IAMSUID
3513     else {
3514         Perl_croak(aTHX_ "sperl needs fd script\n"
3515                    "You should not call sperl directly; do you need to "
3516                    "change a #! line\nfrom sperl to perl?\n");
3517
3518 /* PSz 11 Nov 03
3519  * Do not open (or do other fancy stuff) while setuid.
3520  * Perl does the open, and hands script to suidperl on a fd;
3521  * suidperl only does some checks, sets up UIDs and re-execs
3522  * perl with that fd as it has always done.
3523  */
3524     }
3525     if (PL_suidscript != 1) {
3526         Perl_croak(aTHX_ "suidperl needs (suid) fd script\n");
3527     }
3528 #else /* IAMSUID */
3529     else if (PL_preprocess) {
3530         const char *cpp_cfg = CPPSTDIN;
3531         SV *cpp = newSVpvn("",0);
3532         SV *cmd = NEWSV(0,0);
3533
3534         if (cpp_cfg[0] == 0) /* PERL_MICRO? */
3535              Perl_croak(aTHX_ "Can't run with cpp -P with CPPSTDIN undefined");
3536         if (strEQ(cpp_cfg, "cppstdin"))
3537             Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
3538         sv_catpv(cpp, cpp_cfg);
3539
3540 #       ifndef VMS
3541             sv_catpvn(sv, "-I", 2);
3542             sv_catpv(sv,PRIVLIB_EXP);
3543 #       endif
3544
3545         DEBUG_P(PerlIO_printf(Perl_debug_log,
3546                               "PL_preprocess: scriptname=\"%s\", cpp=\"%s\", sv=\"%s\", CPPMINUS=\"%s\"\n",
3547                               scriptname, SvPVX_const (cpp), SvPVX_const (sv),
3548                               CPPMINUS));
3549
3550 #       if defined(MSDOS) || defined(WIN32) || defined(VMS)
3551             quote = "\"";
3552 #       else
3553             quote = "'";
3554 #       endif
3555
3556 #       ifdef VMS
3557             cpp_discard_flag = "";
3558 #       else
3559             cpp_discard_flag = "-C";
3560 #       endif
3561
3562 #       ifdef OS2
3563             perl = os2_execname(aTHX);
3564 #       else
3565             perl = PL_origargv[0];
3566 #       endif
3567
3568
3569         /* This strips off Perl comments which might interfere with
3570            the C pre-processor, including #!.  #line directives are
3571            deliberately stripped to avoid confusion with Perl's version
3572            of #line.  FWP played some golf with it so it will fit
3573            into VMS's 255 character buffer.
3574         */
3575         if( PL_doextract )
3576             code = "(1../^#!.*perl/i)|/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
3577         else
3578             code = "/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
3579
3580         Perl_sv_setpvf(aTHX_ cmd, "\
3581 %s -ne%s%s%s %s | %"SVf" %s %"SVf" %s",
3582                        perl, quote, code, quote, scriptname, cpp,
3583                        cpp_discard_flag, sv, CPPMINUS);
3584
3585         PL_doextract = FALSE;
3586
3587         DEBUG_P(PerlIO_printf(Perl_debug_log,
3588                               "PL_preprocess: cmd=\"%s\"\n",
3589                               SvPVX_const(cmd)));
3590
3591         PL_rsfp = PerlProc_popen((char *)SvPVX_const(cmd), (char *)"r");
3592         SvREFCNT_dec(cmd);
3593         SvREFCNT_dec(cpp);
3594     }
3595     else if (!*scriptname) {
3596         forbid_setid("program input from stdin");
3597         PL_rsfp = PerlIO_stdin();
3598     }
3599     else {
3600         PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
3601 #       if defined(HAS_FCNTL) && defined(F_SETFD)
3602             if (PL_rsfp)
3603                 /* ensure close-on-exec */
3604                 fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);
3605 #       endif
3606     }
3607 #endif /* IAMSUID */
3608     if (!PL_rsfp) {
3609         /* PSz 16 Sep 03  Keep neat error message */
3610         Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3611                 CopFILE(PL_curcop), Strerror(errno));
3612     }
3613 }
3614
3615 /* Mention
3616  * I_SYSSTATVFS HAS_FSTATVFS
3617  * I_SYSMOUNT
3618  * I_STATFS     HAS_FSTATFS     HAS_GETFSSTAT
3619  * I_MNTENT     HAS_GETMNTENT   HAS_HASMNTOPT
3620  * here so that metaconfig picks them up. */
3621
3622 #ifdef IAMSUID
3623 STATIC int
3624 S_fd_on_nosuid_fs(pTHX_ int fd)
3625 {
3626 /* PSz 27 Feb 04
3627  * We used to do this as "plain" user (after swapping UIDs with setreuid);
3628  * but is needed also on machines without setreuid.
3629  * Seems safe enough to run as root.
3630  */
3631     int check_okay = 0; /* able to do all the required sys/libcalls */
3632     int on_nosuid  = 0; /* the fd is on a nosuid fs */
3633     /* PSz 12 Nov 03
3634      * Need to check noexec also: nosuid might not be set, the average
3635      * sysadmin would say that nosuid is irrelevant once he sets noexec.
3636      */
3637     int on_noexec  = 0; /* the fd is on a noexec fs */
3638
3639 /*
3640  * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
3641  * fstatvfs() is UNIX98.
3642  * fstatfs() is 4.3 BSD.
3643  * ustat()+getmnt() is pre-4.3 BSD.
3644  * getmntent() is O(number-of-mounted-filesystems) and can hang on
3645  * an irrelevant filesystem while trying to reach the right one.
3646  */
3647
3648 #undef FD_ON_NOSUID_CHECK_OKAY  /* found the syscalls to do the check? */
3649
3650 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3651         defined(HAS_FSTATVFS)
3652 #   define FD_ON_NOSUID_CHECK_OKAY
3653     struct statvfs stfs;
3654
3655     check_okay = fstatvfs(fd, &stfs) == 0;
3656     on_nosuid  = check_okay && (stfs.f_flag  & ST_NOSUID);
3657 #ifdef ST_NOEXEC
3658     /* ST_NOEXEC certainly absent on AIX 5.1, and doesn't seem to be documented
3659        on platforms where it is present.  */
3660     on_noexec  = check_okay && (stfs.f_flag  & ST_NOEXEC);
3661 #endif
3662 #   endif /* fstatvfs */
3663
3664 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3665         defined(PERL_MOUNT_NOSUID)      && \
3666         defined(PERL_MOUNT_NOEXEC)      && \
3667         defined(HAS_FSTATFS)            && \
3668         defined(HAS_STRUCT_STATFS)      && \
3669         defined(HAS_STRUCT_STATFS_F_FLAGS)
3670 #   define FD_ON_NOSUID_CHECK_OKAY
3671     struct statfs  stfs;
3672
3673     check_okay = fstatfs(fd, &stfs)  == 0;
3674     on_nosuid  = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
3675     on_noexec  = check_okay && (stfs.f_flags & PERL_MOUNT_NOEXEC);
3676 #   endif /* fstatfs */
3677
3678 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3679         defined(PERL_MOUNT_NOSUID)      && \
3680         defined(PERL_MOUNT_NOEXEC)      && \
3681         defined(HAS_FSTAT)              && \
3682         defined(HAS_USTAT)              && \
3683         defined(HAS_GETMNT)             && \
3684         defined(HAS_STRUCT_FS_DATA)     && \
3685         defined(NOSTAT_ONE)
3686 #   define FD_ON_NOSUID_CHECK_OKAY
3687     Stat_t fdst;
3688
3689     if (fstat(fd, &fdst) == 0) {
3690         struct ustat us;
3691         if (ustat(fdst.st_dev, &us) == 0) {
3692             struct fs_data fsd;
3693             /* NOSTAT_ONE here because we're not examining fields which
3694              * vary between that case and STAT_ONE. */
3695             if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
3696                 size_t cmplen = sizeof(us.f_fname);
3697                 if (sizeof(fsd.fd_req.path) < cmplen)
3698                     cmplen = sizeof(fsd.fd_req.path);
3699                 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
3700                     fdst.st_dev == fsd.fd_req.dev) {
3701                         check_okay = 1;
3702                         on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
3703                         on_noexec = fsd.fd_req.flags & PERL_MOUNT_NOEXEC;
3704                     }
3705                 }
3706             }
3707         }
3708     }
3709 #   endif /* fstat+ustat+getmnt */
3710
3711 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3712         defined(HAS_GETMNTENT)          && \
3713         defined(HAS_HASMNTOPT)          && \
3714         defined(MNTOPT_NOSUID)          && \
3715         defined(MNTOPT_NOEXEC)
3716 #   define FD_ON_NOSUID_CHECK_OKAY
3717     FILE                *mtab = fopen("/etc/mtab", "r");
3718     struct mntent       *entry;
3719     Stat_t              stb, fsb;
3720
3721     if (mtab && (fstat(fd, &stb) == 0)) {
3722         while (entry = getmntent(mtab)) {
3723             if (stat(entry->mnt_dir, &fsb) == 0
3724                 && fsb.st_dev == stb.st_dev)
3725             {
3726                 /* found the filesystem */
3727                 check_okay = 1;
3728                 if (hasmntopt(entry, MNTOPT_NOSUID))
3729                     on_nosuid = 1;
3730                 if (hasmntopt(entry, MNTOPT_NOEXEC))
3731                     on_noexec = 1;
3732                 break;
3733             } /* A single fs may well fail its stat(). */
3734         }
3735     }
3736     if (mtab)
3737         fclose(mtab);
3738 #   endif /* getmntent+hasmntopt */
3739
3740     if (!check_okay)
3741         Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid/noexec", PL_origfilename);
3742     if (on_nosuid)
3743         Perl_croak(aTHX_ "Setuid script \"%s\" on nosuid filesystem", PL_origfilename);
3744     if (on_noexec)
3745         Perl_croak(aTHX_ "Setuid script \"%s\" on noexec filesystem", PL_origfilename);
3746     return ((!check_okay) || on_nosuid || on_noexec);
3747 }
3748 #endif /* IAMSUID */
3749
3750 STATIC void
3751 S_validate_suid(pTHX_ const char *validarg, const char *scriptname)
3752 {
3753     dVAR;
3754 #ifdef IAMSUID
3755     /* int which; */
3756 #endif /* IAMSUID */
3757
3758     /* do we need to emulate setuid on scripts? */
3759
3760     /* This code is for those BSD systems that have setuid #! scripts disabled
3761      * in the kernel because of a security problem.  Merely defining DOSUID
3762      * in perl will not fix that problem, but if you have disabled setuid
3763      * scripts in the kernel, this will attempt to emulate setuid and setgid
3764      * on scripts that have those now-otherwise-useless bits set.  The setuid
3765      * root version must be called suidperl or sperlN.NNN.  If regular perl
3766      * discovers that it has opened a setuid script, it calls suidperl with
3767      * the same argv that it had.  If suidperl finds that the script it has
3768      * just opened is NOT setuid root, it sets the effective uid back to the
3769      * uid.  We don't just make perl setuid root because that loses the
3770      * effective uid we had before invoking perl, if it was different from the
3771      * uid.
3772      * PSz 27 Feb 04
3773      * Description/comments above do not match current workings:
3774      *   suidperl must be hardlinked to sperlN.NNN (that is what we exec);
3775      *   suidperl called with script open and name changed to /dev/fd/N/X;
3776      *   suidperl croaks if script is not setuid;
3777      *   making perl setuid would be a huge security risk (and yes, that
3778      *     would lose any euid we might have had).
3779      *
3780      * DOSUID must be defined in both perl and suidperl, and IAMSUID must
3781      * be defined in suidperl only.  suidperl must be setuid root.  The
3782      * Configure script will set this up for you if you want it.
3783      */
3784
3785 #ifdef DOSUID
3786     const char *s, *s2;
3787
3788     if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0)  /* normal stat is insecure */
3789         Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
3790     if (PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
3791         I32 len;
3792         const char *linestr;
3793
3794 #ifdef IAMSUID
3795         if (PL_fdscript < 0 || PL_suidscript != 1)
3796             Perl_croak(aTHX_ "Need (suid) fdscript in suidperl\n");     /* We already checked this */
3797         /* PSz 11 Nov 03
3798          * Since the script is opened by perl, not suidperl, some of these
3799          * checks are superfluous. Leaving them in probably does not lower
3800          * security(?!).
3801          */
3802         /* PSz 27 Feb 04
3803          * Do checks even for systems with no HAS_SETREUID.
3804          * We used to swap, then re-swap UIDs with
3805 #ifdef HAS_SETREUID
3806             if (setreuid(PL_euid,PL_uid) < 0
3807                 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
3808                 Perl_croak(aTHX_ "Can't swap uid and euid");
3809 #endif
3810 #ifdef HAS_SETREUID
3811             if (setreuid(PL_uid,PL_euid) < 0
3812                 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
3813                 Perl_croak(aTHX_ "Can't reswap uid and euid");
3814 #endif
3815          */
3816
3817         /* On this access check to make sure the directories are readable,
3818          * there is actually a small window that the user could use to make
3819          * filename point to an accessible directory.  So there is a faint
3820          * chance that someone could execute a setuid script down in a
3821          * non-accessible directory.  I don't know what to do about that.
3822          * But I don't think it's too important.  The manual lies when
3823          * it says access() is useful in setuid programs.
3824          * 
3825          * So, access() is pretty useless... but not harmful... do anyway.
3826          */
3827         if (PerlLIO_access(CopFILE(PL_curcop),1)) { /*double check*/
3828             Perl_croak(aTHX_ "Can't access() script\n");
3829         }
3830
3831         /* If we can swap euid and uid, then we can determine access rights
3832          * with a simple stat of the file, and then compare device and
3833          * inode to make sure we did stat() on the same file we opened.
3834          * Then we just have to make sure he or she can execute it.
3835          * 
3836          * PSz 24 Feb 04
3837          * As the script is opened by perl, not suidperl, we do not need to
3838          * care much about access rights.
3839          * 
3840          * The 'script changed' check is needed, or we can get lied to
3841          * about $0 with e.g.
3842          *  suidperl /dev/fd/4//bin/x 4<setuidscript
3843          * Without HAS_SETREUID, is it safe to stat() as root?
3844          * 
3845          * Are there any operating systems that pass /dev/fd/xxx for setuid
3846          * scripts, as suggested/described in perlsec(1)? Surely they do not
3847          * pass the script name as we do, so the "script changed" test would
3848          * fail for them... but we never get here with
3849          * SETUID_SCRIPTS_ARE_SECURE_NOW defined.
3850          * 
3851          * This is one place where we must "lie" about return status: not
3852          * say if the stat() failed. We are doing this as root, and could
3853          * be tricked into reporting existence or not of files that the
3854          * "plain" user cannot even see.
3855          */
3856         {
3857             Stat_t tmpstatbuf;
3858             if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0 ||
3859                 tmpstatbuf.st_dev != PL_statbuf.st_dev ||
3860                 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
3861                 Perl_croak(aTHX_ "Setuid script changed\n");
3862             }
3863
3864         }
3865         if (!cando(S_IXUSR,FALSE,&PL_statbuf))          /* can real uid exec? */
3866             Perl_croak(aTHX_ "Real UID cannot exec script\n");
3867
3868         /* PSz 27 Feb 04
3869          * We used to do this check as the "plain" user (after swapping
3870          * UIDs). But the check for nosuid and noexec filesystem is needed,
3871          * and should be done even without HAS_SETREUID. (Maybe those
3872          * operating systems do not have such mount options anyway...)
3873          * Seems safe enough to do as root.
3874          */
3875 #if !defined(NO_NOSUID_CHECK)
3876         if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp))) {
3877             Perl_croak(aTHX_ "Setuid script on nosuid or noexec filesystem\n");
3878         }
3879 #endif
3880 #endif /* IAMSUID */
3881
3882         if (!S_ISREG(PL_statbuf.st_mode)) {
3883             Perl_croak(aTHX_ "Setuid script not plain file\n");
3884         }
3885         if (PL_statbuf.st_mode & S_IWOTH)
3886             Perl_croak(aTHX_ "Setuid/gid script is writable by world");
3887         PL_doswitches = FALSE;          /* -s is insecure in suid */
3888         /* PSz 13 Nov 03  But -s was caught elsewhere ... so unsetting it here is useless(?!) */
3889         CopLINE_inc(PL_curcop);
3890         linestr = SvPV_nolen_const(PL_linestr);
3891         if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
3892           strnNE(linestr,"#!",2) )      /* required even on Sys V */
3893             Perl_croak(aTHX_ "No #! line");
3894         linestr+=2;
3895         s = linestr;
3896         /* PSz 27 Feb 04 */
3897         /* Sanity check on line length */
3898         if (strlen(s) < 1 || strlen(s) > 4000)
3899             Perl_croak(aTHX_ "Very long #! line");
3900         /* Allow more than a single space after #! */
3901         while (isSPACE(*s)) s++;
3902         /* Sanity check on buffer end */
3903         while ((*s) && !isSPACE(*s)) s++;
3904         for (s2 = s;  (s2 > linestr &&
3905                        (isDIGIT(s2[-1]) || s2[-1] == '.' || s2[-1] == '_'
3906                         || s2[-1] == '-'));  s2--) ;
3907         /* Sanity check on buffer start */
3908         if ( (s2-4 < linestr || strnNE(s2-4,"perl",4)) &&
3909               (s-9 < linestr || strnNE(s-9,"perl",4)) )
3910             Perl_croak(aTHX_ "Not a perl script");
3911         while (*s == ' ' || *s == '\t') s++;
3912         /*
3913          * #! arg must be what we saw above.  They can invoke it by
3914          * mentioning suidperl explicitly, but they may not add any strange
3915          * arguments beyond what #! says if they do invoke suidperl that way.
3916          */
3917         /*
3918          * The way validarg was set up, we rely on the kernel to start
3919          * scripts with argv[1] set to contain all #! line switches (the
3920          * whole line).
3921          */
3922         /*
3923          * Check that we got all the arguments listed in the #! line (not
3924          * just that there are no extraneous arguments). Might not matter
3925          * much, as switches from #! line seem to be acted upon (also), and
3926          * so may be checked and trapped in perl. But, security checks must
3927          * be done in suidperl and not deferred to perl. Note that suidperl
3928          * does not get around to parsing (and checking) the switches on
3929          * the #! line (but execs perl sooner).
3930          * Allow (require) a trailing newline (which may be of two
3931          * characters on some architectures?) (but no other trailing
3932          * whitespace).
3933          */
3934         len = strlen(validarg);
3935         if (strEQ(validarg," PHOOEY ") ||
3936             strnNE(s,validarg,len) || !isSPACE(s[len]) ||
3937             !(strlen(s) == len+1 || (strlen(s) == len+2 && isSPACE(s[len+1]))))
3938             Perl_croak(aTHX_ "Args must match #! line");
3939
3940 #ifndef IAMSUID
3941         if (PL_fdscript < 0 &&
3942             PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
3943             PL_euid == PL_statbuf.st_uid)
3944             if (!PL_do_undump)
3945                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3946 FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n");
3947 #endif /* IAMSUID */
3948
3949         if (PL_fdscript < 0 &&
3950             PL_euid) {  /* oops, we're not the setuid root perl */
3951             /* PSz 18 Feb 04
3952              * When root runs a setuid script, we do not go through the same
3953              * steps of execing sperl and then perl with fd scripts, but
3954              * simply set up UIDs within the same perl invocation; so do
3955              * not have the same checks (on options, whatever) that we have
3956              * for plain users. No problem really: would have to be a script
3957              * that does not actually work for plain users; and if root is
3958              * foolish and can be persuaded to run such an unsafe script, he
3959              * might run also non-setuid ones, and deserves what he gets.
3960              * 
3961              * Or, we might drop the PL_euid check above (and rely just on
3962              * PL_fdscript to avoid loops), and do the execs
3963              * even for root.
3964              */
3965 #ifndef IAMSUID
3966             int which;
3967             /* PSz 11 Nov 03
3968              * Pass fd script to suidperl.
3969              * Exec suidperl, substituting fd script for scriptname.
3970              * Pass script name as "subdir" of fd, which perl will grok;
3971              * in fact will use that to distinguish this from "normal"
3972              * usage, see comments above.
3973              */
3974             PerlIO_rewind(PL_rsfp);
3975             PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0);  /* just in case rewind didn't */
3976             /* PSz 27 Feb 04  Sanity checks on scriptname */
3977             if ((!scriptname) || (!*scriptname) ) {
3978                 Perl_croak(aTHX_ "No setuid script name\n");
3979             }
3980             if (*scriptname == '-') {
3981                 Perl_croak(aTHX_ "Setuid script name may not begin with dash\n");
3982                 /* Or we might confuse it with an option when replacing
3983                  * name in argument list, below (though we do pointer, not
3984                  * string, comparisons).
3985                  */
3986             }
3987             for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
3988             if (!PL_origargv[which]) {
3989                 Perl_croak(aTHX_ "Can't change argv to have fd script\n");
3990             }
3991             PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
3992                                           PerlIO_fileno(PL_rsfp), PL_origargv[which]));
3993 #if defined(HAS_FCNTL) && defined(F_SETFD)
3994             fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0);    /* ensure no close-on-exec */
3995 #endif
3996             PERL_FPU_PRE_EXEC
3997             PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
3998                                      (int)PERL_REVISION, (int)PERL_VERSION,
3999                                      (int)PERL_SUBVERSION), PL_origargv);
4000             PERL_FPU_POST_EXEC
4001 #endif /* IAMSUID */
4002             Perl_croak(aTHX_ "Can't do setuid (cannot exec sperl)\n");
4003         }
4004
4005         if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
4006 /* PSz 26 Feb 04
4007  * This seems back to front: we try HAS_SETEGID first; if not available
4008  * then try HAS_SETREGID; as a last chance we try HAS_SETRESGID. May be OK
4009  * in the sense that we only want to set EGID; but are there any machines
4010  * with either of the latter, but not the former? Same with UID, later.
4011  */
4012 #ifdef HAS_SETEGID
4013             (void)setegid(PL_statbuf.st_gid);
4014 #else
4015 #ifdef HAS_SETREGID
4016            (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
4017 #else
4018 #ifdef HAS_SETRESGID
4019            (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
4020 #else
4021             PerlProc_setgid(PL_statbuf.st_gid);
4022 #endif
4023 #endif
4024 #endif
4025             if (PerlProc_getegid() != PL_statbuf.st_gid)
4026                 Perl_croak(aTHX_ "Can't do setegid!\n");
4027         }
4028         if (PL_statbuf.st_mode & S_ISUID) {
4029             if (PL_statbuf.st_uid != PL_euid)
4030 #ifdef HAS_SETEUID
4031                 (void)seteuid(PL_statbuf.st_uid);       /* all that for this */
4032 #else
4033 #ifdef HAS_SETREUID
4034                 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
4035 #else
4036 #ifdef HAS_SETRESUID
4037                 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
4038 #else
4039                 PerlProc_setuid(PL_statbuf.st_uid);
4040 #endif
4041 #endif
4042 #endif
4043             if (PerlProc_geteuid() != PL_statbuf.st_uid)
4044                 Perl_croak(aTHX_ "Can't do seteuid!\n");
4045         }
4046         else if (PL_uid) {                      /* oops, mustn't run as root */
4047 #ifdef HAS_SETEUID
4048           (void)seteuid((Uid_t)PL_uid);
4049 #else
4050 #ifdef HAS_SETREUID
4051           (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
4052 #else
4053 #ifdef HAS_SETRESUID
4054           (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
4055 #else
4056           PerlProc_setuid((Uid_t)PL_uid);
4057 #endif
4058 #endif
4059 #endif
4060             if (PerlProc_geteuid() != PL_uid)
4061                 Perl_croak(aTHX_ "Can't do seteuid!\n");
4062         }
4063         init_ids();
4064         if (!cando(S_IXUSR,TRUE,&PL_statbuf))
4065             Perl_croak(aTHX_ "Effective UID cannot exec script\n");     /* they can't do this */
4066     }
4067 #ifdef IAMSUID
4068     else if (PL_preprocess)     /* PSz 13 Nov 03  Caught elsewhere, useless(?!) here */
4069         Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
4070     else if (PL_fdscript < 0 || PL_suidscript != 1)
4071         /* PSz 13 Nov 03  Caught elsewhere, useless(?!) here */
4072         Perl_croak(aTHX_ "(suid) fdscript needed in suidperl\n");
4073     else {
4074 /* PSz 16 Sep 03  Keep neat error message */
4075         Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
4076     }
4077
4078     /* We absolutely must clear out any saved ids here, so we */
4079     /* exec the real perl, substituting fd script for scriptname. */
4080     /* (We pass script name as "subdir" of fd, which perl will grok.) */
4081     /* 
4082      * It might be thought that using setresgid and/or setresuid (changed to
4083      * set the saved IDs) above might obviate the need to exec, and we could
4084      * go on to "do the perl thing".
4085      * 
4086      * Is there such a thing as "saved GID", and is that set for setuid (but
4087      * not setgid) execution like suidperl? Without exec, it would not be
4088      * cleared for setuid (but not setgid) scripts (or might need a dummy
4089      * setresgid).
4090      * 
4091      * We need suidperl to do the exact same argument checking that perl
4092      * does. Thus it cannot be very small; while it could be significantly
4093      * smaller, it is safer (simpler?) to make it essentially the same
4094      * binary as perl (but they are not identical). - Maybe could defer that
4095      * check to the invoked perl, and suidperl be a tiny wrapper instead;
4096      * but prefer to do thorough checks in suidperl itself. Such deferral
4097      * would make suidperl security rely on perl, a design no-no.
4098      * 
4099      * Setuid things should be short and simple, thus easy to understand and
4100      * verify. They should do their "own thing", without influence by
4101      * attackers. It may help if their internal execution flow is fixed,
4102      * regardless of platform: it may be best to exec anyway.
4103      * 
4104      * Suidperl should at least be conceptually simple: a wrapper only,
4105      * never to do any real perl. Maybe we should put
4106      * #ifdef IAMSUID
4107      *         Perl_croak(aTHX_ "Suidperl should never do real perl\n");
4108      * #endif
4109      * into the perly bits.
4110      */
4111     PerlIO_rewind(PL_rsfp);
4112     PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0);  /* just in case rewind didn't */
4113     /* PSz 11 Nov 03
4114      * Keep original arguments: suidperl already has fd script.
4115      */
4116 /*  for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;  */
4117 /*  if (!PL_origargv[which]) {                                          */
4118 /*      errno = EPERM;                                                  */
4119 /*      Perl_croak(aTHX_ "Permission denied\n");                        */
4120 /*  }                                                                   */
4121 /*  PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",        */
4122 /*                                PerlIO_fileno(PL_rsfp), PL_origargv[which])); */
4123 #if defined(HAS_FCNTL) && defined(F_SETFD)
4124     fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0);    /* ensure no close-on-exec */
4125 #endif
4126     PERL_FPU_PRE_EXEC
4127     PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
4128                              (int)PERL_REVISION, (int)PERL_VERSION,
4129                              (int)PERL_SUBVERSION), PL_origargv);/* try again */
4130     PERL_FPU_POST_EXEC
4131     Perl_croak(aTHX_ "Can't do setuid (suidperl cannot exec perl)\n");
4132 #endif /* IAMSUID */
4133 #else /* !DOSUID */
4134     if (PL_euid != PL_uid || PL_egid != PL_gid) {       /* (suidperl doesn't exist, in fact) */
4135 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
4136         PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf);      /* may be either wrapped or real suid */
4137         if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
4138             ||
4139             (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
4140            )
4141             if (!PL_do_undump)
4142                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
4143 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
4144 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
4145         /* not set-id, must be wrapped */
4146     }
4147 #endif /* DOSUID */
4148     (void)validarg;
4149     (void)scriptname;
4150 }
4151
4152 STATIC void
4153 S_find_beginning(pTHX)
4154 {
4155     register char *s;
4156     register const char *s2;
4157 #ifdef MACOS_TRADITIONAL
4158     int maclines = 0;
4159 #endif
4160
4161     /* skip forward in input to the real script? */
4162
4163     forbid_setid("-x");
4164 #ifdef MACOS_TRADITIONAL
4165     /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */
4166
4167     while (PL_doextract || gMacPerl_AlwaysExtract) {
4168         if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
4169             if (!gMacPerl_AlwaysExtract)
4170                 Perl_croak(aTHX_ "No Perl script found in input\n");
4171
4172             if (PL_doextract)                   /* require explicit override ? */
4173                 if (!OverrideExtract(PL_origfilename))
4174                     Perl_croak(aTHX_ "User aborted script\n");
4175                 else
4176                     PL_doextract = FALSE;
4177
4178             /* Pater peccavi, file does not have #! */
4179             PerlIO_rewind(PL_rsfp);
4180
4181             break;
4182         }
4183 #else
4184     while (PL_doextract) {
4185         if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
4186             Perl_croak(aTHX_ "No Perl script found in input\n");
4187 #endif
4188         s2 = s;
4189         if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) {
4190             PerlIO_ungetc(PL_rsfp, '\n');               /* to keep line count right */
4191             PL_doextract = FALSE;
4192             while (*s && !(isSPACE (*s) || *s == '#')) s++;
4193             s2 = s;
4194             while (*s == ' ' || *s == '\t') s++;
4195             if (*s++ == '-') {
4196                 while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.'
4197                        || s2[-1] == '_') s2--;
4198                 if (strnEQ(s2-4,"perl",4))
4199                     while ((s = moreswitches(s)))
4200                         ;
4201             }
4202 #ifdef MACOS_TRADITIONAL
4203             /* We are always searching for the #!perl line in MacPerl,
4204              * so if we find it, still keep the line count correct
4205              * by counting lines we already skipped over
4206              */
4207             for (; maclines > 0 ; maclines--)
4208                 PerlIO_ungetc(PL_rsfp, '\n');
4209
4210             break;
4211
4212         /* gMacPerl_AlwaysExtract is false in MPW tool */
4213         } else if (gMacPerl_AlwaysExtract) {
4214             ++maclines;
4215 #endif
4216         }
4217     }
4218 }
4219
4220
4221 STATIC void
4222 S_init_ids(pTHX)
4223 {
4224     PL_uid = PerlProc_getuid();
4225     PL_euid = PerlProc_geteuid();
4226     PL_gid = PerlProc_getgid();
4227     PL_egid = PerlProc_getegid();
4228 #ifdef VMS
4229     PL_uid |= PL_gid << 16;
4230     PL_euid |= PL_egid << 16;
4231 #endif
4232     /* Should not happen: */
4233     CHECK_MALLOC_TAINT(PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
4234     PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
4235     /* BUG */
4236     /* PSz 27 Feb 04
4237      * Should go by suidscript, not uid!=euid: why disallow
4238      * system("ls") in scripts run from setuid things?
4239      * Or, is this run before we check arguments and set suidscript?
4240      * What about SETUID_SCRIPTS_ARE_SECURE_NOW: could we use fdscript then?
4241      * (We never have suidscript, can we be sure to have fdscript?)
4242      * Or must then go by UID checks? See comments in forbid_setid also.
4243      */
4244 }
4245
4246 /* This is used very early in the lifetime of the program,
4247  * before even the options are parsed, so PL_tainting has
4248  * not been initialized properly.  */
4249 bool
4250 Perl_doing_taint(int argc, char *argv[], char *envp[])
4251 {
4252 #ifndef PERL_IMPLICIT_SYS
4253     /* If we have PERL_IMPLICIT_SYS we can't call getuid() et alia
4254      * before we have an interpreter-- and the whole point of this
4255      * function is to be called at such an early stage.  If you are on
4256      * a system with PERL_IMPLICIT_SYS but you do have a concept of
4257      * "tainted because running with altered effective ids', you'll
4258      * have to add your own checks somewhere in here.  The two most
4259      * known samples of 'implicitness' are Win32 and NetWare, neither
4260      * of which has much of concept of 'uids'. */
4261     int uid  = PerlProc_getuid();
4262     int euid = PerlProc_geteuid();
4263     int gid  = PerlProc_getgid();
4264     int egid = PerlProc_getegid();
4265     (void)envp;
4266
4267 #ifdef VMS
4268     uid  |=  gid << 16;
4269     euid |= egid << 16;
4270 #endif
4271     if (uid && (euid != uid || egid != gid))
4272         return 1;
4273 #endif /* !PERL_IMPLICIT_SYS */
4274     /* This is a really primitive check; environment gets ignored only
4275      * if -T are the first chars together; otherwise one gets
4276      *  "Too late" message. */
4277     if ( argc > 1 && argv[1][0] == '-'
4278          && (argv[1][1] == 't' || argv[1][1] == 'T') )
4279         return 1;
4280     return 0;
4281 }
4282
4283 STATIC void
4284 S_forbid_setid(pTHX_ const char *s)
4285 {
4286 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
4287     if (PL_euid != PL_uid)
4288         Perl_croak(aTHX_ "No %s allowed while running setuid", s);
4289     if (PL_egid != PL_gid)
4290         Perl_croak(aTHX_ "No %s allowed while running setgid", s);
4291 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
4292     /* PSz 29 Feb 04
4293      * Checks for UID/GID above "wrong": why disallow
4294      *   perl -e 'print "Hello\n"'
4295      * from within setuid things?? Simply drop them: replaced by
4296      * fdscript/suidscript and #ifdef IAMSUID checks below.
4297      * 
4298      * This may be too late for command-line switches. Will catch those on
4299      * the #! line, after finding the script name and setting up
4300      * fdscript/suidscript. Note that suidperl does not get around to
4301      * parsing (and checking) the switches on the #! line, but checks that
4302      * the two sets are identical.
4303      * 
4304      * With SETUID_SCRIPTS_ARE_SECURE_NOW, could we use fdscript, also or
4305      * instead, or would that be "too late"? (We never have suidscript, can
4306      * we be sure to have fdscript?)
4307      * 
4308      * Catch things with suidscript (in descendant of suidperl), even with
4309      * right UID/GID. Was already checked in suidperl, with #ifdef IAMSUID,
4310      * below; but I am paranoid.
4311      * 
4312      * Also see comments about root running a setuid script, elsewhere.
4313      */
4314     if (PL_suidscript >= 0)
4315         Perl_croak(aTHX_ "No %s allowed with (suid) fdscript", s);
4316 #ifdef IAMSUID
4317     /* PSz 11 Nov 03  Catch it in suidperl, always! */
4318     Perl_croak(aTHX_ "No %s allowed in suidperl", s);
4319 #endif /* IAMSUID */
4320 }
4321
4322 void
4323 Perl_init_debugger(pTHX)
4324 {
4325     HV *ostash = PL_curstash;
4326
4327     PL_curstash = PL_debstash;
4328     PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("DB::args", GV_ADDMULTI, SVt_PVAV))));
4329     AvREAL_off(PL_dbargs);
4330     PL_DBgv = gv_fetchpv("DB::DB", GV_ADDMULTI, SVt_PVGV);
4331     PL_DBline = gv_fetchpv("DB::dbline", GV_ADDMULTI, SVt_PVAV);
4332     PL_DBsub = gv_HVadd(gv_fetchpv("DB::sub", GV_ADDMULTI, SVt_PVHV));
4333     PL_DBsingle = GvSV((gv_fetchpv("DB::single", GV_ADDMULTI, SVt_PV)));
4334     sv_setiv(PL_DBsingle, 0);
4335     PL_DBtrace = GvSV((gv_fetchpv("DB::trace", GV_ADDMULTI, SVt_PV)));
4336     sv_setiv(PL_DBtrace, 0);
4337     PL_DBsignal = GvSV((gv_fetchpv("DB::signal", GV_ADDMULTI, SVt_PV)));
4338     sv_setiv(PL_DBsignal, 0);
4339     PL_DBassertion = GvSV((gv_fetchpv("DB::assertion", GV_ADDMULTI, SVt_PV)));
4340     sv_setiv(PL_DBassertion, 0);
4341     PL_curstash = ostash;
4342 }
4343
4344 #ifndef STRESS_REALLOC
4345 #define REASONABLE(size) (size)
4346 #else
4347 #define REASONABLE(size) (1) /* unreasonable */
4348 #endif
4349
4350 void
4351 Perl_init_stacks(pTHX)
4352 {
4353     /* start with 128-item stack and 8K cxstack */
4354     PL_curstackinfo = new_stackinfo(REASONABLE(128),
4355                                  REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
4356     PL_curstackinfo->si_type = PERLSI_MAIN;
4357     PL_curstack = PL_curstackinfo->si_stack;
4358     PL_mainstack = PL_curstack;         /* remember in case we switch stacks */
4359
4360     PL_stack_base = AvARRAY(PL_curstack);
4361     PL_stack_sp = PL_stack_base;
4362     PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
4363
4364     Newx(PL_tmps_stack,REASONABLE(128),SV*);
4365     PL_tmps_floor = -1;
4366     PL_tmps_ix = -1;
4367     PL_tmps_max = REASONABLE(128);
4368
4369     Newx(PL_markstack,REASONABLE(32),I32);
4370     PL_markstack_ptr = PL_markstack;
4371     PL_markstack_max = PL_markstack + REASONABLE(32);
4372
4373     SET_MARK_OFFSET;
4374
4375     Newx(PL_scopestack,REASONABLE(32),I32);
4376     PL_scopestack_ix = 0;
4377     PL_scopestack_max = REASONABLE(32);
4378
4379     Newx(PL_savestack,REASONABLE(128),ANY);
4380     PL_savestack_ix = 0;
4381     PL_savestack_max = REASONABLE(128);
4382 }
4383
4384 #undef REASONABLE
4385
4386 STATIC void
4387 S_nuke_stacks(pTHX)
4388 {
4389     while (PL_curstackinfo->si_next)
4390         PL_curstackinfo = PL_curstackinfo->si_next;
4391     while (PL_curstackinfo) {
4392         PERL_SI *p = PL_curstackinfo->si_prev;
4393         /* curstackinfo->si_stack got nuked by sv_free_arenas() */
4394         Safefree(PL_curstackinfo->si_cxstack);
4395         Safefree(PL_curstackinfo);
4396         PL_curstackinfo = p;
4397     }
4398     Safefree(PL_tmps_stack);
4399     Safefree(PL_markstack);
4400     Safefree(PL_scopestack);
4401     Safefree(PL_savestack);
4402 }
4403
4404 STATIC void
4405 S_init_lexer(pTHX)
4406 {
4407     PerlIO *tmpfp;
4408     tmpfp = PL_rsfp;
4409     PL_rsfp = Nullfp;
4410     lex_start(PL_linestr);
4411     PL_rsfp = tmpfp;
4412     PL_subname = newSVpvn("main",4);
4413 }
4414
4415 STATIC void
4416 S_init_predump_symbols(pTHX)
4417 {
4418     GV *tmpgv;
4419     IO *io;
4420
4421     sv_setpvn(get_sv("\"", TRUE), " ", 1);
4422     PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
4423     GvMULTI_on(PL_stdingv);
4424     io = GvIOp(PL_stdingv);
4425     IoTYPE(io) = IoTYPE_RDONLY;
4426     IoIFP(io) = PerlIO_stdin();
4427     tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
4428     GvMULTI_on(tmpgv);
4429     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
4430
4431     tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
4432     GvMULTI_on(tmpgv);
4433     io = GvIOp(tmpgv);
4434     IoTYPE(io) = IoTYPE_WRONLY;
4435     IoOFP(io) = IoIFP(io) = PerlIO_stdout();
4436     setdefout(tmpgv);
4437     tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
4438     GvMULTI_on(tmpgv);
4439     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
4440
4441     PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
4442     GvMULTI_on(PL_stderrgv);
4443     io = GvIOp(PL_stderrgv);
4444     IoTYPE(io) = IoTYPE_WRONLY;
4445     IoOFP(io) = IoIFP(io) = PerlIO_stderr();
4446     tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
4447     GvMULTI_on(tmpgv);
4448     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
4449
4450     PL_statname = NEWSV(66,0);          /* last filename we did stat on */
4451
4452     Safefree(PL_osname);
4453     PL_osname = savepv(OSNAME);
4454 }
4455
4456 void
4457 Perl_init_argv_symbols(pTHX_ register int argc, register char **argv)
4458 {
4459     argc--,argv++;      /* skip name of script */
4460     if (PL_doswitches) {
4461         for (; argc > 0 && **argv == '-'; argc--,argv++) {
4462             char *s;
4463             if (!argv[0][1])
4464                 break;
4465             if (argv[0][1] == '-' && !argv[0][2]) {
4466                 argc--,argv++;
4467                 break;
4468             }
4469             if ((s = strchr(argv[0], '='))) {
4470                 *s++ = '\0';
4471                 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
4472             }
4473             else
4474                 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
4475         }
4476     }
4477     if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
4478         GvMULTI_on(PL_argvgv);
4479         (void)gv_AVadd(PL_argvgv);
4480         av_clear(GvAVn(PL_argvgv));
4481         for (; argc > 0; argc--,argv++) {
4482             SV * const sv = newSVpv(argv[0],0);
4483             av_push(GvAVn(PL_argvgv),sv);
4484             if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
4485                  if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
4486                       SvUTF8_on(sv);
4487             }
4488             if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
4489                  (void)sv_utf8_decode(sv);
4490         }
4491     }
4492 }
4493
4494 STATIC void
4495 S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
4496 {
4497     dVAR;
4498     GV* tmpgv;
4499
4500     PL_toptarget = NEWSV(0,0);
4501     sv_upgrade(PL_toptarget, SVt_PVFM);
4502     sv_setpvn(PL_toptarget, "", 0);
4503     PL_bodytarget = NEWSV(0,0);
4504     sv_upgrade(PL_bodytarget, SVt_PVFM);
4505     sv_setpvn(PL_bodytarget, "", 0);
4506     PL_formtarget = PL_bodytarget;
4507
4508     TAINT;
4509
4510     init_argv_symbols(argc,argv);
4511
4512     if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
4513 #ifdef MACOS_TRADITIONAL
4514         /* $0 is not majick on a Mac */
4515         sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
4516 #else
4517         sv_setpv(GvSV(tmpgv),PL_origfilename);
4518         magicname("0", "0", 1);
4519 #endif
4520     }
4521     if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
4522         HV *hv;
4523         GvMULTI_on(PL_envgv);
4524         hv = GvHVn(PL_envgv);
4525         hv_magic(hv, Nullgv, PERL_MAGIC_env);
4526 #ifndef PERL_MICRO
4527 #ifdef USE_ENVIRON_ARRAY
4528         /* Note that if the supplied env parameter is actually a copy
4529            of the global environ then it may now point to free'd memory
4530            if the environment has been modified since. To avoid this
4531            problem we treat env==NULL as meaning 'use the default'
4532         */
4533         if (!env)
4534             env = environ;
4535         if (env != environ
4536 #  ifdef USE_ITHREADS
4537             && PL_curinterp == aTHX
4538 #  endif
4539            )
4540         {
4541             environ[0] = Nullch;
4542         }
4543         if (env) {
4544           char** origenv = environ;
4545           char *s;
4546           SV *sv;
4547           for (; *env; env++) {
4548             if (!(s = strchr(*env,'=')) || s == *env)
4549                 continue;
4550 #if defined(MSDOS) && !defined(DJGPP)
4551             *s = '\0';
4552             (void)strupr(*env);
4553             *s = '=';
4554 #endif
4555             sv = newSVpv(s+1, 0);
4556             (void)hv_store(hv, *env, s - *env, sv, 0);
4557             if (env != environ)
4558                 mg_set(sv);
4559             if (origenv != environ) {
4560               /* realloc has shifted us */
4561               env = (env - origenv) + environ;
4562               origenv = environ;
4563             }
4564           }
4565       }
4566 #endif /* USE_ENVIRON_ARRAY */
4567 #endif /* !PERL_MICRO */
4568     }
4569     TAINT_NOT;
4570     if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) {
4571         SvREADONLY_off(GvSV(tmpgv));
4572         sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
4573         SvREADONLY_on(GvSV(tmpgv));
4574     }
4575 #ifdef THREADS_HAVE_PIDS
4576     PL_ppid = (IV)getppid();
4577 #endif
4578
4579     /* touch @F array to prevent spurious warnings 20020415 MJD */
4580     if (PL_minus_a) {
4581       (void) get_av("main::F", TRUE | GV_ADDMULTI);
4582     }
4583     /* touch @- and @+ arrays to prevent spurious warnings 20020415 MJD */
4584     (void) get_av("main::-", TRUE | GV_ADDMULTI);
4585     (void) get_av("main::+", TRUE | GV_ADDMULTI);
4586 }
4587
4588 STATIC void
4589 S_init_perllib(pTHX)
4590 {
4591     char *s;
4592     if (!PL_tainting) {
4593 #ifndef VMS
4594         s = PerlEnv_getenv("PERL5LIB");
4595         if (s)
4596             incpush(s, TRUE, TRUE, TRUE, FALSE);
4597         else
4598             incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE, TRUE, FALSE);
4599 #else /* VMS */
4600         /* Treat PERL5?LIB as a possible search list logical name -- the
4601          * "natural" VMS idiom for a Unix path string.  We allow each
4602          * element to be a set of |-separated directories for compatibility.
4603          */
4604         char buf[256];
4605         int idx = 0;
4606         if (my_trnlnm("PERL5LIB",buf,0))
4607             do { incpush(buf,TRUE,TRUE,TRUE,FALSE); } while (my_trnlnm("PERL5LIB",buf,++idx));
4608         else
4609             while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE,TRUE,FALSE);
4610 #endif /* VMS */
4611     }
4612
4613 /* Use the ~-expanded versions of APPLLIB (undocumented),
4614     ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
4615 */
4616 #ifdef APPLLIB_EXP
4617     incpush(APPLLIB_EXP, TRUE, TRUE, TRUE, TRUE);
4618 #endif
4619
4620 #ifdef ARCHLIB_EXP
4621     incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4622 #endif
4623 #ifdef MACOS_TRADITIONAL
4624     {
4625         Stat_t tmpstatbuf;
4626         SV * privdir = NEWSV(55, 0);
4627         char * macperl = PerlEnv_getenv("MACPERL");
4628         
4629         if (!macperl)
4630             macperl = "";
4631         
4632         Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
4633         if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
4634             incpush(SvPVX(privdir), TRUE, FALSE, TRUE, FALSE);
4635         Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
4636         if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
4637             incpush(SvPVX(privdir), TRUE, FALSE, TRUE, FALSE);
4638         
4639         SvREFCNT_dec(privdir);
4640     }
4641     if (!PL_tainting)
4642         incpush(":", FALSE, FALSE, TRUE, FALSE);
4643 #else
4644 #ifndef PRIVLIB_EXP
4645 #  define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
4646 #endif
4647 #if defined(WIN32)
4648     incpush(PRIVLIB_EXP, TRUE, FALSE, TRUE, TRUE);
4649 #else
4650     incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4651 #endif
4652
4653 #ifdef SITEARCH_EXP
4654     /* sitearch is always relative to sitelib on Windows for
4655      * DLL-based path intuition to work correctly */
4656 #  if !defined(WIN32)
4657     incpush(SITEARCH_EXP, FALSE, FALSE, TRUE, TRUE);
4658 #  endif
4659 #endif
4660
4661 #ifdef SITELIB_EXP
4662 #  if defined(WIN32)
4663     /* this picks up sitearch as well */
4664     incpush(SITELIB_EXP, TRUE, FALSE, TRUE, TRUE);
4665 #  else
4666     incpush(SITELIB_EXP, FALSE, FALSE, TRUE, TRUE);
4667 #  endif
4668 #endif
4669
4670 #ifdef SITELIB_STEM /* Search for version-specific dirs below here */
4671     incpush(SITELIB_STEM, FALSE, TRUE, TRUE, TRUE);
4672 #endif
4673
4674 #ifdef PERL_VENDORARCH_EXP
4675     /* vendorarch is always relative to vendorlib on Windows for
4676      * DLL-based path intuition to work correctly */
4677 #  if !defined(WIN32)
4678     incpush(PERL_VENDORARCH_EXP, FALSE, FALSE, TRUE, TRUE);
4679 #  endif
4680 #endif
4681
4682 #ifdef PERL_VENDORLIB_EXP
4683 #  if defined(WIN32)
4684     incpush(PERL_VENDORLIB_EXP, TRUE, FALSE, TRUE, TRUE);       /* this picks up vendorarch as well */
4685 #  else
4686     incpush(PERL_VENDORLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4687 #  endif
4688 #endif
4689
4690 #ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
4691     incpush(PERL_VENDORLIB_STEM, FALSE, TRUE, TRUE, TRUE);
4692 #endif
4693
4694 #ifdef PERL_OTHERLIBDIRS
4695     incpush(PERL_OTHERLIBDIRS, TRUE, TRUE, TRUE, TRUE);
4696 #endif
4697
4698     if (!PL_tainting)
4699         incpush(".", FALSE, FALSE, TRUE, FALSE);
4700 #endif /* MACOS_TRADITIONAL */
4701 }
4702
4703 #if defined(DOSISH) || defined(EPOC) || defined(SYMBIAN)
4704 #    define PERLLIB_SEP ';'
4705 #else
4706 #  if defined(VMS)
4707 #    define PERLLIB_SEP '|'
4708 #  else
4709 #    if defined(MACOS_TRADITIONAL)
4710 #      define PERLLIB_SEP ','
4711 #    else
4712 #      define PERLLIB_SEP ':'
4713 #    endif
4714 #  endif
4715 #endif
4716 #ifndef PERLLIB_MANGLE
4717 #  define PERLLIB_MANGLE(s,n) (s)
4718 #endif
4719
4720 /* Push a directory onto @INC if it exists.
4721    Generate a new SV if we do this, to save needing to copy the SV we push
4722    onto @INC  */
4723 STATIC SV *
4724 S_incpush_if_exists(pTHX_ SV *dir)
4725 {
4726     Stat_t tmpstatbuf;
4727     if (PerlLIO_stat(SvPVX_const(dir), &tmpstatbuf) >= 0 &&
4728         S_ISDIR(tmpstatbuf.st_mode)) {
4729         av_push(GvAVn(PL_incgv), dir);
4730         dir = NEWSV(0,0);
4731     }
4732     return dir;
4733 }
4734
4735 STATIC void
4736 S_incpush(pTHX_ const char *dir, bool addsubdirs, bool addoldvers, bool usesep,
4737           bool canrelocate)
4738 {
4739     SV *subdir = Nullsv;
4740     const char *p = dir;
4741
4742     if (!p || !*p)
4743         return;
4744
4745     if (addsubdirs || addoldvers) {
4746         subdir = NEWSV(0,0);
4747     }
4748
4749     /* Break at all separators */
4750     while (p && *p) {
4751         SV *libdir = NEWSV(55,0);
4752         const char *s;
4753
4754         /* skip any consecutive separators */
4755         if (usesep) {
4756             while ( *p == PERLLIB_SEP ) {
4757                 /* Uncomment the next line for PATH semantics */
4758                 /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
4759                 p++;
4760             }
4761         }
4762
4763         if ( usesep && (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
4764             sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
4765                       (STRLEN)(s - p));
4766             p = s + 1;
4767         }
4768         else {
4769             sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
4770             p = Nullch; /* break out */
4771         }
4772 #ifdef MACOS_TRADITIONAL
4773         if (!strchr(SvPVX(libdir), ':')) {
4774             char buf[256];
4775
4776             sv_setpv(libdir, MacPerl_CanonDir(SvPVX(libdir), buf, 0));
4777         }
4778         if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
4779             sv_catpv(libdir, ":");
4780 #endif
4781
4782         /* Do the if() outside the #ifdef to avoid warnings about an unused
478