89dc73a7835a0c6f607fdce5eec1e4a5e790f6b0
[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 #  endif
3778 #else
3779     PERL_UNUSED_ARG(validarg);
3780     PERL_UNUSED_ARG(scriptname);
3781     PERL_UNUSED_ARG(linestr_sv);
3782     PERL_UNUSED_ARG(fdscript);
3783     PERL_UNUSED_ARG(suidscript);
3784 #  ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
3785     PERL_UNUSED_ARG(rsfp);
3786 #  endif
3787 #endif
3788
3789     /* do we need to emulate setuid on scripts? */
3790
3791     /* This code is for those BSD systems that have setuid #! scripts disabled
3792      * in the kernel because of a security problem.  Merely defining DOSUID
3793      * in perl will not fix that problem, but if you have disabled setuid
3794      * scripts in the kernel, this will attempt to emulate setuid and setgid
3795      * on scripts that have those now-otherwise-useless bits set.  The setuid
3796      * root version must be called suidperl or sperlN.NNN.  If regular perl
3797      * discovers that it has opened a setuid script, it calls suidperl with
3798      * the same argv that it had.  If suidperl finds that the script it has
3799      * just opened is NOT setuid root, it sets the effective uid back to the
3800      * uid.  We don't just make perl setuid root because that loses the
3801      * effective uid we had before invoking perl, if it was different from the
3802      * uid.
3803      * PSz 27 Feb 04
3804      * Description/comments above do not match current workings:
3805      *   suidperl must be hardlinked to sperlN.NNN (that is what we exec);
3806      *   suidperl called with script open and name changed to /dev/fd/N/X;
3807      *   suidperl croaks if script is not setuid;
3808      *   making perl setuid would be a huge security risk (and yes, that
3809      *     would lose any euid we might have had).
3810      *
3811      * DOSUID must be defined in both perl and suidperl, and IAMSUID must
3812      * be defined in suidperl only.  suidperl must be setuid root.  The
3813      * Configure script will set this up for you if you want it.
3814      */
3815
3816 #ifdef DOSUID
3817
3818     if (PerlLIO_fstat(PerlIO_fileno(rsfp),&PL_statbuf) < 0)     /* normal stat is insecure */
3819         Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
3820     if (PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
3821         I32 len;
3822         const char *linestr;
3823         const char *s_end;
3824
3825 #  ifdef IAMSUID
3826         if (fdscript < 0 || suidscript != 1)
3827             Perl_croak(aTHX_ "Need (suid) fdscript in suidperl\n");     /* We already checked this */
3828         /* PSz 11 Nov 03
3829          * Since the script is opened by perl, not suidperl, some of these
3830          * checks are superfluous. Leaving them in probably does not lower
3831          * security(?!).
3832          */
3833         /* PSz 27 Feb 04
3834          * Do checks even for systems with no HAS_SETREUID.
3835          * We used to swap, then re-swap UIDs with
3836 #    ifdef HAS_SETREUID
3837             if (setreuid(PL_euid,PL_uid) < 0
3838                 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
3839                 Perl_croak(aTHX_ "Can't swap uid and euid");
3840 #    endif
3841 #    ifdef HAS_SETREUID
3842             if (setreuid(PL_uid,PL_euid) < 0
3843                 || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
3844                 Perl_croak(aTHX_ "Can't reswap uid and euid");
3845 #    endif
3846          */
3847
3848         /* On this access check to make sure the directories are readable,
3849          * there is actually a small window that the user could use to make
3850          * filename point to an accessible directory.  So there is a faint
3851          * chance that someone could execute a setuid script down in a
3852          * non-accessible directory.  I don't know what to do about that.
3853          * But I don't think it's too important.  The manual lies when
3854          * it says access() is useful in setuid programs.
3855          * 
3856          * So, access() is pretty useless... but not harmful... do anyway.
3857          */
3858         if (PerlLIO_access(CopFILE(PL_curcop),1)) { /*double check*/
3859             Perl_croak(aTHX_ "Can't access() script\n");
3860         }
3861
3862         /* If we can swap euid and uid, then we can determine access rights
3863          * with a simple stat of the file, and then compare device and
3864          * inode to make sure we did stat() on the same file we opened.
3865          * Then we just have to make sure he or she can execute it.
3866          * 
3867          * PSz 24 Feb 04
3868          * As the script is opened by perl, not suidperl, we do not need to
3869          * care much about access rights.
3870          * 
3871          * The 'script changed' check is needed, or we can get lied to
3872          * about $0 with e.g.
3873          *  suidperl /dev/fd/4//bin/x 4<setuidscript
3874          * Without HAS_SETREUID, is it safe to stat() as root?
3875          * 
3876          * Are there any operating systems that pass /dev/fd/xxx for setuid
3877          * scripts, as suggested/described in perlsec(1)? Surely they do not
3878          * pass the script name as we do, so the "script changed" test would
3879          * fail for them... but we never get here with
3880          * SETUID_SCRIPTS_ARE_SECURE_NOW defined.
3881          * 
3882          * This is one place where we must "lie" about return status: not
3883          * say if the stat() failed. We are doing this as root, and could
3884          * be tricked into reporting existence or not of files that the
3885          * "plain" user cannot even see.
3886          */
3887         {
3888             Stat_t tmpstatbuf;
3889             if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0 ||
3890                 tmpstatbuf.st_dev != PL_statbuf.st_dev ||
3891                 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
3892                 Perl_croak(aTHX_ "Setuid script changed\n");
3893             }
3894
3895         }
3896         if (!cando(S_IXUSR,FALSE,&PL_statbuf))          /* can real uid exec? */
3897             Perl_croak(aTHX_ "Real UID cannot exec script\n");
3898
3899         /* PSz 27 Feb 04
3900          * We used to do this check as the "plain" user (after swapping
3901          * UIDs). But the check for nosuid and noexec filesystem is needed,
3902          * and should be done even without HAS_SETREUID. (Maybe those
3903          * operating systems do not have such mount options anyway...)
3904          * Seems safe enough to do as root.
3905          */
3906 #    if !defined(NO_NOSUID_CHECK)
3907         if (fd_on_nosuid_fs(PerlIO_fileno(rsfp))) {
3908             Perl_croak(aTHX_ "Setuid script on nosuid or noexec filesystem\n");
3909         }
3910 #    endif
3911 #  endif /* IAMSUID */
3912
3913         if (!S_ISREG(PL_statbuf.st_mode)) {
3914             Perl_croak(aTHX_ "Setuid script not plain file\n");
3915         }
3916         if (PL_statbuf.st_mode & S_IWOTH)
3917             Perl_croak(aTHX_ "Setuid/gid script is writable by world");
3918         PL_doswitches = FALSE;          /* -s is insecure in suid */
3919         /* PSz 13 Nov 03  But -s was caught elsewhere ... so unsetting it here is useless(?!) */
3920         CopLINE_inc(PL_curcop);
3921         if (sv_gets(linestr_sv, rsfp, 0) == NULL)
3922             Perl_croak(aTHX_ "No #! line");
3923         linestr = SvPV_nolen_const(linestr_sv);
3924         /* required even on Sys V */
3925         if (!*linestr || !linestr[1] || strnNE(linestr,"#!",2))
3926             Perl_croak(aTHX_ "No #! line");
3927         linestr += 2;
3928         s = linestr;
3929         /* PSz 27 Feb 04 */
3930         /* Sanity check on line length */
3931         s_end = s + strlen(s);
3932         if (s_end == s || (s_end - s) > 4000)
3933             Perl_croak(aTHX_ "Very long #! line");
3934         /* Allow more than a single space after #! */
3935         while (isSPACE(*s)) s++;
3936         /* Sanity check on buffer end */
3937         while ((*s) && !isSPACE(*s)) s++;
3938         for (s2 = s;  (s2 > linestr &&
3939                        (isDIGIT(s2[-1]) || s2[-1] == '.' || s2[-1] == '_'
3940                         || s2[-1] == '-'));  s2--) ;
3941         /* Sanity check on buffer start */
3942         if ( (s2-4 < linestr || strnNE(s2-4,"perl",4)) &&
3943               (s-9 < linestr || strnNE(s-9,"perl",4)) )
3944             Perl_croak(aTHX_ "Not a perl script");
3945         while (*s == ' ' || *s == '\t') s++;
3946         /*
3947          * #! arg must be what we saw above.  They can invoke it by
3948          * mentioning suidperl explicitly, but they may not add any strange
3949          * arguments beyond what #! says if they do invoke suidperl that way.
3950          */
3951         /*
3952          * The way validarg was set up, we rely on the kernel to start
3953          * scripts with argv[1] set to contain all #! line switches (the
3954          * whole line).
3955          */
3956         /*
3957          * Check that we got all the arguments listed in the #! line (not
3958          * just that there are no extraneous arguments). Might not matter
3959          * much, as switches from #! line seem to be acted upon (also), and
3960          * so may be checked and trapped in perl. But, security checks must
3961          * be done in suidperl and not deferred to perl. Note that suidperl
3962          * does not get around to parsing (and checking) the switches on
3963          * the #! line (but execs perl sooner).
3964          * Allow (require) a trailing newline (which may be of two
3965          * characters on some architectures?) (but no other trailing
3966          * whitespace).
3967          */
3968         len = strlen(validarg);
3969         if (strEQ(validarg," PHOOEY ") ||
3970             strnNE(s,validarg,len) || !isSPACE(s[len]) ||
3971             !((s_end - s) == len+1
3972               || ((s_end - s) == len+2 && isSPACE(s[len+1]))))
3973             Perl_croak(aTHX_ "Args must match #! line");
3974
3975 #  ifndef IAMSUID
3976         if (fdscript < 0 &&
3977             PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
3978             PL_euid == PL_statbuf.st_uid)
3979             if (!PL_do_undump)
3980                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3981 FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n");
3982 #  endif /* IAMSUID */
3983
3984         if (fdscript < 0 &&
3985             PL_euid) {  /* oops, we're not the setuid root perl */
3986             /* PSz 18 Feb 04
3987              * When root runs a setuid script, we do not go through the same
3988              * steps of execing sperl and then perl with fd scripts, but
3989              * simply set up UIDs within the same perl invocation; so do
3990              * not have the same checks (on options, whatever) that we have
3991              * for plain users. No problem really: would have to be a script
3992              * that does not actually work for plain users; and if root is
3993              * foolish and can be persuaded to run such an unsafe script, he
3994              * might run also non-setuid ones, and deserves what he gets.
3995              * 
3996              * Or, we might drop the PL_euid check above (and rely just on
3997              * fdscript to avoid loops), and do the execs
3998              * even for root.
3999              */
4000 #  ifndef IAMSUID
4001             int which;
4002             /* PSz 11 Nov 03
4003              * Pass fd script to suidperl.
4004              * Exec suidperl, substituting fd script for scriptname.
4005              * Pass script name as "subdir" of fd, which perl will grok;
4006              * in fact will use that to distinguish this from "normal"
4007              * usage, see comments above.
4008              */
4009             PerlIO_rewind(rsfp);
4010             PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0);  /* just in case rewind didn't */
4011             /* PSz 27 Feb 04  Sanity checks on scriptname */
4012             if ((!scriptname) || (!*scriptname) ) {
4013                 Perl_croak(aTHX_ "No setuid script name\n");
4014             }
4015             if (*scriptname == '-') {
4016                 Perl_croak(aTHX_ "Setuid script name may not begin with dash\n");
4017                 /* Or we might confuse it with an option when replacing
4018                  * name in argument list, below (though we do pointer, not
4019                  * string, comparisons).
4020                  */
4021             }
4022             for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
4023             if (!PL_origargv[which]) {
4024                 Perl_croak(aTHX_ "Can't change argv to have fd script\n");
4025             }
4026             PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
4027                                           PerlIO_fileno(rsfp), PL_origargv[which]));
4028 #    if defined(HAS_FCNTL) && defined(F_SETFD)
4029             fcntl(PerlIO_fileno(rsfp),F_SETFD,0);       /* ensure no close-on-exec */
4030 #    endif
4031             PERL_FPU_PRE_EXEC
4032             PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
4033                                      (int)PERL_REVISION, (int)PERL_VERSION,
4034                                      (int)PERL_SUBVERSION), PL_origargv);
4035             PERL_FPU_POST_EXEC
4036 #  endif /* IAMSUID */
4037             Perl_croak(aTHX_ "Can't do setuid (cannot exec sperl)\n");
4038         }
4039
4040         if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
4041 /* PSz 26 Feb 04
4042  * This seems back to front: we try HAS_SETEGID first; if not available
4043  * then try HAS_SETREGID; as a last chance we try HAS_SETRESGID. May be OK
4044  * in the sense that we only want to set EGID; but are there any machines
4045  * with either of the latter, but not the former? Same with UID, later.
4046  */
4047 #  ifdef HAS_SETEGID
4048             (void)setegid(PL_statbuf.st_gid);
4049 #  else
4050 #    ifdef HAS_SETREGID
4051            (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
4052 #    else
4053 #      ifdef HAS_SETRESGID
4054            (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
4055 #      else
4056             PerlProc_setgid(PL_statbuf.st_gid);
4057 #      endif
4058 #    endif
4059 #  endif
4060             if (PerlProc_getegid() != PL_statbuf.st_gid)
4061                 Perl_croak(aTHX_ "Can't do setegid!\n");
4062         }
4063         if (PL_statbuf.st_mode & S_ISUID) {
4064             if (PL_statbuf.st_uid != PL_euid)
4065 #  ifdef HAS_SETEUID
4066                 (void)seteuid(PL_statbuf.st_uid);       /* all that for this */
4067 #  else
4068 #    ifdef HAS_SETREUID
4069                 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
4070 #    else
4071 #      ifdef HAS_SETRESUID
4072                 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
4073 #      else
4074                 PerlProc_setuid(PL_statbuf.st_uid);
4075 #      endif
4076 #    endif
4077 #  endif
4078             if (PerlProc_geteuid() != PL_statbuf.st_uid)
4079                 Perl_croak(aTHX_ "Can't do seteuid!\n");
4080         }
4081         else if (PL_uid) {                      /* oops, mustn't run as root */
4082 #  ifdef HAS_SETEUID
4083           (void)seteuid((Uid_t)PL_uid);
4084 #  else
4085 #    ifdef HAS_SETREUID
4086           (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
4087 #    else
4088 #      ifdef HAS_SETRESUID
4089           (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
4090 #      else
4091           PerlProc_setuid((Uid_t)PL_uid);
4092 #      endif
4093 #    endif
4094 #  endif
4095             if (PerlProc_geteuid() != PL_uid)
4096                 Perl_croak(aTHX_ "Can't do seteuid!\n");
4097         }
4098         init_ids();
4099         if (!cando(S_IXUSR,TRUE,&PL_statbuf))
4100             Perl_croak(aTHX_ "Effective UID cannot exec script\n");     /* they can't do this */
4101     }
4102 #  ifdef IAMSUID
4103     else if (fdscript < 0 || suidscript != 1)
4104         /* PSz 13 Nov 03  Caught elsewhere, useless(?!) here */
4105         Perl_croak(aTHX_ "(suid) fdscript needed in suidperl\n");
4106     else {
4107 /* PSz 16 Sep 03  Keep neat error message */
4108         Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
4109     }
4110
4111     /* We absolutely must clear out any saved ids here, so we */
4112     /* exec the real perl, substituting fd script for scriptname. */
4113     /* (We pass script name as "subdir" of fd, which perl will grok.) */
4114     /* 
4115      * It might be thought that using setresgid and/or setresuid (changed to
4116      * set the saved IDs) above might obviate the need to exec, and we could
4117      * go on to "do the perl thing".
4118      * 
4119      * Is there such a thing as "saved GID", and is that set for setuid (but
4120      * not setgid) execution like suidperl? Without exec, it would not be
4121      * cleared for setuid (but not setgid) scripts (or might need a dummy
4122      * setresgid).
4123      * 
4124      * We need suidperl to do the exact same argument checking that perl
4125      * does. Thus it cannot be very small; while it could be significantly
4126      * smaller, it is safer (simpler?) to make it essentially the same
4127      * binary as perl (but they are not identical). - Maybe could defer that
4128      * check to the invoked perl, and suidperl be a tiny wrapper instead;
4129      * but prefer to do thorough checks in suidperl itself. Such deferral
4130      * would make suidperl security rely on perl, a design no-no.
4131      * 
4132      * Setuid things should be short and simple, thus easy to understand and
4133      * verify. They should do their "own thing", without influence by
4134      * attackers. It may help if their internal execution flow is fixed,
4135      * regardless of platform: it may be best to exec anyway.
4136      * 
4137      * Suidperl should at least be conceptually simple: a wrapper only,
4138      * never to do any real perl. Maybe we should put
4139      * #ifdef IAMSUID
4140      *         Perl_croak(aTHX_ "Suidperl should never do real perl\n");
4141      * #endif
4142      * into the perly bits.
4143      */
4144     PerlIO_rewind(rsfp);
4145     PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0);  /* just in case rewind didn't */
4146     /* PSz 11 Nov 03
4147      * Keep original arguments: suidperl already has fd script.
4148      */
4149 #  if defined(HAS_FCNTL) && defined(F_SETFD)
4150     fcntl(PerlIO_fileno(rsfp),F_SETFD,0);       /* ensure no close-on-exec */
4151 #  endif
4152     PERL_FPU_PRE_EXEC
4153     PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
4154                              (int)PERL_REVISION, (int)PERL_VERSION,
4155                              (int)PERL_SUBVERSION), PL_origargv);/* try again */
4156     PERL_FPU_POST_EXEC
4157     Perl_croak(aTHX_ "Can't do setuid (suidperl cannot exec perl)\n");
4158 #  endif /* IAMSUID */
4159 #else /* !DOSUID */
4160     if (PL_euid != PL_uid || PL_egid != PL_gid) {       /* (suidperl doesn't exist, in fact) */
4161 #  ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
4162         PerlLIO_fstat(PerlIO_fileno(rsfp),&PL_statbuf); /* may be either wrapped or real suid */
4163         if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
4164             ||
4165             (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
4166            )
4167             if (!PL_do_undump)
4168                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
4169 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
4170 #  endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
4171         /* not set-id, must be wrapped */
4172     }
4173 #endif /* DOSUID */
4174 }
4175
4176 STATIC void
4177 S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp)
4178 {
4179     dVAR;
4180     const char *s;
4181     register const char *s2;
4182 #ifdef MACOS_TRADITIONAL
4183     int maclines = 0;
4184 #endif
4185
4186     /* skip forward in input to the real script? */
4187
4188 #ifdef MACOS_TRADITIONAL
4189     /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */
4190
4191     while (PL_doextract || gMacPerl_AlwaysExtract) {
4192         if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL) {
4193             if (!gMacPerl_AlwaysExtract)
4194                 Perl_croak(aTHX_ "No Perl script found in input\n");
4195
4196             if (PL_doextract)                   /* require explicit override ? */
4197                 if (!OverrideExtract(PL_origfilename))
4198                     Perl_croak(aTHX_ "User aborted script\n");
4199                 else
4200                     PL_doextract = FALSE;
4201
4202             /* Pater peccavi, file does not have #! */
4203             PerlIO_rewind(rsfp);
4204
4205             break;
4206         }
4207 #else
4208     while (PL_doextract) {
4209         if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL)
4210             Perl_croak(aTHX_ "No Perl script found in input\n");
4211 #endif
4212         s2 = s;
4213         if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) {
4214             PerlIO_ungetc(rsfp, '\n');          /* to keep line count right */
4215             PL_doextract = FALSE;
4216             while (*s && !(isSPACE (*s) || *s == '#')) s++;
4217             s2 = s;
4218             while (*s == ' ' || *s == '\t') s++;
4219             if (*s++ == '-') {
4220                 while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.'
4221                        || s2[-1] == '_') s2--;
4222                 if (strnEQ(s2-4,"perl",4))
4223                     while ((s = moreswitches(s)))
4224                         ;
4225             }
4226 #ifdef MACOS_TRADITIONAL
4227             /* We are always searching for the #!perl line in MacPerl,
4228              * so if we find it, still keep the line count correct
4229              * by counting lines we already skipped over
4230              */
4231             for (; maclines > 0 ; maclines--)
4232                 PerlIO_ungetc(rsfp, '\n');
4233
4234             break;
4235
4236         /* gMacPerl_AlwaysExtract is false in MPW tool */
4237         } else if (gMacPerl_AlwaysExtract) {
4238             ++maclines;
4239 #endif
4240         }
4241     }
4242 }
4243
4244
4245 STATIC void
4246 S_init_ids(pTHX)
4247 {
4248     dVAR;
4249     PL_uid = PerlProc_getuid();
4250     PL_euid = PerlProc_geteuid();
4251     PL_gid = PerlProc_getgid();
4252     PL_egid = PerlProc_getegid();
4253 #ifdef VMS
4254     PL_uid |= PL_gid << 16;
4255     PL_euid |= PL_egid << 16;
4256 #endif
4257     /* Should not happen: */
4258     CHECK_MALLOC_TAINT(PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
4259     PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
4260     /* BUG */
4261     /* PSz 27 Feb 04
4262      * Should go by suidscript, not uid!=euid: why disallow
4263      * system("ls") in scripts run from setuid things?
4264      * Or, is this run before we check arguments and set suidscript?
4265      * What about SETUID_SCRIPTS_ARE_SECURE_NOW: could we use fdscript then?
4266      * (We never have suidscript, can we be sure to have fdscript?)
4267      * Or must then go by UID checks? See comments in forbid_setid also.
4268      */
4269 }
4270
4271 /* This is used very early in the lifetime of the program,
4272  * before even the options are parsed, so PL_tainting has
4273  * not been initialized properly.  */
4274 bool
4275 Perl_doing_taint(int argc, char *argv[], char *envp[])
4276 {
4277 #ifndef PERL_IMPLICIT_SYS
4278     /* If we have PERL_IMPLICIT_SYS we can't call getuid() et alia
4279      * before we have an interpreter-- and the whole point of this
4280      * function is to be called at such an early stage.  If you are on
4281      * a system with PERL_IMPLICIT_SYS but you do have a concept of
4282      * "tainted because running with altered effective ids', you'll
4283      * have to add your own checks somewhere in here.  The two most
4284      * known samples of 'implicitness' are Win32 and NetWare, neither
4285      * of which has much of concept of 'uids'. */
4286     int uid  = PerlProc_getuid();
4287     int euid = PerlProc_geteuid();
4288     int gid  = PerlProc_getgid();
4289     int egid = PerlProc_getegid();
4290     (void)envp;
4291
4292 #ifdef VMS
4293     uid  |=  gid << 16;
4294     euid |= egid << 16;
4295 #endif
4296     if (uid && (euid != uid || egid != gid))
4297         return 1;
4298 #endif /* !PERL_IMPLICIT_SYS */
4299     /* This is a really primitive check; environment gets ignored only
4300      * if -T are the first chars together; otherwise one gets
4301      *  "Too late" message. */
4302     if ( argc > 1 && argv[1][0] == '-'
4303          && (argv[1][1] == 't' || argv[1][1] == 'T') )
4304         return 1;
4305     return 0;
4306 }
4307
4308 /* Passing the flag as a single char rather than a string is a slight space
4309    optimisation.  The only message that isn't /^-.$/ is
4310    "program input from stdin", which is substituted in place of '\0', which
4311    could never be a command line flag.  */
4312 STATIC void
4313 S_forbid_setid(pTHX_ const char flag, const int suidscript)
4314 {
4315     dVAR;
4316     char string[3] = "-x";
4317     const char *message = "program input from stdin";
4318
4319     if (flag) {
4320         string[1] = flag;
4321         message = string;
4322     }
4323
4324 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
4325     if (PL_euid != PL_uid)
4326         Perl_croak(aTHX_ "No %s allowed while running setuid", message);
4327     if (PL_egid != PL_gid)
4328         Perl_croak(aTHX_ "No %s allowed while running setgid", message);
4329 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
4330     /* PSz 29 Feb 04
4331      * Checks for UID/GID above "wrong": why disallow
4332      *   perl -e 'print "Hello\n"'
4333      * from within setuid things?? Simply drop them: replaced by
4334      * fdscript/suidscript and #ifdef IAMSUID checks below.
4335      * 
4336      * This may be too late for command-line switches. Will catch those on
4337      * the #! line, after finding the script name and setting up
4338      * fdscript/suidscript. Note that suidperl does not get around to
4339      * parsing (and checking) the switches on the #! line, but checks that
4340      * the two sets are identical.
4341      * 
4342      * With SETUID_SCRIPTS_ARE_SECURE_NOW, could we use fdscript, also or
4343      * instead, or would that be "too late"? (We never have suidscript, can
4344      * we be sure to have fdscript?)
4345      * 
4346      * Catch things with suidscript (in descendant of suidperl), even with
4347      * right UID/GID. Was already checked in suidperl, with #ifdef IAMSUID,
4348      * below; but I am paranoid.
4349      * 
4350      * Also see comments about root running a setuid script, elsewhere.
4351      */
4352     if (suidscript >= 0)
4353         Perl_croak(aTHX_ "No %s allowed with (suid) fdscript", message);
4354 #ifdef IAMSUID
4355     /* PSz 11 Nov 03  Catch it in suidperl, always! */
4356     Perl_croak(aTHX_ "No %s allowed in suidperl", message);
4357 #endif /* IAMSUID */
4358 }
4359
4360 void
4361 Perl_init_debugger(pTHX)
4362 {
4363     dVAR;
4364     HV * const ostash = PL_curstash;
4365
4366     PL_curstash = PL_debstash;
4367     PL_dbargs = GvAV(gv_AVadd((gv_fetchpvs("DB::args", GV_ADDMULTI,
4368                                            SVt_PVAV))));
4369     AvREAL_off(PL_dbargs);
4370     PL_DBgv = gv_fetchpvs("DB::DB", GV_ADDMULTI, SVt_PVGV);
4371     PL_DBline = gv_fetchpvs("DB::dbline", GV_ADDMULTI, SVt_PVAV);
4372     PL_DBsub = gv_HVadd(gv_fetchpvs("DB::sub", GV_ADDMULTI, SVt_PVHV));
4373     PL_DBsingle = GvSV((gv_fetchpvs("DB::single", GV_ADDMULTI, SVt_PV)));
4374     sv_setiv(PL_DBsingle, 0);
4375     PL_DBtrace = GvSV((gv_fetchpvs("DB::trace", GV_ADDMULTI, SVt_PV)));
4376     sv_setiv(PL_DBtrace, 0);
4377     PL_DBsignal = GvSV((gv_fetchpvs("DB::signal", GV_ADDMULTI, SVt_PV)));
4378     sv_setiv(PL_DBsignal, 0);
4379     PL_curstash = ostash;
4380 }
4381
4382 #ifndef STRESS_REALLOC
4383 #define REASONABLE(size) (size)
4384 #else
4385 #define REASONABLE(size) (1) /* unreasonable */
4386 #endif
4387
4388 void
4389 Perl_init_stacks(pTHX)
4390 {
4391     dVAR;
4392     /* start with 128-item stack and 8K cxstack */
4393     PL_curstackinfo = new_stackinfo(REASONABLE(128),
4394                                  REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
4395     PL_curstackinfo->si_type = PERLSI_MAIN;
4396     PL_curstack = PL_curstackinfo->si_stack;
4397     PL_mainstack = PL_curstack;         /* remember in case we switch stacks */
4398
4399     PL_stack_base = AvARRAY(PL_curstack);
4400     PL_stack_sp = PL_stack_base;
4401     PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
4402
4403     Newx(PL_tmps_stack,REASONABLE(128),SV*);
4404     PL_tmps_floor = -1;
4405     PL_tmps_ix = -1;
4406     PL_tmps_max = REASONABLE(128);
4407
4408     Newx(PL_markstack,REASONABLE(32),I32);
4409     PL_markstack_ptr = PL_markstack;
4410     PL_markstack_max = PL_markstack + REASONABLE(32);
4411
4412     SET_MARK_OFFSET;
4413
4414     Newx(PL_scopestack,REASONABLE(32),I32);
4415     PL_scopestack_ix = 0;
4416     PL_scopestack_max = REASONABLE(32);
4417
4418     Newx(PL_savestack,REASONABLE(128),ANY);
4419     PL_savestack_ix = 0;
4420     PL_savestack_max = REASONABLE(128);
4421 }
4422
4423 #undef REASONABLE
4424
4425 STATIC void
4426 S_nuke_stacks(pTHX)
4427 {
4428     dVAR;
4429     while (PL_curstackinfo->si_next)
4430         PL_curstackinfo = PL_curstackinfo->si_next;
4431     while (PL_curstackinfo) {
4432         PERL_SI *p = PL_curstackinfo->si_prev;
4433         /* curstackinfo->si_stack got nuked by sv_free_arenas() */
4434         Safefree(PL_curstackinfo->si_cxstack);
4435         Safefree(PL_curstackinfo);
4436         PL_curstackinfo = p;
4437     }
4438     Safefree(PL_tmps_stack);
4439     Safefree(PL_markstack);
4440     Safefree(PL_scopestack);
4441     Safefree(PL_savestack);
4442 }
4443
4444
4445 STATIC void
4446 S_init_predump_symbols(pTHX)
4447 {
4448     dVAR;
4449     GV *tmpgv;
4450     IO *io;
4451
4452     sv_setpvn(get_sv("\"", TRUE), " ", 1);
4453     PL_stdingv = gv_fetchpvs("STDIN", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4454     GvMULTI_on(PL_stdingv);
4455     io = GvIOp(PL_stdingv);
4456     IoTYPE(io) = IoTYPE_RDONLY;
4457     IoIFP(io) = PerlIO_stdin();
4458     tmpgv = gv_fetchpvs("stdin", GV_ADD|GV_NOTQUAL, SVt_PV);
4459     GvMULTI_on(tmpgv);
4460     GvIOp(tmpgv) = (IO*)SvREFCNT_inc_simple(io);
4461
4462     tmpgv = gv_fetchpvs("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4463     GvMULTI_on(tmpgv);
4464     io = GvIOp(tmpgv);
4465     IoTYPE(io) = IoTYPE_WRONLY;
4466     IoOFP(io) = IoIFP(io) = PerlIO_stdout();
4467     setdefout(tmpgv);
4468     tmpgv = gv_fetchpvs("stdout", GV_ADD|GV_NOTQUAL, SVt_PV);
4469     GvMULTI_on(tmpgv);
4470     GvIOp(tmpgv) = (IO*)SvREFCNT_inc_simple(io);
4471
4472     PL_stderrgv = gv_fetchpvs("STDERR", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4473     GvMULTI_on(PL_stderrgv);
4474     io = GvIOp(PL_stderrgv);
4475     IoTYPE(io) = IoTYPE_WRONLY;
4476     IoOFP(io) = IoIFP(io) = PerlIO_stderr();
4477     tmpgv = gv_fetchpvs("stderr", GV_ADD|GV_NOTQUAL, SVt_PV);
4478     GvMULTI_on(tmpgv);
4479     GvIOp(tmpgv) = (IO*)SvREFCNT_inc_simple(io);
4480
4481     PL_statname = newSV(0);             /* last filename we did stat on */
4482
4483     Safefree(PL_osname);
4484     PL_osname = savepv(OSNAME);
4485 }
4486
4487 void
4488 Perl_init_argv_symbols(pTHX_ register int argc, register char **argv)
4489 {
4490     dVAR;
4491     argc--,argv++;      /* skip name of script */
4492     if (PL_doswitches) {
4493         for (; argc > 0 && **argv == '-'; argc--,argv++) {
4494             char *s;
4495             if (!argv[0][1])
4496                 break;
4497             if (argv[0][1] == '-' && !argv[0][2]) {
4498                 argc--,argv++;
4499                 break;
4500             }
4501             if ((s = strchr(argv[0], '='))) {
4502                 const char *const start_name = argv[0] + 1;
4503                 sv_setpv(GvSV(gv_fetchpvn_flags(start_name, s - start_name,
4504                                                 TRUE, SVt_PV)), s + 1);
4505             }
4506             else
4507                 sv_setiv(GvSV(gv_fetchpv(argv[0]+1, GV_ADD, SVt_PV)),1);
4508         }
4509     }
4510     if ((PL_argvgv = gv_fetchpvs("ARGV", GV_ADD|GV_NOTQUAL, SVt_PVAV))) {
4511         GvMULTI_on(PL_argvgv);
4512         (void)gv_AVadd(PL_argvgv);
4513         av_clear(GvAVn(PL_argvgv));
4514         for (; argc > 0; argc--,argv++) {
4515             SV * const sv = newSVpv(argv[0],0);
4516             av_push(GvAVn(PL_argvgv),sv);
4517             if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
4518                  if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
4519                       SvUTF8_on(sv);
4520             }
4521             if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
4522                  (void)sv_utf8_decode(sv);
4523         }
4524     }
4525 }
4526
4527 STATIC void
4528 S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
4529 {
4530     dVAR;
4531     GV* tmpgv;
4532
4533     PL_toptarget = newSV_type(SVt_PVFM);
4534     sv_setpvn(PL_toptarget, "", 0);
4535     PL_bodytarget = newSV_type(SVt_PVFM);
4536     sv_setpvn(PL_bodytarget, "", 0);
4537     PL_formtarget = PL_bodytarget;
4538
4539     TAINT;
4540
4541     init_argv_symbols(argc,argv);
4542
4543     if ((tmpgv = gv_fetchpvs("0", GV_ADD|GV_NOTQUAL, SVt_PV))) {
4544 #ifdef MACOS_TRADITIONAL
4545         /* $0 is not majick on a Mac */
4546         sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
4547 #else
4548         sv_setpv(GvSV(tmpgv),PL_origfilename);
4549         magicname("0", "0", 1);
4550 #endif
4551     }
4552     if ((PL_envgv = gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV))) {
4553         HV *hv;
4554         bool env_is_not_environ;
4555         GvMULTI_on(PL_envgv);
4556         hv = GvHVn(PL_envgv);
4557         hv_magic(hv, NULL, PERL_MAGIC_env);
4558 #ifndef PERL_MICRO
4559 #ifdef USE_ENVIRON_ARRAY
4560         /* Note that if the supplied env parameter is actually a copy
4561            of the global environ then it may now point to free'd memory
4562            if the environment has been modified since. To avoid this
4563            problem we treat env==NULL as meaning 'use the default'
4564         */
4565         if (!env)
4566             env = environ;
4567         env_is_not_environ = env != environ;
4568         if (env_is_not_environ
4569 #  ifdef USE_ITHREADS
4570             && PL_curinterp == aTHX
4571 #  endif
4572            )
4573         {
4574             environ[0] = NULL;
4575         }
4576         if (env) {
4577           char *s;
4578           SV *sv;
4579           for (; *env; env++) {
4580             if (!(s = strchr(*env,'=')) || s == *env)
4581                 continue;
4582 #if defined(MSDOS) && !defined(DJGPP)
4583             *s = '\0';
4584             (void)strupr(*env);
4585             *s = '=';
4586 #endif
4587             sv = newSVpv(s+1, 0);
4588             (void)hv_store(hv, *env, s - *env, sv, 0);
4589             if (env_is_not_environ)
4590                 mg_set(sv);
4591           }
4592       }
4593 #endif /* USE_ENVIRON_ARRAY */
4594 #endif /* !PERL_MICRO */
4595     }
4596     TAINT_NOT;
4597     if ((tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV))) {
4598         SvREADONLY_off(GvSV(tmpgv));
4599         sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
4600         SvREADONLY_on(GvSV(tmpgv));
4601     }
4602 #ifdef THREADS_HAVE_PIDS
4603     PL_ppid = (IV)getppid();
4604 #endif
4605
4606     /* touch @F array to prevent spurious warnings 20020415 MJD */
4607     if (PL_minus_a) {
4608       (void) get_av("main::F", TRUE | GV_ADDMULTI);
4609     }
4610 }
4611
4612 STATIC void
4613 S_init_perllib(pTHX)
4614 {
4615     dVAR;
4616     char *s;
4617     if (!PL_tainting) {
4618 #ifndef VMS
4619         s = PerlEnv_getenv("PERL5LIB");
4620 /*
4621  * It isn't possible to delete an environment variable with
4622  * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
4623  * case we treat PERL5LIB as undefined if it has a zero-length value.
4624  */
4625 #if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
4626         if (s && *s != '\0')
4627 #else
4628         if (s)
4629 #endif
4630             incpush(s, TRUE, TRUE, TRUE, FALSE);
4631         else
4632             incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE, TRUE, FALSE);
4633 #else /* VMS */
4634         /* Treat PERL5?LIB as a possible search list logical name -- the
4635          * "natural" VMS idiom for a Unix path string.  We allow each
4636          * element to be a set of |-separated directories for compatibility.
4637          */
4638         char buf[256];
4639         int idx = 0;
4640         if (my_trnlnm("PERL5LIB",buf,0))
4641             do { incpush(buf,TRUE,TRUE,TRUE,FALSE); } while (my_trnlnm("PERL5LIB",buf,++idx));
4642         else
4643             while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE,TRUE,FALSE);
4644 #endif /* VMS */
4645     }
4646
4647 /* Use the ~-expanded versions of APPLLIB (undocumented),
4648     ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
4649 */
4650 #ifdef APPLLIB_EXP
4651     incpush(APPLLIB_EXP, TRUE, TRUE, TRUE, TRUE);
4652 #endif
4653
4654 #ifdef ARCHLIB_EXP
4655     incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4656 #endif
4657 #ifdef MACOS_TRADITIONAL
4658     {
4659         Stat_t tmpstatbuf;
4660         SV * privdir = newSV(0);
4661         char * macperl = PerlEnv_getenv("MACPERL");
4662         
4663         if (!macperl)
4664             macperl = "";
4665         
4666         Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
4667         if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
4668             incpush(SvPVX(privdir), TRUE, FALSE, TRUE, FALSE);
4669         Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
4670         if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
4671             incpush(SvPVX(privdir), TRUE, FALSE, TRUE, FALSE);
4672         
4673         SvREFCNT_dec(privdir);
4674     }
4675     if (!PL_tainting)
4676         incpush(":", FALSE, FALSE, TRUE, FALSE);
4677 #else
4678 #ifndef PRIVLIB_EXP
4679 #  define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
4680 #endif
4681 #if defined(WIN32)
4682     incpush(PRIVLIB_EXP, TRUE, FALSE, TRUE, TRUE);
4683 #else
4684     incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4685 #endif
4686
4687 #ifdef SITEARCH_EXP
4688     /* sitearch is always relative to sitelib on Windows for
4689      * DLL-based path intuition to work correctly */
4690 #  if !defined(WIN32)
4691     incpush(SITEARCH_EXP, FALSE, FALSE, TRUE, TRUE);
4692 #  endif
4693 #endif
4694
4695 #ifdef SITELIB_EXP
4696 #  if defined(WIN32)
4697     /* this picks up sitearch as well */
4698     incpush(SITELIB_EXP, TRUE, FALSE, TRUE, TRUE);
4699 #  else
4700     incpush(SITELIB_EXP, FALSE, FALSE, TRUE, TRUE);
4701 #  endif
4702 #endif
4703
4704 #if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST)
4705     /* Search for version-specific dirs below here */
4706     incpush(SITELIB_STEM, FALSE, TRUE, TRUE, TRUE);
4707 #endif
4708
4709 #ifdef PERL_VENDORARCH_EXP
4710     /* vendorarch is always relative to vendorlib on Windows for
4711      * DLL-based path intuition to work correctly */
4712 #  if !defined(WIN32)
4713     incpush(PERL_VENDORARCH_EXP, FALSE, FALSE, TRUE, TRUE);
4714 #  endif
4715 #endif
4716
4717 #ifdef PERL_VENDORLIB_EXP
4718 #  if defined(WIN32)
4719     incpush(PERL_VENDORLIB_EXP, TRUE, FALSE, TRUE, TRUE);       /* this picks up vendorarch as well */
4720 #  else
4721     incpush(PERL_VENDORLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4722 #  endif
4723 #endif
4724
4725 #ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
4726     incpush(PERL_VENDORLIB_STEM, FALSE, TRUE, TRUE, TRUE);
4727 #endif
4728
4729 #ifdef PERL_OTHERLIBDIRS
4730     incpush(PERL_OTHERLIBDIRS, TRUE, TRUE, TRUE, TRUE);
4731 #endif
4732
4733     if (!PL_tainting)
4734         incpush(".", FALSE, FALSE, TRUE, FALSE);
4735 #endif /* MACOS_TRADITIONAL */
4736 }
4737
4738 #if defined(DOSISH) || defined(EPOC) || defined(__SYMBIAN32__)
4739 #    define PERLLIB_SEP ';'
4740 #else
4741 #  if defined(VMS)
4742 #    define PERLLIB_SEP '|'
4743 #  else
4744 #    if defined(MACOS_TRADITIONAL)
4745 #      define PERLLIB_SEP ','
4746 #    else
4747 #      define PERLLIB_SEP ':'
4748 #    endif
4749 #  endif
4750 #endif
4751 #ifndef PERLLIB_MANGLE
4752 #  define PERLLIB_MANGLE(s,n) (s)
4753 #endif
4754
4755 /* Push a directory onto @INC if it exists.
4756    Generate a new SV if we do this, to save needing to copy the SV we push
4757    onto @INC  */
4758 STATIC SV *
4759 S_incpush_if_exists(pTHX_ SV *dir)
4760 {
4761     dVAR;
4762     Stat_t tmpstatbuf;
4763     if (PerlLIO_stat(SvPVX_const(dir), &tmpstatbuf) >= 0 &&
4764         S_ISDIR(tmpstatbuf.st_mode)) {
4765         av_push(GvAVn(PL_incgv), dir);
4766         dir = newSV(0);
4767     }
4768     return dir;
4769 }
4770
4771 STATIC void
4772 S_incpush(pTHX_ const char *dir, bool addsubdirs, bool addoldvers, bool usesep,
4773           bool canrelocate)
4774 {
4775     dVAR;
4776     SV *subdir = NULL;
4777     const char *p = dir;
4778
4779     if (!p || !*p)
4780         return;
4781
4782     if (addsubdirs || addoldvers) {
4783         subdir = newSV(0);
4784     }
4785
4786     /* Break at all separators */
4787     while (p && *p) {
4788         SV *libdir = newSV(0);
4789         const char *s;
4790
4791         /* skip any consecutive separators */
4792         if (usesep) {
4793             while ( *p == PERLLIB_SEP ) {
4794                 /* Uncomment the next line for PATH semantics */
4795                 /* av_push(GvAVn(PL_incgv), newSVpvs(".")); */
4796                 p++;
4797             }
4798         }
4799
4800         if ( usesep && (s = strchr(p, PERLLIB_SEP)) != NULL ) {
4801             sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
4802                       (STRLEN)(s - p));
4803             p = s + 1;
4804         }
4805         else {
4806             sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
4807             p = NULL;   /* break out */
4808         }
4809 #ifdef MACOS_TRADITIONAL
4810         if (!strchr(SvPVX(libdir), ':')) {
4811             char buf[256];
4812
4813             sv_setpv(libdir, MacPerl_CanonDir(SvPVX(libdir), buf, 0));
4814         }
4815         if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
4816             sv_catpvs(libdir, ":");
4817 #endif
4818
4819         /* Do the if() outside the #ifdef to avoid warnings about an unused
4820            parameter.  */
4821         if (canrelocate) {
4822 #ifdef PERL_RELOCATABLE_INC
4823         /*
4824          * Relocatable include entries are marked with a leading .../
4825          *
4826          * The algorithm is
4827          * 0: Remove that leading ".../"
4828          * 1: Remove trailing executable name (anything after the last '/')
4829          *    from the perl path to give a perl prefix
4830          * Then
4831          * While the @INC element starts "../" and the prefix ends with a real
4832          * directory (ie not . or ..) chop that real directory off the prefix
4833          * and the leading "../" from the @INC element. ie a logical "../"
4834          * cleanup
4835          * Finally concatenate the prefix and the remainder of the @INC element
4836          * The intent is that /usr/local/bin/perl and .../../lib/perl5
4837          * generates /usr/local/lib/perl5
4838          */
4839             const char *libpath = SvPVX(libdir);
4840             STRLEN libpath_len = SvCUR(libdir);
4841             if (libpath_len >= 4 && memEQ (libpath, ".../", 4)) {
4842                 /* Game on!  */
4843                 SV * const caret_X = get_sv("\030", 0);
4844                 /* Going to use the SV just as a scratch buffer holding a C
4845                    string:  */
4846                 SV *prefix_sv;
4847                 char *prefix;
4848                 char *lastslash;
4849
4850                 /* $^X is *the* source of taint if tainting is on, hence
4851                    SvPOK() won't be true.  */
4852                 assert(caret_X);
4853                 assert(SvPOKp(caret_X));
4854                 prefix_sv = newSVpvn_flags(SvPVX(caret_X), SvCUR(caret_X),
4855                                            SvUTF8(caret_X));
4856                 /* Firstly take off the leading .../
4857                    If all else fail we'll do the paths relative to the current
4858                    directory.  */
4859                 sv_chop(libdir, libpath + 4);
4860                 /* Don't use SvPV as we're intentionally bypassing taining,
4861                    mortal copies that the mg_get of tainting creates, and
4862                    corruption that seems to come via the save stack.
4863                    I guess that the save stack isn't correctly set up yet.  */
4864                 libpath = SvPVX(libdir);
4865                 libpath_len = SvCUR(libdir);
4866
4867                 /* This would work more efficiently with memrchr, but as it's
4868                    only a GNU extension we'd need to probe for it and
4869                    implement our own. Not hard, but maybe not worth it?  */
4870
4871                 prefix = SvPVX(prefix_sv);
4872                 lastslash = strrchr(prefix, '/');
4873
4874                 /* First time in with the *lastslash = '\0' we just wipe off
4875                    the trailing /perl from (say) /usr/foo/bin/perl
4876                 */
4877                 if (lastslash) {
4878                     SV *tempsv;
4879                     while ((*lastslash = '\0'), /* Do that, come what may.  */
4880                            (libpath_len >= 3 && memEQ(libpath, "../", 3)
4881                             && (lastslash = strrchr(prefix, '/')))) {
4882                         if (lastslash[1] == '\0'
4883                             || (lastslash[1] == '.'
4884                                 && (lastslash[2] == '/' /* ends "/."  */
4885                                     || (lastslash[2] == '/'
4886                                         && lastslash[3] == '/' /* or "/.."  */
4887                                         )))) {
4888                             /* Prefix ends "/" or "/." or "/..", any of which
4889                                are fishy, so don't do any more logical cleanup.
4890                             */
4891                             break;
4892                         }
4893                         /* Remove leading "../" from path  */
4894                         libpath += 3;
4895                         libpath_len -= 3;
4896                         /* Next iteration round the loop removes the last
4897                            directory name from prefix by writing a '\0' in
4898                            the while clause.  */
4899                     }
4900                     /* prefix has been terminated with a '\0' to the correct
4901                        length. libpath points somewhere into the libdir SV.
4902                        We need to join the 2 with '/' and drop the result into
4903                        libdir.  */
4904                     tempsv = Perl_newSVpvf(aTHX_ "%s/%s", prefix, libpath);
4905                     SvREFCNT_dec(libdir);
4906                     /* And this is the new libdir.  */
4907                     libdir = tempsv;
4908                     if (PL_tainting &&
4909                         (PL_uid != PL_euid || PL_gid != PL_egid)) {
4910                         /* Need to taint reloccated paths if running set ID  */
4911                         SvTAINTED_on(libdir);
4912                     }
4913                 }
4914                 SvREFCNT_dec(prefix_sv);
4915             }
4916 #endif
4917         }
4918         /*
4919          * BEFORE pushing libdir onto @INC we may first push version- and
4920          * archname-specific sub-directories.
4921          */
4922         if (addsubdirs || addoldvers) {
4923 #ifdef PERL_INC_VERSION_LIST
4924             /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
4925             const char * const incverlist[] = { PERL_INC_VERSION_LIST };
4926             const char * const *incver;
4927 #endif
4928 #ifdef VMS
4929             char *unix;
4930             STRLEN len;
4931
4932             if ((unix = tounixspec_ts(SvPV(libdir,len),NULL)) != NULL) {
4933                 len = strlen(unix);
4934                 while (unix[len-1] == '/') len--;  /* Cosmetic */
4935                 sv_usepvn(libdir,unix,len);
4936             }
4937             else
4938                 PerlIO_printf(Perl_error_log,
4939                               "Failed to unixify @INC element \"%s\"\n",
4940                               SvPV(libdir,len));
4941 #endif
4942             if (addsubdirs) {
4943 #ifdef MACOS_TRADITIONAL
4944 #define PERL_AV_SUFFIX_FMT      ""
4945 #define PERL_ARCH_FMT           "%s:"
4946 #define PERL_ARCH_FMT_PATH      PERL_FS_VER_FMT PERL_AV_SUFFIX_FMT
4947 #else
4948 #define PERL_AV_SUFFIX_FMT      "/"
4949 #define PERL_ARCH_FMT           "/%s"
4950 #define PERL_ARCH_FMT_PATH      PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT
4951 #endif
4952                 /* .../version/archname if -d .../version/archname */
4953                 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH PERL_ARCH_FMT,
4954                                SVfARG(libdir),
4955                                (int)PERL_REVISION, (int)PERL_VERSION,
4956                                (int)PERL_SUBVERSION, ARCHNAME);
4957                 subdir = S_incpush_if_exists(aTHX_ subdir);
4958
4959                 /* .../version if -d .../version */
4960                 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH,
4961                                SVfARG(libdir),
4962                                (int)PERL_REVISION, (int)PERL_VERSION,
4963                                (int)PERL_SUBVERSION);
4964                 subdir = S_incpush_if_exists(aTHX_ subdir);
4965
4966                 /* .../archname if -d .../archname */
4967                 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT,
4968                                SVfARG(libdir), ARCHNAME);
4969                 subdir = S_incpush_if_exists(aTHX_ subdir);
4970
4971             }
4972
4973 #ifdef PERL_INC_VERSION_LIST
4974             if (addoldvers) {
4975                 for (incver = incverlist; *incver; incver++) {
4976                     /* .../xxx if -d .../xxx */
4977                     Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT,
4978                                    SVfARG(libdir), *incver);
4979                     subdir = S_incpush_if_exists(aTHX_ subdir);
4980                 }
4981             }
4982 #endif
4983         }
4984
4985         /* finally push this lib directory on the end of @INC */
4986         av_push(GvAVn(PL_incgv), libdir);
4987     }
4988     if (subdir) {
4989         assert (SvREFCNT(subdir) == 1);
4990         SvREFCNT_dec(subdir);
4991     }
4992 }
4993
4994
4995 void
4996 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
4997 {
4998     dVAR;
4999     SV *atsv;
5000     volatile const line_t oldline = PL_curcop ? CopLINE(PL_curcop) : 0;
5001     CV *cv;
5002     STRLEN len;
5003     int ret;
5004     dJMPENV;
5005
5006     while (av_len(paramList) >= 0) {
5007         cv = (CV*)av_shift(paramList);
5008         if (PL_savebegin) {
5009             if (paramList == PL_beginav) {
5010                 /* save PL_beginav for compiler */
5011                 Perl_av_create_and_push(aTHX_ &PL_beginav_save, (SV*)cv);
5012             }
5013             else if (paramList == PL_checkav) {
5014                 /* save PL_checkav for compiler */
5015                 Perl_av_create_and_push(aTHX_ &PL_checkav_save, (SV*)cv);
5016             }
5017             else if (paramList == PL_unitcheckav) {
5018                 /* save PL_unitcheckav for compiler */
5019                 Perl_av_create_and_push(aTHX_ &PL_unitcheckav_save, (SV*)cv);
5020             }
5021         } else {
5022             if (!PL_madskills)
5023                 SAVEFREESV(cv);
5024         }
5025         JMPENV_PUSH(ret);
5026         switch (ret) {
5027         case 0:
5028 #ifdef PERL_MAD
5029             if (PL_madskills)
5030                 PL_madskills |= 16384;
5031 #endif
5032             CALL_LIST_BODY(cv);
5033 #ifdef PERL_MAD
5034             if (PL_madskills)
5035                 PL_madskills &= ~16384;
5036 #endif
5037             atsv = ERRSV;
5038             (void)SvPV_const(atsv, len);
5039             if (len) {
5040                 PL_curcop = &PL_compiling;
5041                 CopLINE_set(PL_curcop, oldline);
5042                 if (paramList == PL_beginav)
5043                     sv_catpvs(atsv, "BEGIN failed--compilation aborted");
5044                 else
5045                     Perl_sv_catpvf(aTHX_ atsv,
5046                                    "%s failed--call queue aborted",
5047                                    paramList == PL_checkav ? "CHECK"
5048                                    : paramList == PL_initav ? "INIT"
5049                                    : paramList == PL_unitcheckav ? "UNITCHECK"
5050                                    : "END");
5051                 while (PL_scopestack_ix > oldscope)
5052                     LEAVE;
5053                 JMPENV_POP;
5054                 Perl_croak(aTHX_ "%"SVf"", SVfARG(atsv));
5055             }
5056             break;
5057         case 1:
5058             STATUS_ALL_FAILURE;
5059             /* FALL THROUGH */
5060         case 2:
5061             /* my_exit() was called */
5062             while (PL_scopestack_ix > oldscope)
5063                 LEAVE;
5064             FREETMPS;
5065             PL_curstash = PL_defstash;
5066             PL_curcop = &PL_compiling;
5067             CopLINE_set(PL_curcop, oldline);
5068             JMPENV_POP;
5069             if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
5070                 if (paramList == PL_beginav)
5071                     Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
5072                 else
5073                     Perl_croak(aTHX_ "%s failed--call queue aborted",
5074                                paramList == PL_checkav ? "CHECK"
5075                                : paramList == PL_initav ? "INIT"
5076                                : paramList == PL_unitcheckav ? "UNITCHECK"
5077                                : "END");
5078             }
5079             my_exit_jump();
5080             /* NOTREACHED */
5081         case 3:
5082             if (PL_restartop) {
5083                 PL_curcop = &PL_compiling;
5084                 CopLINE_set(PL_curcop, oldline);
5085                 JMPENV_JUMP(3);
5086             }
5087             PerlIO_printf(Perl_error_log, "panic: restartop\n");
5088             FREETMPS;
5089             break;
5090         }
5091         JMPENV_POP;
5092     }
5093 }
5094
5095 void
5096 Perl_my_exit(pTHX_ U32 status)
5097 {
5098     dVAR;
5099     DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
5100                           (void*)thr, (unsigned long) status));
5101     switch (status) {
5102     case 0:
5103         STATUS_ALL_SUCCESS;
5104         break;
5105     case 1:
5106         STATUS_ALL_FAILURE;
5107         break;
5108     default:
5109         STATUS_EXIT_SET(status);
5110         break;
5111     }
5112     my_exit_jump();
5113 }
5114
5115 void
5116 Perl_my_failure_exit(pTHX)
5117 {
5118     dVAR;
5119 #ifdef VMS
5120      /* We have been called to fall on our sword.  The desired exit code
5121       * should be already set in STATUS_UNIX, but could be shifted over
5122       * by 8 bits.  STATUS_UNIX_EXIT_SET will handle the cases where a
5123       * that code is set.
5124       *
5125       * If an error code has not been set, then force the issue.
5126       */
5127     if (MY_POSIX_EXIT) {
5128
5129         /* In POSIX_EXIT mode follow Perl documentations and use 255 for
5130          * the exit code when there isn't an error.
5131          */
5132
5133         if (STATUS_UNIX == 0)
5134             STATUS_UNIX_EXIT_SET(255);
5135         else {
5136             STATUS_UNIX_EXIT_SET(STATUS_UNIX);
5137
5138             /* The exit code could have been set by $? or vmsish which
5139              * means that it may not be fatal.  So convert
5140              * success/warning codes to fatal.
5141              */
5142             if ((STATUS_NATIVE & (STS$K_SEVERE|STS$K_ERROR)) == 0)
5143                 STATUS_UNIX_EXIT_SET(255);
5144         }
5145     }
5146     else {
5147         /* Traditionally Perl on VMS always expects a Fatal Error. */
5148         if (vaxc$errno & 1) {
5149
5150             /* So force success status to failure */
5151             if (STATUS_NATIVE & 1)
5152                 STATUS_ALL_FAILURE;
5153         }
5154         else {
5155             if (!vaxc$errno) {
5156                 STATUS_UNIX = EINTR; /* In case something cares */
5157                 STATUS_ALL_FAILURE;
5158             }
5159             else {
5160                 int severity;
5161                 STATUS_NATIVE = vaxc$errno; /* Should already be this */
5162
5163                 /* Encode the severity code */
5164                 severity = STATUS_NATIVE & STS$M_SEVERITY;
5165                 STATUS_UNIX = (severity ? severity : 1) << 8;
5166
5167                 /* Perl expects this to be a fatal error */
5168                 if (severity != STS$K_SEVERE)
5169                     STATUS_ALL_FAILURE;
5170             }
5171         }
5172     }
5173
5174 #else
5175     int exitstatus;
5176     if (errno & 255)
5177         STATUS_UNIX_SET(errno);
5178     else {
5179         exitstatus = STATUS_UNIX >> 8;
5180         if (exitstatus & 255)
5181             STATUS_UNIX_SET(exitstatus);
5182         else
5183             STATUS_UNIX_SET(255);
5184     }
5185 #endif
5186     my_exit_jump();
5187 }
5188
5189 STATIC void
5190 S_my_exit_jump(pTHX)
5191 {
5192     dVAR;
5193
5194     if (PL_e_script) {
5195         SvREFCNT_dec(PL_e_script);
5196         PL_e_script = NULL;
5197     }
5198
5199     POPSTACK_TO(PL_mainstack);
5200     dounwind(-1);
5201     LEAVE_SCOPE(0);
5202
5203     JMPENV_JUMP(2);
5204 }
5205
5206 static I32
5207 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
5208 {
5209     dVAR;
5210     const char * const p  = SvPVX_const(PL_e_script);
5211     const char *nl = strchr(p, '\n');
5212
5213     PERL_UNUSED_ARG(idx);
5214     PERL_UNUSED_ARG(maxlen);
5215
5216     nl = (nl) ? nl+1 : SvEND(PL_e_script);
5217     if (nl-p == 0) {
5218         filter_del(read_e_script);
5219         return 0;
5220     }
5221     sv_catpvn(buf_sv, p, nl-p);
5222     sv_chop(PL_e_script, nl);
5223     return 1;
5224 }
5225
5226 /*
5227  * Local variables:
5228  * c-indentation-style: bsd
5229  * c-basic-offset: 4
5230  * indent-tabs-mode: t
5231  * End:
5232  *
5233  * ex: set ts=8 sts=4 sw=4 noet:
5234  */