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