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