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