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