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