Change 32997 missed one conditionally unused argument.
[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                     sv_catpvs(opts_prog,
1884                               "  Compiled at " __DATE__ " " __TIME__ "\\n\"");
1885 #  else
1886                     sv_catpvs(opts_prog, "  Compiled on " __DATE__ "\\n\"");
1887 #  endif
1888 #endif
1889                     sv_catpvs(opts_prog, "; $\"=\"\\n    \"; "
1890                              "@env = map { \"$_=\\\"$ENV{$_}\\\"\" } "
1891                              "sort grep {/^PERL/} keys %ENV; ");
1892 #ifdef __CYGWIN__
1893                     sv_catpvs(opts_prog,
1894                              "push @env, \"CYGWIN=\\\"$ENV{CYGWIN}\\\"\";");
1895 #endif
1896                     sv_catpvs(opts_prog, 
1897                              "print \"  \\%ENV:\\n    @env\\n\" if @env;"
1898                              "print \"  \\@INC:\\n    @INC\\n\";");
1899                 }
1900                 else {
1901                     ++s;
1902                     opts_prog = Perl_newSVpvf(aTHX_
1903                                               "Config::config_vars(qw%c%s%c)",
1904                                               0, s, 0);
1905                     s += strlen(s);
1906                 }
1907                 av_push(PL_preambleav, opts_prog);
1908                 /* don't look for script or read stdin */
1909                 scriptname = BIT_BUCKET;
1910                 goto reswitch;
1911             }
1912         case 'x':
1913             PL_doextract = TRUE;
1914             s++;
1915             if (*s)
1916                 cddir = s;
1917             break;
1918         case 0:
1919             break;
1920         case '-':
1921             if (!*++s || isSPACE(*s)) {
1922                 argc--,argv++;
1923                 goto switch_end;
1924             }
1925             /* catch use of gnu style long options */
1926             if (strEQ(s, "version")) {
1927                 s = (char *)"v";
1928                 goto reswitch;
1929             }
1930             if (strEQ(s, "help")) {
1931                 s = (char *)"h";
1932                 goto reswitch;
1933             }
1934             s--;
1935             /* FALL THROUGH */
1936         default:
1937             Perl_croak(aTHX_ "Unrecognized switch: -%s  (-h will show valid options)",s);
1938         }
1939     }
1940     }
1941
1942   switch_end:
1943
1944     {
1945         char *s;
1946
1947     if (
1948 #ifndef SECURE_INTERNAL_GETENV
1949         !PL_tainting &&
1950 #endif
1951         (s = PerlEnv_getenv("PERL5OPT")))
1952     {
1953         const char *popt = s;
1954         while (isSPACE(*s))
1955             s++;
1956         if (*s == '-' && *(s+1) == 'T') {
1957             CHECK_MALLOC_TOO_LATE_FOR('T');
1958             PL_tainting = TRUE;
1959             PL_taint_warn = FALSE;
1960         }
1961         else {
1962             char *popt_copy = NULL;
1963             while (s && *s) {
1964                 char *d;
1965                 while (isSPACE(*s))
1966                     s++;
1967                 if (*s == '-') {
1968                     s++;
1969                     if (isSPACE(*s))
1970                         continue;
1971                 }
1972                 d = s;
1973                 if (!*s)
1974                     break;
1975                 if (!strchr("CDIMUdmtw", *s))
1976                     Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
1977                 while (++s && *s) {
1978                     if (isSPACE(*s)) {
1979                         if (!popt_copy) {
1980                             popt_copy = SvPVX(sv_2mortal(newSVpv(popt,0)));
1981                             s = popt_copy + (s - popt);
1982                             d = popt_copy + (d - popt);
1983                         }
1984                         *s++ = '\0';
1985                         break;
1986                     }
1987                 }
1988                 if (*d == 't') {
1989                     if( !PL_tainting ) {
1990                         PL_taint_warn = TRUE;
1991                         PL_tainting = TRUE;
1992                     }
1993                 } else {
1994                     moreswitches(d);
1995                 }
1996             }
1997         }
1998     }
1999     }
2000
2001 #ifdef USE_SITECUSTOMIZE
2002     if (!minus_f) {
2003         (void)Perl_av_create_and_unshift_one(aTHX_ &PL_preambleav,
2004                                              Perl_newSVpvf(aTHX_ "BEGIN { do '%s/sitecustomize.pl' }", SITELIB_EXP));
2005     }
2006 #endif
2007
2008     if (!scriptname)
2009         scriptname = argv[0];
2010     if (PL_e_script) {
2011         argc++,argv--;
2012         scriptname = BIT_BUCKET;        /* don't look for script or read stdin */
2013     }
2014     else if (scriptname == NULL) {
2015 #ifdef MSDOS
2016         if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
2017             moreswitches("h");
2018 #endif
2019         scriptname = "-";
2020     }
2021
2022     /* Set $^X early so that it can be used for relocatable paths in @INC  */
2023     assert (!PL_tainted);
2024     TAINT;
2025     S_set_caret_X(aTHX);
2026     TAINT_NOT;
2027     init_perllib();
2028
2029     {
2030         int suidscript;
2031         const int fdscript
2032             = open_script(scriptname, dosearch, &suidscript, &rsfp);
2033
2034         validate_suid(validarg, scriptname, fdscript, suidscript,
2035                 linestr_sv, rsfp);
2036
2037 #ifndef PERL_MICRO
2038 #  if defined(SIGCHLD) || defined(SIGCLD)
2039         {
2040 #  ifndef SIGCHLD
2041 #    define SIGCHLD SIGCLD
2042 #  endif
2043             Sighandler_t sigstate = rsignal_state(SIGCHLD);
2044             if (sigstate == (Sighandler_t) SIG_IGN) {
2045                 if (ckWARN(WARN_SIGNAL))
2046                     Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
2047                                 "Can't ignore signal CHLD, forcing to default");
2048                 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
2049             }
2050         }
2051 #  endif
2052 #endif
2053
2054         if (PL_doextract
2055 #ifdef MACOS_TRADITIONAL
2056             || gMacPerl_AlwaysExtract
2057 #endif
2058             ) {
2059
2060             /* This will croak if suidscript is >= 0, as -x cannot be used with
2061                setuid scripts.  */
2062             forbid_setid('x', suidscript);
2063             /* Hence you can't get here if suidscript >= 0  */
2064
2065             find_beginning(linestr_sv, rsfp);
2066             if (cddir && PerlDir_chdir( (char *)cddir ) < 0)
2067                 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
2068         }
2069     }
2070
2071     PL_main_cv = PL_compcv = (CV*)newSV_type(SVt_PVCV);
2072     CvUNIQUE_on(PL_compcv);
2073
2074     CvPADLIST(PL_compcv) = pad_new(0);
2075
2076     PL_isarev = newHV();
2077
2078     boot_core_PerlIO();
2079     boot_core_UNIVERSAL();
2080     boot_core_xsutils();
2081     boot_core_mro();
2082
2083     if (xsinit)
2084         (*xsinit)(aTHX);        /* in case linked C routines want magical variables */
2085 #ifndef PERL_MICRO
2086 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC) || defined(SYMBIAN)
2087     init_os_extras();
2088 #endif
2089 #endif
2090
2091 #ifdef USE_SOCKS
2092 #   ifdef HAS_SOCKS5_INIT
2093     socks5_init(argv[0]);
2094 #   else
2095     SOCKSinit(argv[0]);
2096 #   endif
2097 #endif
2098
2099     init_predump_symbols();
2100     /* init_postdump_symbols not currently designed to be called */
2101     /* more than once (ENV isn't cleared first, for example)     */
2102     /* But running with -u leaves %ENV & @ARGV undefined!    XXX */
2103     if (!PL_do_undump)
2104         init_postdump_symbols(argc,argv,env);
2105
2106     /* PL_unicode is turned on by -C, or by $ENV{PERL_UNICODE},
2107      * or explicitly in some platforms.
2108      * locale.c:Perl_init_i18nl10n() if the environment
2109      * look like the user wants to use UTF-8. */
2110 #if defined(__SYMBIAN32__)
2111     PL_unicode = PERL_UNICODE_STD_FLAG; /* See PERL_SYMBIAN_CONSOLE_UTF8. */
2112 #endif
2113     if (PL_unicode) {
2114          /* Requires init_predump_symbols(). */
2115          if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
2116               IO* io;
2117               PerlIO* fp;
2118               SV* sv;
2119
2120               /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
2121                * and the default open disciplines. */
2122               if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
2123                   PL_stdingv  && (io = GvIO(PL_stdingv)) &&
2124                   (fp = IoIFP(io)))
2125                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2126               if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
2127                   PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
2128                   (fp = IoOFP(io)))
2129                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2130               if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
2131                   PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
2132                   (fp = IoOFP(io)))
2133                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2134               if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
2135                   (sv = GvSV(gv_fetchpvs("\017PEN", GV_ADD|GV_NOTQUAL,
2136                                          SVt_PV)))) {
2137                    U32 in  = PL_unicode & PERL_UNICODE_IN_FLAG;
2138                    U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
2139                    if (in) {
2140                         if (out)
2141                              sv_setpvn(sv, ":utf8\0:utf8", 11);
2142                         else
2143                              sv_setpvn(sv, ":utf8\0", 6);
2144                    }
2145                    else if (out)
2146                         sv_setpvn(sv, "\0:utf8", 6);
2147                    SvSETMAGIC(sv);
2148               }
2149          }
2150     }
2151
2152     {
2153         const char *s;
2154     if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
2155          if (strEQ(s, "unsafe"))
2156               PL_signals |=  PERL_SIGNALS_UNSAFE_FLAG;
2157          else if (strEQ(s, "safe"))
2158               PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
2159          else
2160               Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
2161     }
2162     }
2163
2164 #ifdef PERL_MAD
2165     {
2166         const char *s;
2167     if ((s = PerlEnv_getenv("PERL_XMLDUMP"))) {
2168         PL_madskills = 1;
2169         PL_minus_c = 1;
2170         if (!s || !s[0])
2171             PL_xmlfp = PerlIO_stdout();
2172         else {
2173             PL_xmlfp = PerlIO_open(s, "w");
2174             if (!PL_xmlfp)
2175                 Perl_croak(aTHX_ "Can't open %s", s);
2176         }
2177         my_setenv("PERL_XMLDUMP", NULL);        /* hide from subprocs */
2178     }
2179     }
2180
2181     {
2182         const char *s;
2183     if ((s = PerlEnv_getenv("PERL_MADSKILLS"))) {
2184         PL_madskills = atoi(s);
2185         my_setenv("PERL_MADSKILLS", NULL);      /* hide from subprocs */
2186     }
2187     }
2188 #endif
2189
2190     lex_start(linestr_sv, rsfp, TRUE);
2191     PL_subname = newSVpvs("main");
2192
2193     if (add_read_e_script)
2194         filter_add(read_e_script, NULL);
2195
2196     /* now parse the script */
2197
2198     SETERRNO(0,SS_NORMAL);
2199 #ifdef MACOS_TRADITIONAL
2200     if (gMacPerl_SyntaxError = (yyparse() || PL_parser->error_count)) {
2201         if (PL_minus_c)
2202             Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
2203         else {
2204             Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
2205                        MacPerl_MPWFileName(PL_origfilename));
2206         }
2207     }
2208 #else
2209     if (yyparse() || PL_parser->error_count) {
2210         if (PL_minus_c)
2211             Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
2212         else {
2213             Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
2214                        PL_origfilename);
2215         }
2216     }
2217 #endif
2218     CopLINE_set(PL_curcop, 0);
2219     PL_curstash = PL_defstash;
2220     if (PL_e_script) {
2221         SvREFCNT_dec(PL_e_script);
2222         PL_e_script = NULL;
2223     }
2224
2225     if (PL_do_undump)
2226         my_unexec();
2227
2228     if (isWARN_ONCE) {
2229         SAVECOPFILE(PL_curcop);
2230         SAVECOPLINE(PL_curcop);
2231         gv_check(PL_defstash);
2232     }
2233
2234     LEAVE;
2235     FREETMPS;
2236
2237 #ifdef MYMALLOC
2238     {
2239         const char *s;
2240     if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
2241         dump_mstats("after compilation:");
2242     }
2243 #endif
2244
2245     ENTER;
2246     PL_restartop = 0;
2247     return NULL;
2248 }
2249
2250 /*
2251 =for apidoc perl_run
2252
2253 Tells a Perl interpreter to run.  See L<perlembed>.
2254
2255 =cut
2256 */
2257
2258 int
2259 perl_run(pTHXx)
2260 {
2261     dVAR;
2262     I32 oldscope;
2263     int ret = 0;
2264     dJMPENV;
2265
2266     PERL_UNUSED_ARG(my_perl);
2267
2268     oldscope = PL_scopestack_ix;
2269 #ifdef VMS
2270     VMSISH_HUSHED = 0;
2271 #endif
2272
2273     JMPENV_PUSH(ret);
2274     switch (ret) {
2275     case 1:
2276         cxstack_ix = -1;                /* start context stack again */
2277         goto redo_body;
2278     case 0:                             /* normal completion */
2279  redo_body:
2280         run_body(oldscope);
2281         /* FALL THROUGH */
2282     case 2:                             /* my_exit() */
2283         while (PL_scopestack_ix > oldscope)
2284             LEAVE;
2285         FREETMPS;
2286         PL_curstash = PL_defstash;
2287         if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
2288             PL_endav && !PL_minus_c)
2289             call_list(oldscope, PL_endav);
2290 #ifdef MYMALLOC
2291         if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
2292             dump_mstats("after execution:  ");
2293 #endif
2294         ret = STATUS_EXIT;
2295         break;
2296     case 3:
2297         if (PL_restartop) {
2298             POPSTACK_TO(PL_mainstack);
2299             goto redo_body;
2300         }
2301         PerlIO_printf(Perl_error_log, "panic: restartop\n");
2302         FREETMPS;
2303         ret = 1;
2304         break;
2305     }
2306
2307     JMPENV_POP;
2308     return ret;
2309 }
2310
2311 STATIC void
2312 S_run_body(pTHX_ I32 oldscope)
2313 {
2314     dVAR;
2315     DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
2316                     PL_sawampersand ? "Enabling" : "Omitting"));
2317
2318     if (!PL_restartop) {
2319 #ifdef PERL_MAD
2320         if (PL_xmlfp) {
2321             xmldump_all();
2322             exit(0);    /* less likely to core dump than my_exit(0) */
2323         }
2324 #endif
2325         DEBUG_x(dump_all());
2326 #ifdef DEBUGGING
2327         if (!DEBUG_q_TEST)
2328           PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
2329 #endif
2330         DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
2331                               PTR2UV(thr)));
2332
2333         if (PL_minus_c) {
2334 #ifdef MACOS_TRADITIONAL
2335             PerlIO_printf(Perl_error_log, "%s%s syntax OK\n",
2336                 (gMacPerl_ErrorFormat ? "# " : ""),
2337                 MacPerl_MPWFileName(PL_origfilename));
2338 #else
2339             PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
2340 #endif
2341             my_exit(0);
2342         }
2343         if (PERLDB_SINGLE && PL_DBsingle)
2344             sv_setiv(PL_DBsingle, 1);
2345         if (PL_initav)
2346             call_list(oldscope, PL_initav);
2347 #ifdef PERL_DEBUG_READONLY_OPS
2348         Perl_pending_Slabs_to_ro(aTHX);
2349 #endif
2350     }
2351
2352     /* do it */
2353
2354     if (PL_restartop) {
2355         PL_op = PL_restartop;
2356         PL_restartop = 0;
2357         CALLRUNOPS(aTHX);
2358     }
2359     else if (PL_main_start) {
2360         CvDEPTH(PL_main_cv) = 1;
2361         PL_op = PL_main_start;
2362         CALLRUNOPS(aTHX);
2363     }
2364     my_exit(0);
2365     /* NOTREACHED */
2366 }
2367
2368 /*
2369 =head1 SV Manipulation Functions
2370
2371 =for apidoc p||get_sv
2372
2373 Returns the SV of the specified Perl scalar.  If C<create> is set and the
2374 Perl variable does not exist then it will be created.  If C<create> is not
2375 set and the variable does not exist then NULL is returned.
2376
2377 =cut
2378 */
2379
2380 SV*
2381 Perl_get_sv(pTHX_ const char *name, I32 create)
2382 {
2383     GV *gv;
2384     gv = gv_fetchpv(name, create, SVt_PV);
2385     if (gv)
2386         return GvSV(gv);
2387     return NULL;
2388 }
2389
2390 /*
2391 =head1 Array Manipulation Functions
2392
2393 =for apidoc p||get_av
2394
2395 Returns the AV of the specified Perl array.  If C<create> is set and the
2396 Perl variable does not exist then it will be created.  If C<create> is not
2397 set and the variable does not exist then NULL is returned.
2398
2399 =cut
2400 */
2401
2402 AV*
2403 Perl_get_av(pTHX_ const char *name, I32 create)
2404 {
2405     GV* const gv = gv_fetchpv(name, create, SVt_PVAV);
2406     if (create)
2407         return GvAVn(gv);
2408     if (gv)
2409         return GvAV(gv);
2410     return NULL;
2411 }
2412
2413 /*
2414 =head1 Hash Manipulation Functions
2415
2416 =for apidoc p||get_hv
2417
2418 Returns the HV of the specified Perl hash.  If C<create> is set and the
2419 Perl variable does not exist then it will be created.  If C<create> is not
2420 set and the variable does not exist then NULL is returned.
2421
2422 =cut
2423 */
2424
2425 HV*
2426 Perl_get_hv(pTHX_ const char *name, I32 create)
2427 {
2428     GV* const gv = gv_fetchpv(name, create, SVt_PVHV);
2429     if (create)
2430         return GvHVn(gv);
2431     if (gv)
2432         return GvHV(gv);
2433     return NULL;
2434 }
2435
2436 /*
2437 =head1 CV Manipulation Functions
2438
2439 =for apidoc p||get_cvn_flags
2440
2441 Returns the CV of the specified Perl subroutine.  C<flags> are passed to
2442 C<gv_fetchpvn_flags>. If C<GV_ADD> is set and the Perl subroutine does not
2443 exist then it will be declared (which has the same effect as saying
2444 C<sub name;>).  If C<GV_ADD> is not set and the subroutine does not exist
2445 then NULL is returned.
2446
2447 =for apidoc p||get_cv
2448
2449 Uses C<strlen> to get the length of C<name>, then calls C<get_cvn_flags>.
2450
2451 =cut
2452 */
2453
2454 CV*
2455 Perl_get_cvn_flags(pTHX_ const char *name, STRLEN len, I32 flags)
2456 {
2457     GV* const gv = gv_fetchpvn_flags(name, len, flags, SVt_PVCV);
2458     /* XXX this is probably not what they think they're getting.
2459      * It has the same effect as "sub name;", i.e. just a forward
2460      * declaration! */
2461     if ((flags & ~GV_NOADD_MASK) && !GvCVu(gv)) {
2462         SV *const sv = newSVpvn_flags(name, len, flags & SVf_UTF8);
2463         return newSUB(start_subparse(FALSE, 0),
2464                       newSVOP(OP_CONST, 0, sv),
2465                       NULL, NULL);
2466     }
2467     if (gv)
2468         return GvCVu(gv);
2469     return NULL;
2470 }
2471
2472 CV*
2473 Perl_get_cv(pTHX_ const char *name, I32 flags)
2474 {
2475     return get_cvn_flags(name, strlen(name), flags);
2476 }
2477
2478 /* Be sure to refetch the stack pointer after calling these routines. */
2479
2480 /*
2481
2482 =head1 Callback Functions
2483
2484 =for apidoc p||call_argv
2485
2486 Performs a callback to the specified Perl sub.  See L<perlcall>.
2487
2488 =cut
2489 */
2490
2491 I32
2492 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
2493
2494                         /* See G_* flags in cop.h */
2495                         /* null terminated arg list */
2496 {
2497     dVAR;
2498     dSP;
2499
2500     PUSHMARK(SP);
2501     if (argv) {
2502         while (*argv) {
2503             mXPUSHs(newSVpv(*argv,0));
2504             argv++;
2505         }
2506         PUTBACK;
2507     }
2508     return call_pv(sub_name, flags);
2509 }
2510
2511 /*
2512 =for apidoc p||call_pv
2513
2514 Performs a callback to the specified Perl sub.  See L<perlcall>.
2515
2516 =cut
2517 */
2518
2519 I32
2520 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
2521                         /* name of the subroutine */
2522                         /* See G_* flags in cop.h */
2523 {
2524     return call_sv((SV*)get_cv(sub_name, TRUE), flags);
2525 }
2526
2527 /*
2528 =for apidoc p||call_method
2529
2530 Performs a callback to the specified Perl method.  The blessed object must
2531 be on the stack.  See L<perlcall>.
2532
2533 =cut
2534 */
2535
2536 I32
2537 Perl_call_method(pTHX_ const char *methname, I32 flags)
2538                         /* name of the subroutine */
2539                         /* See G_* flags in cop.h */
2540 {
2541     return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
2542 }
2543
2544 /* May be called with any of a CV, a GV, or an SV containing the name. */
2545 /*
2546 =for apidoc p||call_sv
2547
2548 Performs a callback to the Perl sub whose name is in the SV.  See
2549 L<perlcall>.
2550
2551 =cut
2552 */
2553
2554 I32
2555 Perl_call_sv(pTHX_ SV *sv, I32 flags)
2556                         /* See G_* flags in cop.h */
2557 {
2558     dVAR; dSP;
2559     LOGOP myop;         /* fake syntax tree node */
2560     UNOP method_op;
2561     I32 oldmark;
2562     VOL I32 retval = 0;
2563     I32 oldscope;
2564     bool oldcatch = CATCH_GET;
2565     int ret;
2566     OP* const oldop = PL_op;
2567     dJMPENV;
2568
2569     if (flags & G_DISCARD) {
2570         ENTER;
2571         SAVETMPS;
2572     }
2573
2574     Zero(&myop, 1, LOGOP);
2575     myop.op_next = NULL;
2576     if (!(flags & G_NOARGS))
2577         myop.op_flags |= OPf_STACKED;
2578     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
2579                       (flags & G_ARRAY) ? OPf_WANT_LIST :
2580                       OPf_WANT_SCALAR);
2581     SAVEOP();
2582     PL_op = (OP*)&myop;
2583
2584     EXTEND(PL_stack_sp, 1);
2585     *++PL_stack_sp = sv;
2586     oldmark = TOPMARK;
2587     oldscope = PL_scopestack_ix;
2588
2589     if (PERLDB_SUB && PL_curstash != PL_debstash
2590            /* Handle first BEGIN of -d. */
2591           && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
2592            /* Try harder, since this may have been a sighandler, thus
2593             * curstash may be meaningless. */
2594           && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
2595           && !(flags & G_NODEBUG))
2596         PL_op->op_private |= OPpENTERSUB_DB;
2597
2598     if (flags & G_METHOD) {
2599         Zero(&method_op, 1, UNOP);
2600         method_op.op_next = PL_op;
2601         method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
2602         myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
2603         PL_op = (OP*)&method_op;
2604     }
2605
2606     if (!(flags & G_EVAL)) {
2607         CATCH_SET(TRUE);
2608         CALL_BODY_SUB((OP*)&myop);
2609         retval = PL_stack_sp - (PL_stack_base + oldmark);
2610         CATCH_SET(oldcatch);
2611     }
2612     else {
2613         myop.op_other = (OP*)&myop;
2614         PL_markstack_ptr--;
2615         create_eval_scope(flags|G_FAKINGEVAL);
2616         PL_markstack_ptr++;
2617
2618         JMPENV_PUSH(ret);
2619
2620         switch (ret) {
2621         case 0:
2622  redo_body:
2623             CALL_BODY_SUB((OP*)&myop);
2624             retval = PL_stack_sp - (PL_stack_base + oldmark);
2625             if (!(flags & G_KEEPERR))
2626                 sv_setpvn(ERRSV,"",0);
2627             break;
2628         case 1:
2629             STATUS_ALL_FAILURE;
2630             /* FALL THROUGH */
2631         case 2:
2632             /* my_exit() was called */
2633             PL_curstash = PL_defstash;
2634             FREETMPS;
2635             JMPENV_POP;
2636             if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2637                 Perl_croak(aTHX_ "Callback called exit");
2638             my_exit_jump();
2639             /* NOTREACHED */
2640         case 3:
2641             if (PL_restartop) {
2642                 PL_op = PL_restartop;
2643                 PL_restartop = 0;
2644                 goto redo_body;
2645             }
2646             PL_stack_sp = PL_stack_base + oldmark;
2647             if (flags & G_ARRAY)
2648                 retval = 0;
2649             else {
2650                 retval = 1;
2651                 *++PL_stack_sp = &PL_sv_undef;
2652             }
2653             break;
2654         }
2655
2656         if (PL_scopestack_ix > oldscope)
2657             delete_eval_scope();
2658         JMPENV_POP;
2659     }
2660
2661     if (flags & G_DISCARD) {
2662         PL_stack_sp = PL_stack_base + oldmark;
2663         retval = 0;
2664         FREETMPS;
2665         LEAVE;
2666     }
2667     PL_op = oldop;
2668     return retval;
2669 }
2670
2671 /* Eval a string. The G_EVAL flag is always assumed. */
2672
2673 /*
2674 =for apidoc p||eval_sv
2675
2676 Tells Perl to C<eval> the string in the SV.
2677
2678 =cut
2679 */
2680
2681 I32
2682 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
2683
2684                         /* See G_* flags in cop.h */
2685 {
2686     dVAR;
2687     dSP;
2688     UNOP myop;          /* fake syntax tree node */
2689     VOL I32 oldmark = SP - PL_stack_base;
2690     VOL I32 retval = 0;
2691     int ret;
2692     OP* const oldop = PL_op;
2693     dJMPENV;
2694
2695     if (flags & G_DISCARD) {
2696         ENTER;
2697         SAVETMPS;
2698     }
2699
2700     SAVEOP();
2701     PL_op = (OP*)&myop;
2702     Zero(PL_op, 1, UNOP);
2703     EXTEND(PL_stack_sp, 1);
2704     *++PL_stack_sp = sv;
2705
2706     if (!(flags & G_NOARGS))
2707         myop.op_flags = OPf_STACKED;
2708     myop.op_next = NULL;
2709     myop.op_type = OP_ENTEREVAL;
2710     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
2711                       (flags & G_ARRAY) ? OPf_WANT_LIST :
2712                       OPf_WANT_SCALAR);
2713     if (flags & G_KEEPERR)
2714         myop.op_flags |= OPf_SPECIAL;
2715
2716     /* fail now; otherwise we could fail after the JMPENV_PUSH but
2717      * before a PUSHEVAL, which corrupts the stack after a croak */
2718     TAINT_PROPER("eval_sv()");
2719
2720     JMPENV_PUSH(ret);
2721     switch (ret) {
2722     case 0:
2723  redo_body:
2724         CALL_BODY_EVAL((OP*)&myop);
2725         retval = PL_stack_sp - (PL_stack_base + oldmark);
2726         if (!(flags & G_KEEPERR))
2727             sv_setpvn(ERRSV,"",0);
2728         break;
2729     case 1:
2730         STATUS_ALL_FAILURE;
2731         /* FALL THROUGH */
2732     case 2:
2733         /* my_exit() was called */
2734         PL_curstash = PL_defstash;
2735         FREETMPS;
2736         JMPENV_POP;
2737         if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2738             Perl_croak(aTHX_ "Callback called exit");
2739         my_exit_jump();
2740         /* NOTREACHED */
2741     case 3:
2742         if (PL_restartop) {
2743             PL_op = PL_restartop;
2744             PL_restartop = 0;
2745             goto redo_body;
2746         }
2747         PL_stack_sp = PL_stack_base + oldmark;
2748         if (flags & G_ARRAY)
2749             retval = 0;
2750         else {
2751             retval = 1;
2752             *++PL_stack_sp = &PL_sv_undef;
2753         }
2754         break;
2755     }
2756
2757     JMPENV_POP;
2758     if (flags & G_DISCARD) {
2759         PL_stack_sp = PL_stack_base + oldmark;
2760         retval = 0;
2761         FREETMPS;
2762         LEAVE;
2763     }
2764     PL_op = oldop;
2765     return retval;
2766 }
2767
2768 /*
2769 =for apidoc p||eval_pv
2770
2771 Tells Perl to C<eval> the given string and return an SV* result.
2772
2773 =cut
2774 */
2775
2776 SV*
2777 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
2778 {
2779     dVAR;
2780     dSP;
2781     SV* sv = newSVpv(p, 0);
2782
2783     eval_sv(sv, G_SCALAR);
2784     SvREFCNT_dec(sv);
2785
2786     SPAGAIN;
2787     sv = POPs;
2788     PUTBACK;
2789
2790     if (croak_on_error && SvTRUE(ERRSV)) {
2791         Perl_croak(aTHX_ SvPVx_nolen_const(ERRSV));
2792     }
2793
2794     return sv;
2795 }
2796
2797 /* Require a module. */
2798
2799 /*
2800 =head1 Embedding Functions
2801
2802 =for apidoc p||require_pv
2803
2804 Tells Perl to C<require> the file named by the string argument.  It is
2805 analogous to the Perl code C<eval "require '$file'">.  It's even
2806 implemented that way; consider using load_module instead.
2807
2808 =cut */
2809
2810 void
2811 Perl_require_pv(pTHX_ const char *pv)
2812 {
2813     dVAR;
2814     dSP;
2815     SV* sv;
2816     PUSHSTACKi(PERLSI_REQUIRE);
2817     PUTBACK;
2818     sv = Perl_newSVpvf(aTHX_ "require q%c%s%c", 0, pv, 0);
2819     eval_sv(sv_2mortal(sv), G_DISCARD);
2820     SPAGAIN;
2821     POPSTACK;
2822 }
2823
2824 void
2825 Perl_magicname(pTHX_ const char *sym, const char *name, I32 namlen)
2826 {
2827     register GV * const gv = gv_fetchpv(sym, GV_ADD, SVt_PV);
2828
2829     if (gv)
2830         sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, namlen);
2831 }
2832
2833 STATIC void
2834 S_usage(pTHX_ const char *name)         /* XXX move this out into a module ? */
2835 {
2836     /* This message really ought to be max 23 lines.
2837      * Removed -h because the user already knows that option. Others? */
2838
2839     static const char * const usage_msg[] = {
2840 "-0[octal]         specify record separator (\\0, if no argument)",
2841 "-a                autosplit mode with -n or -p (splits $_ into @F)",
2842 "-C[number/list]   enables the listed Unicode features",
2843 "-c                check syntax only (runs BEGIN and CHECK blocks)",
2844 "-d[:debugger]     run program under debugger",
2845 "-D[number/list]   set debugging flags (argument is a bit mask or alphabets)",
2846 "-e program        one line of program (several -e's allowed, omit programfile)",
2847 "-E program        like -e, but enables all optional features",
2848 "-f                don't do $sitelib/sitecustomize.pl at startup",
2849 "-F/pattern/       split() pattern for -a switch (//'s are optional)",
2850 "-i[extension]     edit <> files in place (makes backup if extension supplied)",
2851 "-Idirectory       specify @INC/#include directory (several -I's allowed)",
2852 "-l[octal]         enable line ending processing, specifies line terminator",
2853 "-[mM][-]module    execute \"use/no module...\" before executing program",
2854 "-n                assume \"while (<>) { ... }\" loop around program",
2855 "-p                assume loop like -n but print line also, like sed",
2856 "-s                enable rudimentary parsing for switches after programfile",
2857 "-S                look for programfile using PATH environment variable",
2858 "-t                enable tainting warnings",
2859 "-T                enable tainting checks",
2860 "-u                dump core after parsing program",
2861 "-U                allow unsafe operations",
2862 "-v                print version, subversion (includes VERY IMPORTANT perl info)",
2863 "-V[:variable]     print configuration summary (or a single Config.pm variable)",
2864 "-w                enable many useful warnings (RECOMMENDED)",
2865 "-W                enable all warnings",
2866 "-x[directory]     strip off text before #!perl line and perhaps cd to directory",
2867 "-X                disable all warnings",
2868 "\n",
2869 NULL
2870 };
2871     const char * const *p = usage_msg;
2872
2873     PerlIO_printf(PerlIO_stdout(),
2874                   "\nUsage: %s [switches] [--] [programfile] [arguments]",
2875                   name);
2876     while (*p)
2877         PerlIO_printf(PerlIO_stdout(), "\n  %s", *p++);
2878 }
2879
2880 /* convert a string of -D options (or digits) into an int.
2881  * sets *s to point to the char after the options */
2882
2883 #ifdef DEBUGGING
2884 int
2885 Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
2886 {
2887     static const char * const usage_msgd[] = {
2888       " Debugging flag values: (see also -d)",
2889       "  p  Tokenizing and parsing (with v, displays parse stack)",
2890       "  s  Stack snapshots (with v, displays all stacks)",
2891       "  l  Context (loop) stack processing",
2892       "  t  Trace execution",
2893       "  o  Method and overloading resolution",
2894       "  c  String/numeric conversions",
2895       "  P  Print profiling info, source file input state",
2896       "  m  Memory allocation",
2897       "  f  Format processing",
2898       "  r  Regular expression parsing and execution",
2899       "  x  Syntax tree dump",
2900       "  u  Tainting checks",
2901       "  H  Hash dump -- usurps values()",
2902       "  X  Scratchpad allocation",
2903       "  D  Cleaning up",
2904       "  S  Thread synchronization",
2905       "  T  Tokenising",
2906       "  R  Include reference counts of dumped variables (eg when using -Ds)",
2907       "  J  Do not s,t,P-debug (Jump over) opcodes within package DB",
2908       "  v  Verbose: use in conjunction with other flags",
2909       "  C  Copy On Write",
2910       "  A  Consistency checks on internal structures",
2911       "  q  quiet - currently only suppresses the 'EXECUTING' message",
2912       NULL
2913     };
2914     int i = 0;
2915     if (isALPHA(**s)) {
2916         /* if adding extra options, remember to update DEBUG_MASK */
2917         static const char debopts[] = "psltocPmfrxuUHXDSTRJvCAq";
2918
2919         for (; isALNUM(**s); (*s)++) {
2920             const char * const d = strchr(debopts,**s);
2921             if (d)
2922                 i |= 1 << (d - debopts);
2923             else if (ckWARN_d(WARN_DEBUGGING))
2924                 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2925                     "invalid option -D%c, use -D'' to see choices\n", **s);
2926         }
2927     }
2928     else if (isDIGIT(**s)) {
2929         i = atoi(*s);
2930         for (; isALNUM(**s); (*s)++) ;
2931     }
2932     else if (givehelp) {
2933       const char *const *p = usage_msgd;
2934       while (*p) PerlIO_printf(PerlIO_stdout(), "%s\n", *p++);
2935     }
2936 #  ifdef EBCDIC
2937     if ((i & DEBUG_p_FLAG) && ckWARN_d(WARN_DEBUGGING))
2938         Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2939                 "-Dp not implemented on this platform\n");
2940 #  endif
2941     return i;
2942 }
2943 #endif
2944
2945 /* This routine handles any switches that can be given during run */
2946
2947 const char *
2948 Perl_moreswitches(pTHX_ const char *s)
2949 {
2950     dVAR;
2951     UV rschar;
2952
2953     switch (*s) {
2954     case '0':
2955     {
2956          I32 flags = 0;
2957          STRLEN numlen;
2958
2959          SvREFCNT_dec(PL_rs);
2960          if (s[1] == 'x' && s[2]) {
2961               const char *e = s+=2;
2962               U8 *tmps;
2963
2964               while (*e)
2965                 e++;
2966               numlen = e - s;
2967               flags = PERL_SCAN_SILENT_ILLDIGIT;
2968               rschar = (U32)grok_hex(s, &numlen, &flags, NULL);
2969               if (s + numlen < e) {
2970                    rschar = 0; /* Grandfather -0xFOO as -0 -xFOO. */
2971                    numlen = 0;
2972                    s--;
2973               }
2974               PL_rs = newSVpvs("");
2975               SvGROW(PL_rs, (STRLEN)(UNISKIP(rschar) + 1));
2976               tmps = (U8*)SvPVX(PL_rs);
2977               uvchr_to_utf8(tmps, rschar);
2978               SvCUR_set(PL_rs, UNISKIP(rschar));
2979               SvUTF8_on(PL_rs);
2980          }
2981          else {
2982               numlen = 4;
2983               rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
2984               if (rschar & ~((U8)~0))
2985                    PL_rs = &PL_sv_undef;
2986               else if (!rschar && numlen >= 2)
2987                    PL_rs = newSVpvs("");
2988               else {
2989                    char ch = (char)rschar;
2990                    PL_rs = newSVpvn(&ch, 1);
2991               }
2992          }
2993          sv_setsv(get_sv("/", TRUE), PL_rs);
2994          return s + numlen;
2995     }
2996     case 'C':
2997         s++;
2998         PL_unicode = parse_unicode_opts( (const char **)&s );
2999         if (PL_unicode & PERL_UNICODE_UTF8CACHEASSERT_FLAG)
3000             PL_utf8cache = -1;
3001         return s;
3002     case 'F':
3003         PL_minus_F = TRUE;
3004         PL_splitstr = ++s;
3005         while (*s && !isSPACE(*s)) ++s;
3006         PL_splitstr = savepvn(PL_splitstr, s - PL_splitstr);
3007         return s;
3008     case 'a':
3009         PL_minus_a = TRUE;
3010         s++;
3011         return s;
3012     case 'c':
3013         PL_minus_c = TRUE;
3014         s++;
3015         return s;
3016     case 'd':
3017         forbid_setid('d', -1);
3018         s++;
3019
3020         /* -dt indicates to the debugger that threads will be used */
3021         if (*s == 't' && !isALNUM(s[1])) {
3022             ++s;
3023             my_setenv("PERL5DB_THREADED", "1");
3024         }
3025
3026         /* The following permits -d:Mod to accepts arguments following an =
3027            in the fashion that -MSome::Mod does. */
3028         if (*s == ':' || *s == '=') {
3029             const char *start = ++s;
3030             const char *const end = s + strlen(s);
3031             SV * const sv = newSVpvs("use Devel::");
3032
3033             /* We now allow -d:Module=Foo,Bar */
3034             while(isALNUM(*s) || *s==':') ++s;
3035             if (*s != '=')
3036                 sv_catpvn(sv, start, end - start);
3037             else {
3038                 sv_catpvn(sv, start, s-start);
3039                 /* Don't use NUL as q// delimiter here, this string goes in the
3040                  * environment. */
3041                 Perl_sv_catpvf(aTHX_ sv, " split(/,/,q{%s});", ++s);
3042             }
3043             s = end;
3044             my_setenv("PERL5DB", SvPV_nolen_const(sv));
3045             SvREFCNT_dec(sv);
3046         }
3047         if (!PL_perldb) {
3048             PL_perldb = PERLDB_ALL;
3049             init_debugger();
3050         }
3051         return s;
3052     case 'D':
3053     {   
3054 #ifdef DEBUGGING
3055         forbid_setid('D', -1);
3056         s++;
3057         PL_debug = get_debug_opts( (const char **)&s, 1) | DEBUG_TOP_FLAG;
3058 #else /* !DEBUGGING */
3059         if (ckWARN_d(WARN_DEBUGGING))
3060             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3061                    "Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)\n");
3062         for (s++; isALNUM(*s); s++) ;
3063 #endif
3064         return s;
3065     }   
3066     case 'h':
3067         usage(PL_origargv[0]);
3068         my_exit(0);
3069     case 'i':
3070         Safefree(PL_inplace);
3071 #if defined(__CYGWIN__) /* do backup extension automagically */
3072         if (*(s+1) == '\0') {
3073         PL_inplace = savepvs(".bak");
3074         return s+1;
3075         }
3076 #endif /* __CYGWIN__ */
3077         {
3078             const char * const start = ++s;
3079             while (*s && !isSPACE(*s))
3080                 ++s;
3081
3082             PL_inplace = savepvn(start, s - start);
3083         }
3084         if (*s) {
3085             ++s;
3086             if (*s == '-')      /* Additional switches on #! line. */
3087                 s++;
3088         }
3089         return s;
3090     case 'I':   /* -I handled both here and in parse_body() */
3091         forbid_setid('I', -1);
3092         ++s;
3093         while (*s && isSPACE(*s))
3094             ++s;
3095         if (*s) {
3096             const char *e, *p;
3097             p = s;
3098             /* ignore trailing spaces (possibly followed by other switches) */
3099             do {
3100                 for (e = p; *e && !isSPACE(*e); e++) ;
3101                 p = e;
3102                 while (isSPACE(*p))
3103                     p++;
3104             } while (*p && *p != '-');
3105             e = savepvn(s, e-s);
3106             incpush(e, TRUE, TRUE, FALSE, FALSE);
3107             Safefree(e);
3108             s = p;
3109             if (*s == '-')
3110                 s++;
3111         }
3112         else
3113             Perl_croak(aTHX_ "No directory specified for -I");
3114         return s;
3115     case 'l':
3116         PL_minus_l = TRUE;
3117         s++;
3118         if (PL_ors_sv) {
3119             SvREFCNT_dec(PL_ors_sv);
3120             PL_ors_sv = NULL;
3121         }
3122         if (isDIGIT(*s)) {
3123             I32 flags = 0;
3124             STRLEN numlen;
3125             PL_ors_sv = newSVpvs("\n");
3126             numlen = 3 + (*s == '0');
3127             *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
3128             s += numlen;
3129         }
3130         else {
3131             if (RsPARA(PL_rs)) {
3132                 PL_ors_sv = newSVpvs("\n\n");
3133             }
3134             else {
3135                 PL_ors_sv = newSVsv(PL_rs);
3136             }
3137         }
3138         return s;
3139     case 'M':
3140         forbid_setid('M', -1);  /* XXX ? */
3141         /* FALL THROUGH */
3142     case 'm':
3143         forbid_setid('m', -1);  /* XXX ? */
3144         if (*++s) {
3145             const char *start;
3146             const char *end;
3147             SV *sv;
3148             const char *use = "use ";
3149             /* -M-foo == 'no foo'       */
3150             /* Leading space on " no " is deliberate, to make both
3151                possibilities the same length.  */
3152             if (*s == '-') { use = " no "; ++s; }
3153             sv = newSVpvn(use,4);
3154             start = s;
3155             /* We allow -M'Module qw(Foo Bar)'  */
3156             while(isALNUM(*s) || *s==':') ++s;
3157             end = s + strlen(s);
3158             if (*s != '=') {
3159                 sv_catpvn(sv, start, end - start);
3160                 if (*(start-1) == 'm') {
3161                     if (*s != '\0')
3162                         Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
3163                     sv_catpvs( sv, " ()");
3164                 }
3165             } else {
3166                 if (s == start)
3167                     Perl_croak(aTHX_ "Module name required with -%c option",
3168                                s[-1]);
3169                 sv_catpvn(sv, start, s-start);
3170                 /* Use NUL as q''-delimiter.  */
3171                 sv_catpvs(sv, " split(/,/,q\0");
3172                 ++s;
3173                 sv_catpvn(sv, s, end - s);
3174                 sv_catpvs(sv,  "\0)");
3175             }
3176             s = end;
3177             Perl_av_create_and_push(aTHX_ &PL_preambleav, sv);
3178         }
3179         else
3180             Perl_croak(aTHX_ "Missing argument to -%c", *(s-1));
3181         return s;
3182     case 'n':
3183         PL_minus_n = TRUE;
3184         s++;
3185         return s;
3186     case 'p':
3187         PL_minus_p = TRUE;
3188         s++;
3189         return s;
3190     case 's':
3191         forbid_setid('s', -1);
3192         PL_doswitches = TRUE;
3193         s++;
3194         return s;
3195     case 't':
3196         if (!PL_tainting)
3197             TOO_LATE_FOR('t');
3198         s++;
3199         return s;
3200     case 'T':
3201         if (!PL_tainting)
3202             TOO_LATE_FOR('T');
3203         s++;
3204         return s;
3205     case 'u':
3206 #ifdef MACOS_TRADITIONAL
3207         Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
3208 #endif
3209         PL_do_undump = TRUE;
3210         s++;
3211         return s;
3212     case 'U':
3213         PL_unsafe = TRUE;
3214         s++;
3215         return s;
3216     case 'v':
3217         if (!sv_derived_from(PL_patchlevel, "version"))
3218             upg_version(PL_patchlevel, TRUE);
3219 #if !defined(DGUX)
3220         PerlIO_printf(PerlIO_stdout(),
3221                 Perl_form(aTHX_ "\nThis is perl, %"SVf
3222 #ifdef PERL_PATCHNUM
3223                           " DEVEL" STRINGIFY(PERL_PATCHNUM)
3224 #endif
3225                           " built for %s",
3226                           SVfARG(vstringify(PL_patchlevel)),
3227                           ARCHNAME));
3228 #else /* DGUX */
3229 /* Adjust verbose output as in the perl that ships with the DG/UX OS from EMC */
3230         PerlIO_printf(PerlIO_stdout(),
3231                 Perl_form(aTHX_ "\nThis is perl, %"SVf"\n",
3232                     SVfARG(vstringify(PL_patchlevel))));
3233         PerlIO_printf(PerlIO_stdout(),
3234                         Perl_form(aTHX_ "        built under %s at %s %s\n",
3235                                         OSNAME, __DATE__, __TIME__));
3236         PerlIO_printf(PerlIO_stdout(),
3237                         Perl_form(aTHX_ "        OS Specific Release: %s\n",
3238                                         OSVERS));
3239 #endif /* !DGUX */
3240
3241 #if defined(LOCAL_PATCH_COUNT)
3242         if (LOCAL_PATCH_COUNT > 0)
3243             PerlIO_printf(PerlIO_stdout(),
3244                           "\n(with %d registered patch%s, "
3245                           "see perl -V for more detail)",
3246                           LOCAL_PATCH_COUNT,
3247                           (LOCAL_PATCH_COUNT!=1) ? "es" : "");
3248 #endif
3249
3250         PerlIO_printf(PerlIO_stdout(),
3251                       "\n\nCopyright 1987-2007, Larry Wall\n");
3252 #ifdef MACOS_TRADITIONAL
3253         PerlIO_printf(PerlIO_stdout(),
3254                       "\nMac OS port Copyright 1991-2002, Matthias Neeracher;\n"
3255                       "maintained by Chris Nandor\n");
3256 #endif
3257 #ifdef MSDOS
3258         PerlIO_printf(PerlIO_stdout(),
3259                       "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
3260 #endif
3261 #ifdef DJGPP
3262         PerlIO_printf(PerlIO_stdout(),
3263                       "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
3264                       "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
3265 #endif
3266 #ifdef OS2
3267         PerlIO_printf(PerlIO_stdout(),
3268                       "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
3269                       "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
3270 #endif
3271 #ifdef atarist
3272         PerlIO_printf(PerlIO_stdout(),
3273                       "atariST series port, ++jrb  bammi@cadence.com\n");
3274 #endif
3275 #ifdef __BEOS__
3276         PerlIO_printf(PerlIO_stdout(),
3277                       "BeOS port Copyright Tom Spindler, 1997-1999\n");
3278 #endif
3279 #ifdef MPE
3280         PerlIO_printf(PerlIO_stdout(),
3281                       "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-2003\n");
3282 #endif
3283 #ifdef OEMVS
3284         PerlIO_printf(PerlIO_stdout(),
3285                       "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
3286 #endif
3287 #ifdef __VOS__
3288         PerlIO_printf(PerlIO_stdout(),
3289                       "Stratus VOS port by Paul.Green@stratus.com, 1997-2002\n");
3290 #endif
3291 #ifdef __OPEN_VM
3292         PerlIO_printf(PerlIO_stdout(),
3293                       "VM/ESA port by Neale Ferguson, 1998-1999\n");
3294 #endif
3295 #ifdef POSIX_BC
3296         PerlIO_printf(PerlIO_stdout(),
3297                       "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
3298 #endif
3299 #ifdef __MINT__
3300         PerlIO_printf(PerlIO_stdout(),
3301                       "MiNT port by Guido Flohr, 1997-1999\n");
3302 #endif
3303 #ifdef EPOC
3304         PerlIO_printf(PerlIO_stdout(),
3305                       "EPOC port by Olaf Flebbe, 1999-2002\n");
3306 #endif
3307 #ifdef UNDER_CE
3308         PerlIO_printf(PerlIO_stdout(),"WINCE port by Rainer Keuchel, 2001-2002\n");
3309         PerlIO_printf(PerlIO_stdout(),"Built on " __DATE__ " " __TIME__ "\n\n");
3310         wce_hitreturn();
3311 #endif
3312 #ifdef __SYMBIAN32__
3313         PerlIO_printf(PerlIO_stdout(),
3314                       "Symbian port by Nokia, 2004-2005\n");
3315 #endif
3316 #ifdef BINARY_BUILD_NOTICE
3317         BINARY_BUILD_NOTICE;
3318 #endif
3319         PerlIO_printf(PerlIO_stdout(),
3320                       "\n\
3321 Perl may be copied only under the terms of either the Artistic License or the\n\
3322 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
3323 Complete documentation for Perl, including FAQ lists, should be found on\n\
3324 this system using \"man perl\" or \"perldoc perl\".  If you have access to the\n\
3325 Internet, point your browser at http://www.perl.org/, the Perl Home Page.\n\n");
3326         my_exit(0);
3327     case 'w':
3328         if (! (PL_dowarn & G_WARN_ALL_MASK)) {
3329             PL_dowarn |= G_WARN_ON;
3330         }
3331         s++;
3332         return s;
3333     case 'W':
3334         PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
3335         if (!specialWARN(PL_compiling.cop_warnings))
3336             PerlMemShared_free(PL_compiling.cop_warnings);
3337         PL_compiling.cop_warnings = pWARN_ALL ;
3338         s++;
3339         return s;
3340     case 'X':
3341         PL_dowarn = G_WARN_ALL_OFF;
3342         if (!specialWARN(PL_compiling.cop_warnings))
3343             PerlMemShared_free(PL_compiling.cop_warnings);
3344         PL_compiling.cop_warnings = pWARN_NONE ;
3345         s++;
3346         return s;
3347     case '*':
3348     case ' ':
3349         if (s[1] == '-')        /* Additional switches on #! line. */
3350             return s+2;
3351         break;
3352     case '-':
3353     case 0:
3354 #if defined(WIN32) || !defined(PERL_STRICT_CR)
3355     case '\r':
3356 #endif
3357     case '\n':
3358     case '\t':
3359         break;
3360 #ifdef ALTERNATE_SHEBANG
3361     case 'S':                   /* OS/2 needs -S on "extproc" line. */
3362         break;
3363 #endif
3364     default:
3365         Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
3366     }
3367     return NULL;
3368 }
3369
3370 /* compliments of Tom Christiansen */
3371
3372 /* unexec() can be found in the Gnu emacs distribution */
3373 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
3374
3375 void
3376 Perl_my_unexec(pTHX)
3377 {
3378     PERL_UNUSED_CONTEXT;
3379 #ifdef UNEXEC
3380     SV *    prog = newSVpv(BIN_EXP, 0);
3381     SV *    file = newSVpv(PL_origfilename, 0);
3382     int    status = 1;
3383     extern int etext;
3384
3385     sv_catpvs(prog, "/perl");
3386     sv_catpvs(file, ".perldump");
3387
3388     unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
3389     /* unexec prints msg to stderr in case of failure */
3390     PerlProc_exit(status);
3391 #else
3392 #  ifdef VMS
3393 #    include <lib$routines.h>
3394      lib$signal(SS$_DEBUG);  /* ssdef.h #included from vmsish.h */
3395 #  elif defined(WIN32) || defined(__CYGWIN__)
3396     Perl_croak(aTHX_ "dump is not supported");
3397 #  else
3398     ABORT();            /* for use with undump */
3399 #  endif
3400 #endif
3401 }
3402
3403 /* initialize curinterp */
3404 STATIC void
3405 S_init_interp(pTHX)
3406 {
3407     dVAR;
3408 #ifdef MULTIPLICITY
3409 #  define PERLVAR(var,type)
3410 #  define PERLVARA(var,n,type)
3411 #  if defined(PERL_IMPLICIT_CONTEXT)
3412 #    define PERLVARI(var,type,init)             aTHX->var = init;
3413 #    define PERLVARIC(var,type,init)    aTHX->var = init;
3414 #  else
3415 #    define PERLVARI(var,type,init)     PERL_GET_INTERP->var = init;
3416 #    define PERLVARIC(var,type,init)    PERL_GET_INTERP->var = init;
3417 #  endif
3418 #  include "intrpvar.h"
3419 #  undef PERLVAR
3420 #  undef PERLVARA
3421 #  undef PERLVARI
3422 #  undef PERLVARIC
3423 #else
3424 #  define PERLVAR(var,type)
3425 #  define PERLVARA(var,n,type)
3426 #  define PERLVARI(var,type,init)       PL_##var = init;
3427 #  define PERLVARIC(var,type,init)      PL_##var = init;
3428 #  include "intrpvar.h"
3429 #  undef PERLVAR
3430 #  undef PERLVARA
3431 #  undef PERLVARI
3432 #  undef PERLVARIC
3433 #endif
3434
3435     /* As these are inside a structure, PERLVARI isn't capable of initialising
3436        them  */
3437     PL_reg_oldcurpm = PL_reg_curpm = NULL;
3438     PL_reg_poscache = PL_reg_starttry = NULL;
3439 }
3440
3441 STATIC void
3442 S_init_main_stash(pTHX)
3443 {
3444     dVAR;
3445     GV *gv;
3446
3447     PL_curstash = PL_defstash = newHV();
3448     /* We know that the string "main" will be in the global shared string
3449        table, so it's a small saving to use it rather than allocate another
3450        8 bytes.  */
3451     PL_curstname = newSVpvs_share("main");
3452     gv = gv_fetchpvs("main::", GV_ADD|GV_NOTQUAL, SVt_PVHV);
3453     /* If we hadn't caused another reference to "main" to be in the shared
3454        string table above, then it would be worth reordering these two,
3455        because otherwise all we do is delete "main" from it as a consequence
3456        of the SvREFCNT_dec, only to add it again with hv_name_set */
3457     SvREFCNT_dec(GvHV(gv));
3458     hv_name_set(PL_defstash, "main", 4, 0);
3459     GvHV(gv) = (HV*)SvREFCNT_inc_simple(PL_defstash);
3460     SvREADONLY_on(gv);
3461     PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpvs("INC", GV_ADD|GV_NOTQUAL,
3462                                              SVt_PVAV)));
3463     SvREFCNT_inc_simple_void(PL_incgv); /* Don't allow it to be freed */
3464     GvMULTI_on(PL_incgv);
3465     PL_hintgv = gv_fetchpvs("\010", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^H */
3466     GvMULTI_on(PL_hintgv);
3467     PL_defgv = gv_fetchpvs("_", GV_ADD|GV_NOTQUAL, SVt_PVAV);
3468     SvREFCNT_inc_simple_void(PL_defgv);
3469     PL_errgv = gv_HVadd(gv_fetchpvs("@", GV_ADD|GV_NOTQUAL, SVt_PV));
3470     SvREFCNT_inc_simple_void(PL_errgv);
3471     GvMULTI_on(PL_errgv);
3472     PL_replgv = gv_fetchpvs("\022", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^R */
3473     GvMULTI_on(PL_replgv);
3474     (void)Perl_form(aTHX_ "%240s","");  /* Preallocate temp - for immediate signals. */
3475 #ifdef PERL_DONT_CREATE_GVSV
3476     gv_SVadd(PL_errgv);
3477 #endif
3478     sv_grow(ERRSV, 240);        /* Preallocate - for immediate signals. */
3479     sv_setpvn(ERRSV, "", 0);
3480     PL_curstash = PL_defstash;
3481     CopSTASH_set(&PL_compiling, PL_defstash);
3482     PL_debstash = GvHV(gv_fetchpvs("DB::", GV_ADDMULTI, SVt_PVHV));
3483     PL_globalstash = GvHV(gv_fetchpvs("CORE::GLOBAL::", GV_ADDMULTI,
3484                                       SVt_PVHV));
3485     /* We must init $/ before switches are processed. */
3486     sv_setpvn(get_sv("/", TRUE), "\n", 1);
3487 }
3488
3489 STATIC int
3490 S_open_script(pTHX_ const char *scriptname, bool dosearch,
3491               int *suidscript, PerlIO **rsfpp)
3492 {
3493     int fdscript = -1;
3494     dVAR;
3495
3496     *suidscript = -1;
3497
3498     if (PL_e_script) {
3499         PL_origfilename = savepvs("-e");
3500     }
3501     else {
3502         /* if find_script() returns, it returns a malloc()-ed value */
3503         scriptname = PL_origfilename = find_script(scriptname, dosearch, NULL, 1);
3504
3505         if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
3506             const char *s = scriptname + 8;
3507             fdscript = atoi(s);
3508             while (isDIGIT(*s))
3509                 s++;
3510             if (*s) {
3511                 /* PSz 18 Feb 04
3512                  * Tell apart "normal" usage of fdscript, e.g.
3513                  * with bash on FreeBSD:
3514                  *   perl <( echo '#!perl -DA'; echo 'print "$0\n"')
3515                  * from usage in suidperl.
3516                  * Does any "normal" usage leave garbage after the number???
3517                  * Is it a mistake to use a similar /dev/fd/ construct for
3518                  * suidperl?
3519                  */
3520                 *suidscript = 1;
3521                 /* PSz 20 Feb 04  
3522                  * Be supersafe and do some sanity-checks.
3523                  * Still, can we be sure we got the right thing?
3524                  */
3525                 if (*s != '/') {
3526                     Perl_croak(aTHX_ "Wrong syntax (suid) fd script name \"%s\"\n", s);
3527                 }
3528                 if (! *(s+1)) {
3529                     Perl_croak(aTHX_ "Missing (suid) fd script name\n");
3530                 }
3531                 scriptname = savepv(s + 1);
3532                 Safefree(PL_origfilename);
3533                 PL_origfilename = (char *)scriptname;
3534             }
3535         }
3536     }
3537
3538     CopFILE_free(PL_curcop);
3539     CopFILE_set(PL_curcop, PL_origfilename);
3540     if (*PL_origfilename == '-' && PL_origfilename[1] == '\0')
3541         scriptname = (char *)"";
3542     if (fdscript >= 0) {
3543         *rsfpp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
3544 #       if defined(HAS_FCNTL) && defined(F_SETFD)
3545             if (*rsfpp)
3546                 /* ensure close-on-exec */
3547                 fcntl(PerlIO_fileno(*rsfpp),F_SETFD,1);
3548 #       endif
3549     }
3550 #ifdef IAMSUID
3551     else {
3552         Perl_croak(aTHX_ "sperl needs fd script\n"
3553                    "You should not call sperl directly; do you need to "
3554                    "change a #! line\nfrom sperl to perl?\n");
3555
3556 /* PSz 11 Nov 03
3557  * Do not open (or do other fancy stuff) while setuid.
3558  * Perl does the open, and hands script to suidperl on a fd;
3559  * suidperl only does some checks, sets up UIDs and re-execs
3560  * perl with that fd as it has always done.
3561  */
3562     }
3563     if (*suidscript != 1) {
3564         Perl_croak(aTHX_ "suidperl needs (suid) fd script\n");
3565     }
3566 #else /* IAMSUID */
3567     else if (!*scriptname) {
3568         forbid_setid(0, *suidscript);
3569         *rsfpp = PerlIO_stdin();
3570     }
3571     else {
3572 #ifdef FAKE_BIT_BUCKET
3573         /* This hack allows one not to have /dev/null (or BIT_BUCKET as it
3574          * is called) and still have the "-e" work.  (Believe it or not,
3575          * a /dev/null is required for the "-e" to work because source
3576          * filter magic is used to implement it. ) This is *not* a general
3577          * replacement for a /dev/null.  What we do here is create a temp
3578          * file (an empty file), open up that as the script, and then
3579          * immediately close and unlink it.  Close enough for jazz. */ 
3580 #define FAKE_BIT_BUCKET_PREFIX "/tmp/perlnull-"
3581 #define FAKE_BIT_BUCKET_SUFFIX "XXXXXXXX"
3582 #define FAKE_BIT_BUCKET_TEMPLATE FAKE_BIT_BUCKET_PREFIX FAKE_BIT_BUCKET_SUFFIX
3583         char tmpname[sizeof(FAKE_BIT_BUCKET_TEMPLATE)] = {
3584             FAKE_BIT_BUCKET_TEMPLATE
3585         };
3586         const char * const err = "Failed to create a fake bit bucket";
3587         if (strEQ(scriptname, BIT_BUCKET)) {
3588 #ifdef HAS_MKSTEMP /* Hopefully mkstemp() is safe here. */
3589             int tmpfd = mkstemp(tmpname);
3590             if (tmpfd > -1) {
3591                 scriptname = tmpname;
3592                 close(tmpfd);
3593             } else
3594                 Perl_croak(aTHX_ err);
3595 #else
3596 #  ifdef HAS_MKTEMP
3597             scriptname = mktemp(tmpname);
3598             if (!scriptname)
3599                 Perl_croak(aTHX_ err);
3600 #  endif
3601 #endif
3602         }
3603 #endif
3604         *rsfpp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
3605 #ifdef FAKE_BIT_BUCKET
3606         if (memEQ(scriptname, FAKE_BIT_BUCKET_PREFIX,
3607                   sizeof(FAKE_BIT_BUCKET_PREFIX) - 1)
3608             && strlen(scriptname) == sizeof(tmpname) - 1) {
3609             unlink(scriptname);
3610         }
3611         scriptname = BIT_BUCKET;
3612 #endif
3613 #       if defined(HAS_FCNTL) && defined(F_SETFD)
3614             if (*rsfpp)
3615                 /* ensure close-on-exec */
3616                 fcntl(PerlIO_fileno(*rsfpp),F_SETFD,1);
3617 #       endif
3618     }
3619 #endif /* IAMSUID */
3620     if (!*rsfpp) {
3621         /* PSz 16 Sep 03  Keep neat error message */
3622         if (PL_e_script)
3623             Perl_croak(aTHX_ "Can't open "BIT_BUCKET": %s\n", Strerror(errno));
3624         else
3625             Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3626                     CopFILE(PL_curcop), Strerror(errno));
3627     }
3628     return fdscript;
3629 }
3630
3631 /* Mention
3632  * I_SYSSTATVFS HAS_FSTATVFS
3633  * I_SYSMOUNT
3634  * I_STATFS     HAS_FSTATFS     HAS_GETFSSTAT
3635  * I_MNTENT     HAS_GETMNTENT   HAS_HASMNTOPT
3636  * here so that metaconfig picks them up. */
3637
3638 #ifdef IAMSUID
3639 STATIC int
3640 S_fd_on_nosuid_fs(pTHX_ int fd)
3641 {
3642 /* PSz 27 Feb 04
3643  * We used to do this as "plain" user (after swapping UIDs with setreuid);
3644  * but is needed also on machines without setreuid.
3645  * Seems safe enough to run as root.
3646  */
3647     int check_okay = 0; /* able to do all the required sys/libcalls */
3648     int on_nosuid  = 0; /* the fd is on a nosuid fs */
3649     /* PSz 12 Nov 03
3650      * Need to check noexec also: nosuid might not be set, the average
3651      * sysadmin would say that nosuid is irrelevant once he sets noexec.
3652      */
3653     int on_noexec  = 0; /* the fd is on a noexec fs */
3654
3655 /*
3656  * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
3657  * fstatvfs() is UNIX98.
3658  * fstatfs() is 4.3 BSD.
3659  * ustat()+getmnt() is pre-4.3 BSD.
3660  * getmntent() is O(number-of-mounted-filesystems) and can hang on
3661  * an irrelevant filesystem while trying to reach the right one.
3662  */
3663
3664 #undef FD_ON_NOSUID_CHECK_OKAY  /* found the syscalls to do the check? */
3665
3666 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3667         defined(HAS_FSTATVFS)
3668 #   define FD_ON_NOSUID_CHECK_OKAY
3669     struct statvfs stfs;
3670
3671     check_okay = fstatvfs(fd, &stfs) == 0;
3672     on_nosuid  = check_okay && (stfs.f_flag  & ST_NOSUID);
3673 #ifdef ST_NOEXEC
3674     /* ST_NOEXEC certainly absent on AIX 5.1, and doesn't seem to be documented
3675        on platforms where it is present.  */
3676     on_noexec  = check_okay && (stfs.f_flag  & ST_NOEXEC);
3677 #endif
3678 #   endif /* fstatvfs */
3679
3680 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3681         defined(PERL_MOUNT_NOSUID)      && \
3682         defined(PERL_MOUNT_NOEXEC)      && \
3683         defined(HAS_FSTATFS)            && \
3684         defined(HAS_STRUCT_STATFS)      && \
3685         defined(HAS_STRUCT_STATFS_F_FLAGS)
3686 #   define FD_ON_NOSUID_CHECK_OKAY
3687     struct statfs  stfs;
3688
3689     check_okay = fstatfs(fd, &stfs)  == 0;
3690     on_nosuid  = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
3691     on_noexec  = check_okay && (stfs.f_flags & PERL_MOUNT_NOEXEC);
3692 #   endif /* fstatfs */
3693
3694 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3695         defined(PERL_MOUNT_NOSUID)      && \
3696         defined(PERL_MOUNT_NOEXEC)      && \
3697         defined(HAS_FSTAT)              && \
3698         defined(HAS_USTAT)              && \
3699         defined(HAS_GETMNT)             && \
3700         defined(HAS_STRUCT_FS_DATA)     && \
3701         defined(NOSTAT_ONE)
3702 #   define FD_ON_NOSUID_CHECK_OKAY
3703     Stat_t fdst;
3704
3705     if (fstat(fd, &fdst) == 0) {
3706         struct ustat us;
3707         if (ustat(fdst.st_dev, &us) == 0) {
3708             struct fs_data fsd;
3709             /* NOSTAT_ONE here because we're not examining fields which
3710              * vary between that case and STAT_ONE. */
3711             if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
3712                 size_t cmplen = sizeof(us.f_fname);
3713                 if (sizeof(fsd.fd_req.path) < cmplen)
3714                     cmplen = sizeof(fsd.fd_req.path);
3715                 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
3716                     fdst.st_dev == fsd.fd_req.dev) {
3717                     check_okay = 1;
3718                     on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
3719                     on_noexec = fsd.fd_req.flags & PERL_MOUNT_NOEXEC;
3720                 }
3721             }
3722         }
3723     }
3724 #   endif /* fstat+ustat+getmnt */
3725
3726 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3727         defined(HAS_GETMNTENT)          && \
3728         defined(HAS_HASMNTOPT)          && \
3729         defined(MNTOPT_NOSUID)          && \
3730         defined(MNTOPT_NOEXEC)
3731 #   define FD_ON_NOSUID_CHECK_OKAY
3732     FILE                *mtab = fopen("/etc/mtab", "r");
3733     struct mntent       *entry;
3734     Stat_t              stb, fsb;
3735
3736     if (mtab && (fstat(fd, &stb) == 0)) {
3737         while (entry = getmntent(mtab)) {
3738             if (stat(entry->mnt_dir, &fsb) == 0
3739                 && fsb.st_dev == stb.st_dev)
3740             {
3741                 /* found the filesystem */
3742                 check_okay = 1;
3743                 if (hasmntopt(entry, MNTOPT_NOSUID))
3744                     on_nosuid = 1;
3745                 if (hasmntopt(entry, MNTOPT_NOEXEC))
3746                     on_noexec = 1;
3747                 break;
3748             } /* A single fs may well fail its stat(). */
3749         }
3750     }
3751     if (mtab)
3752         fclose(mtab);
3753 #   endif /* getmntent+hasmntopt */
3754
3755     if (!check_okay)
3756         Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid/noexec", PL_origfilename);
3757     if (on_nosuid)
3758         Perl_croak(aTHX_ "Setuid script \"%s\" on nosuid filesystem", PL_origfilename);
3759     if (on_noexec)
3760         Perl_croak(aTHX_ "Setuid script \"%s\" on noexec filesystem", PL_origfilename);
3761     return ((!check_okay) || on_nosuid || on_noexec);
3762 }
3763 #endif /* IAMSUID */
3764
3765 STATIC void
3766 S_validate_suid(pTHX_ const char *validarg, const char *scriptname,
3767                 int fdscript, int suidscript, SV *linestr_sv, PerlIO *rsfp)
3768 {
3769     dVAR;
3770 #ifdef DOSUID
3771     const char *s, *s2;
3772 #endif
3773
3774 #ifdef DOSUID
3775 #  ifdef IAMSUID
3776     PERL_UNUSED_ARG(scriptname);
3777 #  else
3778     PERL_UNUSED_ARG(suidscript);
3779 #  endif
3780 #else
3781     PERL_UNUSED_ARG(validarg);
3782     PERL_UNUSED_ARG(scriptname);
3783     PERL_UNUSED_ARG(linestr_sv);
3784     PERL_UNUSED_ARG(fdscript);
3785     PERL_UNUSED_ARG(suidscript);
3786 #  ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
3787     PERL_UNUSED_ARG(rsfp);
3788 #  endif
3789 #endif
3790
3791     /* do we need to emulate setuid on scripts? */
3792
3793     /* This code is for those BSD systems that have setuid #! scripts disabled
3794      * in the kernel because of a security problem.  Merely defining DOSUID
3795      * in perl will not fix that problem, but if you have disabled setuid
3796      * scripts in the kernel, this will attempt to emulate setuid and setgid
3797      * on scripts that have those now-otherwise-useless bits set.  The setuid
3798      * root version must be called suidperl or sperlN.NNN.  If regular perl
3799      * discovers that it has opened a setuid script, it calls suidperl with
3800      * the same argv that it had.  If suidperl finds that the script it has
3801      * just opened is NOT setuid root, it sets the effective uid back to the
3802      * uid.  We don't just make perl setuid root because that loses the
3803      * effective uid we had before invoking perl, if it was different from the
3804      * uid.
3805      * PSz 27 Feb 04
3806      * Description/comments above do not match current workings:
3807      *   suidperl must be hardlinked to sperlN.NNN (that is what we exec);
3808      *   suidperl called with script open and name changed to /dev/fd/N/X;
3809      *   suidperl croaks if script is not setuid;
3810      *   making perl setuid would be a huge security risk (and yes, that
3811      *     would lose any euid we might have had).
3812      *
3813      * DOSUID must be defined in both perl and suidperl, and IAMSUID must
3814      * be defined in suidperl only.  suidperl must be setuid root.  The
3815      * Configure script will set this up for you if you want it.
3816      */
3817
3818 #ifdef DOSUID
3819
3820     if (PerlLIO_fstat(PerlIO_fileno(rsfp),&PL_statbuf) < 0)     /* normal stat is insecure */
3821         Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
3822     if (PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
3823         I32 len;
3824         const char *linestr;
3825         const char *s_end;
3826
3827 #  ifdef IAMSUID
3828         if (fdscript < 0 || suidscript != 1)
3829             Perl_croak(aTHX_ "Need (suid) fdscript in suidperl\n");     /* We already checked this */
3830         /* PSz 11 Nov 03
3831          * Since the script is opened by perl, not suidperl, some of these
3832          * checks are superfluous. Leaving them in probably does not lower
3833          * security(?!).
3834          */
3835         /* PSz 27 Feb 04
3836          * Do checks even for systems with no HAS_SETREUID.
3837          * We used to swap, then re-swap UIDs with
3838 #    ifdef HAS_SETREUID
3839             if (setreuid(PL_euid,PL_uid) < 0
3840                 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
3841                 Perl_croak(aTHX_ "Can't swap uid and euid");
3842 #    endif
3843 #    ifdef HAS_SETREUID
3844             if (setreuid(PL_uid,PL_euid) < 0
3845                 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
3846                 Perl_croak(aTHX_ "Can't reswap uid and euid");
3847 #    endif
3848          */
3849
3850         /* On this access check to make sure the directories are readable,
3851          * there is actually a small window that the user could use to make
3852          * filename point to an accessible directory.  So there is a faint
3853          * chance that someone could execute a setuid script down in a
3854          * non-accessible directory.  I don't know what to do about that.
3855          * But I don't think it's too important.  The manual lies when
3856          * it says access() is useful in setuid programs.
3857          * 
3858          * So, access() is pretty useless... but not harmful... do anyway.
3859          */
3860         if (PerlLIO_access(CopFILE(PL_curcop),1)) { /*double check*/
3861             Perl_croak(aTHX_ "Can't access() script\n");
3862         }
3863
3864         /* If we can swap euid and uid, then we can determine access rights
3865          * with a simple stat of the file, and then compare device and
3866          * inode to make sure we did stat() on the same file we opened.
3867          * Then we just have to make sure he or she can execute it.
3868          * 
3869          * PSz 24 Feb 04
3870          * As the script is opened by perl, not suidperl, we do not need to
3871          * care much about access rights.
3872          * 
3873          * The 'script changed' check is needed, or we can get lied to
3874          * about $0 with e.g.
3875          *  suidperl /dev/fd/4//bin/x 4<setuidscript
3876          * Without HAS_SETREUID, is it safe to stat() as root?
3877          * 
3878          * Are there any operating systems that pass /dev/fd/xxx for setuid
3879          * scripts, as suggested/described in perlsec(1)? Surely they do not
3880          * pass the script name as we do, so the "script changed" test would
3881          * fail for them... but we never get here with
3882          * SETUID_SCRIPTS_ARE_SECURE_NOW defined.
3883          * 
3884          * This is one place where we must "lie" about return status: not
3885          * say if the stat() failed. We are doing this as root, and could
3886          * be tricked into reporting existence or not of files that the
3887          * "plain" user cannot even see.
3888          */
3889         {
3890             Stat_t tmpstatbuf;
3891             if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0 ||
3892                 tmpstatbuf.st_dev != PL_statbuf.st_dev ||
3893                 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
3894                 Perl_croak(aTHX_ "Setuid script changed\n");
3895             }
3896
3897         }
3898         if (!cando(S_IXUSR,FALSE,&PL_statbuf))          /* can real uid exec? */
3899             Perl_croak(aTHX_ "Real UID cannot exec script\n");
3900
3901         /* PSz 27 Feb 04
3902          * We used to do this check as the "plain" user (after swapping
3903          * UIDs). But the check for nosuid and noexec filesystem is needed,
3904          * and should be done even without HAS_SETREUID. (Maybe those
3905          * operating systems do not have such mount options anyway...)
3906          * Seems safe enough to do as root.
3907          */
3908 #    if !defined(NO_NOSUID_CHECK)
3909         if (fd_on_nosuid_fs(PerlIO_fileno(rsfp))) {
3910             Perl_croak(aTHX_ "Setuid script on nosuid or noexec filesystem\n");
3911         }
3912 #    endif
3913 #  endif /* IAMSUID */
3914
3915         if (!S_ISREG(PL_statbuf.st_mode)) {
3916             Perl_croak(aTHX_ "Setuid script not plain file\n");
3917         }
3918         if (PL_statbuf.st_mode & S_IWOTH)
3919             Perl_croak(aTHX_ "Setuid/gid script is writable by world");
3920         PL_doswitches = FALSE;          /* -s is insecure in suid */
3921         /* PSz 13 Nov 03  But -s was caught elsewhere ... so unsetting it here is useless(?!) */
3922         CopLINE_inc(PL_curcop);
3923         if (sv_gets(linestr_sv, rsfp, 0) == NULL)
3924             Perl_croak(aTHX_ "No #! line");
3925         linestr = SvPV_nolen_const(linestr_sv);
3926         /* required even on Sys V */
3927         if (!*linestr || !linestr[1] || strnNE(linestr,"#!",2))
3928             Perl_croak(aTHX_ "No #! line");
3929         linestr += 2;
3930         s = linestr;
3931         /* PSz 27 Feb 04 */
3932         /* Sanity check on line length */
3933         s_end = s + strlen(s);
3934         if (s_end == s || (s_end - s) > 4000)
3935             Perl_croak(aTHX_ "Very long #! line");
3936         /* Allow more than a single space after #! */
3937         while (isSPACE(*s)) s++;
3938         /* Sanity check on buffer end */
3939         while ((*s) && !isSPACE(*s)) s++;
3940         for (s2 = s;  (s2 > linestr &&
3941                        (isDIGIT(s2[-1]) || s2[-1] == '.' || s2[-1] == '_'
3942                         || s2[-1] == '-'));  s2--) ;
3943         /* Sanity check on buffer start */
3944         if ( (s2-4 < linestr || strnNE(s2-4,"perl",4)) &&
3945               (s-9 < linestr || strnNE(s-9,"perl",4)) )
3946             Perl_croak(aTHX_ "Not a perl script");
3947         while (*s == ' ' || *s == '\t') s++;
3948         /*
3949          * #! arg must be what we saw above.  They can invoke it by
3950          * mentioning suidperl explicitly, but they may not add any strange
3951          * arguments beyond what #! says if they do invoke suidperl that way.
3952          */
3953         /*
3954          * The way validarg was set up, we rely on the kernel to start
3955          * scripts with argv[1] set to contain all #! line switches (the
3956          * whole line).
3957          */
3958         /*
3959          * Check that we got all the arguments listed in the #! line (not
3960          * just that there are no extraneous arguments). Might not matter
3961          * much, as switches from #! line seem to be acted upon (also), and
3962          * so may be checked and trapped in perl. But, security checks must
3963          * be done in suidperl and not deferred to perl. Note that suidperl
3964          * does not get around to parsing (and checking) the switches on
3965          * the #! line (but execs perl sooner).
3966          * Allow (require) a trailing newline (which may be of two
3967          * characters on some architectures?) (but no other trailing
3968          * whitespace).
3969          */
3970         len = strlen(validarg);
3971         if (strEQ(validarg," PHOOEY ") ||
3972             strnNE(s,validarg,len) || !isSPACE(s[len]) ||
3973             !((s_end - s) == len+1
3974               || ((s_end - s) == len+2 && isSPACE(s[len+1]))))
3975             Perl_croak(aTHX_ "Args must match #! line");
3976
3977 #  ifndef IAMSUID
3978         if (fdscript < 0 &&
3979             PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
3980             PL_euid == PL_statbuf.st_uid)
3981             if (!PL_do_undump)
3982                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3983 FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n");
3984 #  endif /* IAMSUID */
3985
3986         if (fdscript < 0 &&
3987             PL_euid) {  /* oops, we're not the setuid root perl */
3988             /* PSz 18 Feb 04
3989              * When root runs a setuid script, we do not go through the same
3990              * steps of execing sperl and then perl with fd scripts, but
3991              * simply set up UIDs within the same perl invocation; so do
3992              * not have the same checks (on options, whatever) that we have
3993              * for plain users. No problem really: would have to be a script
3994              * that does not actually work for plain users; and if root is
3995              * foolish and can be persuaded to run such an unsafe script, he
3996              * might run also non-setuid ones, and deserves what he gets.
3997              * 
3998              * Or, we might drop the PL_euid check above (and rely just on
3999              * fdscript to avoid loops), and do the execs
4000              * even for root.
4001              */
4002 #  ifndef IAMSUID
4003             int which;
4004             /* PSz 11 Nov 03
4005              * Pass fd script to suidperl.
4006              * Exec suidperl, substituting fd script for scriptname.
4007              * Pass script name as "subdir" of fd, which perl will grok;
4008              * in fact will use that to distinguish this from "normal"
4009              * usage, see comments above.
4010              */
4011             PerlIO_rewind(rsfp);
4012             PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0);  /* just in case rewind didn't */
4013             /* PSz 27 Feb 04  Sanity checks on scriptname */
4014             if ((!scriptname) || (!*scriptname) ) {
4015                 Perl_croak(aTHX_ "No setuid script name\n");
4016             }
4017             if (*scriptname == '-') {
4018                 Perl_croak(aTHX_ "Setuid script name may not begin with dash\n");
4019                 /* Or we might confuse it with an option when replacing
4020                  * name in argument list, below (though we do pointer, not
4021                  * string, comparisons).
4022                  */
4023             }
4024             for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
4025             if (!PL_origargv[which]) {
4026                 Perl_croak(aTHX_ "Can't change argv to have fd script\n");
4027             }
4028             PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
4029                                           PerlIO_fileno(rsfp), PL_origargv[which]));
4030 #    if defined(HAS_FCNTL) && defined(F_SETFD)
4031             fcntl(PerlIO_fileno(rsfp),F_SETFD,0);       /* ensure no close-on-exec */
4032 #    endif
4033             PERL_FPU_PRE_EXEC
4034             PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
4035                                      (int)PERL_REVISION, (int)PERL_VERSION,
4036                                      (int)PERL_SUBVERSION), PL_origargv);
4037             PERL_FPU_POST_EXEC
4038 #  endif /* IAMSUID */
4039             Perl_croak(aTHX_ "Can't do setuid (cannot exec sperl)\n");
4040         }
4041
4042         if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
4043 /* PSz 26 Feb 04
4044  * This seems back to front: we try HAS_SETEGID first; if not available
4045  * then try HAS_SETREGID; as a last chance we try HAS_SETRESGID. May be OK
4046  * in the sense that we only want to set EGID; but are there any machines
4047  * with either of the latter, but not the former? Same with UID, later.
4048  */
4049 #  ifdef HAS_SETEGID
4050             (void)setegid(PL_statbuf.st_gid);
4051 #  else
4052 #    ifdef HAS_SETREGID
4053            (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
4054 #    else
4055 #      ifdef HAS_SETRESGID
4056            (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
4057 #      else
4058             PerlProc_setgid(PL_statbuf.st_gid);
4059 #      endif
4060 #    endif
4061 #  endif
4062             if (PerlProc_getegid() != PL_statbuf.st_gid)
4063                 Perl_croak(aTHX_ "Can't do setegid!\n");
4064         }
4065         if (PL_statbuf.st_mode & S_ISUID) {
4066             if (PL_statbuf.st_uid != PL_euid)
4067 #  ifdef HAS_SETEUID
4068                 (void)seteuid(PL_statbuf.st_uid);       /* all that for this */
4069 #  else
4070 #    ifdef HAS_SETREUID
4071                 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
4072 #    else
4073 #      ifdef HAS_SETRESUID
4074                 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
4075 #      else
4076                 PerlProc_setuid(PL_statbuf.st_uid);
4077 #      endif
4078 #    endif
4079 #  endif
4080             if (PerlProc_geteuid() != PL_statbuf.st_uid)
4081                 Perl_croak(aTHX_ "Can't do seteuid!\n");
4082         }
4083         else if (PL_uid) {                      /* oops, mustn't run as root */
4084 #  ifdef HAS_SETEUID
4085           (void)seteuid((Uid_t)PL_uid);
4086 #  else
4087 #    ifdef HAS_SETREUID
4088           (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
4089 #    else
4090 #      ifdef HAS_SETRESUID
4091           (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
4092 #      else
4093           PerlProc_setuid((Uid_t)PL_uid);
4094 #      endif
4095 #    endif
4096 #  endif
4097             if (PerlProc_geteuid() != PL_uid)
4098                 Perl_croak(aTHX_ "Can't do seteuid!\n");
4099         }
4100         init_ids();
4101         if (!cando(S_IXUSR,TRUE,&PL_statbuf))
4102             Perl_croak(aTHX_ "Effective UID cannot exec script\n");     /* they can't do this */
4103     }
4104 #  ifdef IAMSUID
4105     else if (fdscript < 0 || suidscript != 1)
4106         /* PSz 13 Nov 03  Caught elsewhere, useless(?!) here */
4107         Perl_croak(aTHX_ "(suid) fdscript needed in suidperl\n");
4108     else {
4109 /* PSz 16 Sep 03  Keep neat error message */
4110         Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
4111     }
4112
4113     /* We absolutely must clear out any saved ids here, so we */
4114     /* exec the real perl, substituting fd script for scriptname. */
4115     /* (We pass script name as "subdir" of fd, which perl will grok.) */
4116     /* 
4117      * It might be thought that using setresgid and/or setresuid (changed to
4118      * set the saved IDs) above might obviate the need to exec, and we could
4119      * go on to "do the perl thing".
4120      * 
4121      * Is there such a thing as "saved GID", and is that set for setuid (but
4122      * not setgid) execution like suidperl? Without exec, it would not be
4123      * cleared for setuid (but not setgid) scripts (or might need a dummy
4124      * setresgid).
4125      * 
4126      * We need suidperl to do the exact same argument checking that perl
4127      * does. Thus it cannot be very small; while it could be significantly
4128      * smaller, it is safer (simpler?) to make it essentially the same
4129      * binary as perl (but they are not identical). - Maybe could defer that
4130      * check to the invoked perl, and suidperl be a tiny wrapper instead;
4131      * but prefer to do thorough checks in suidperl itself. Such deferral
4132      * would make suidperl security rely on perl, a design no-no.
4133      * 
4134      * Setuid things should be short and simple, thus easy to understand and
4135      * verify. They should do their "own thing", without influence by
4136      * attackers. It may help if their internal execution flow is fixed,
4137      * regardless of platform: it may be best to exec anyway.
4138      * 
4139      * Suidperl should at least be conceptually simple: a wrapper only,
4140      * never to do any real perl. Maybe we should put
4141      * #ifdef IAMSUID
4142      *         Perl_croak(aTHX_ "Suidperl should never do real perl\n");
4143      * #endif
4144      * into the perly bits.
4145      */
4146     PerlIO_rewind(rsfp);
4147     PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0);  /* just in case rewind didn't */
4148     /* PSz 11 Nov 03
4149      * Keep original arguments: suidperl already has fd script.
4150      */
4151 #  if defined(HAS_FCNTL) && defined(F_SETFD)
4152     fcntl(PerlIO_fileno(rsfp),F_SETFD,0);       /* ensure no close-on-exec */
4153 #  endif
4154     PERL_FPU_PRE_EXEC
4155     PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
4156                              (int)PERL_REVISION, (int)PERL_VERSION,
4157                              (int)PERL_SUBVERSION), PL_origargv);/* try again */
4158     PERL_FPU_POST_EXEC
4159     Perl_croak(aTHX_ "Can't do setuid (suidperl cannot exec perl)\n");
4160 #  endif /* IAMSUID */
4161 #else /* !DOSUID */
4162     if (PL_euid != PL_uid || PL_egid != PL_gid) {       /* (suidperl doesn't exist, in fact) */
4163 #  ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
4164         PerlLIO_fstat(PerlIO_fileno(rsfp),&PL_statbuf); /* may be either wrapped or real suid */
4165         if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
4166             ||
4167             (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
4168            )
4169             if (!PL_do_undump)
4170                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
4171 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
4172 #  endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
4173         /* not set-id, must be wrapped */
4174     }
4175 #endif /* DOSUID */
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  */