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