3 * Copyright (c) 1987-1997 Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
16 #include "patchlevel.h"
18 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
23 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
24 char *getenv _((char *)); /* Usually in <stdlib.h> */
27 dEXTCONST char rcsid[] = "perl.c\nPatch level: ###\n";
35 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
45 curcop = &compiling; \
52 laststype = OP_STAT; \
54 maxsysfd = MAXSYSFD; \
61 laststype = OP_STAT; \
65 static void find_beginning _((void));
66 static void forbid_setid _((char *));
67 static void incpush _((char *, int));
68 static void init_ids _((void));
69 static void init_debugger _((void));
70 static void init_lexer _((void));
71 static void init_main_stash _((void));
73 static struct thread * init_main_thread _((void));
74 #endif /* USE_THREADS */
75 static void init_perllib _((void));
76 static void init_postdump_symbols _((int, char **, char **));
77 static void init_predump_symbols _((void));
78 static void my_exit_jump _((void)) __attribute__((noreturn));
79 static void nuke_stacks _((void));
80 static void open_script _((char *, bool, SV *));
81 static void usage _((char *));
82 static void validate_suid _((char *, char*));
84 static int fdscript = -1;
86 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
87 #include <asm/sigcontext.h>
89 catch_sigsegv(int signo, struct sigcontext_struct sc)
91 signal(SIGSEGV, SIG_DFL);
92 fprintf(stderr, "Segmentation fault dereferencing 0x%lx\n"
93 "return_address = 0x%lx, eip = 0x%lx\n",
94 sc.cr2, __builtin_return_address(0), sc.eip);
95 fprintf(stderr, "thread = 0x%lx\n", (unsigned long)THR);
102 PerlInterpreter *sv_interp;
105 New(53, sv_interp, 1, PerlInterpreter);
110 perl_construct( sv_interp )
111 register PerlInterpreter *sv_interp;
117 #endif /* FAKE_THREADS */
118 #endif /* USE_THREADS */
120 if (!(curinterp = sv_interp))
124 Zero(sv_interp, 1, PerlInterpreter);
127 /* Init the real globals (and main thread)? */
132 if (pthread_key_create(&thr_key, 0))
133 croak("panic: pthread_key_create");
134 MUTEX_INIT(&malloc_mutex);
135 MUTEX_INIT(&sv_mutex);
137 * Safe to use basic SV functions from now on (though
138 * not things like mortals or tainting yet).
140 MUTEX_INIT(&eval_mutex);
141 COND_INIT(&eval_cond);
142 MUTEX_INIT(&threads_mutex);
143 COND_INIT(&nthreads_cond);
145 thr = init_main_thread();
146 #endif /* USE_THREADS */
148 linestr = NEWSV(65,80);
149 sv_upgrade(linestr,SVt_PVIV);
151 if (!SvREADONLY(&sv_undef)) {
152 SvREADONLY_on(&sv_undef);
156 SvREADONLY_on(&sv_no);
158 sv_setpv(&sv_yes,Yes);
160 SvREADONLY_on(&sv_yes);
163 nrs = newSVpv("\n", 1);
164 rs = SvREFCNT_inc(nrs);
166 sighandlerp = sighandler;
171 * There is no way we can refer to them from Perl so close them to save
172 * space. The other alternative would be to provide STDAUX and STDPRN
175 (void)fclose(stdaux);
176 (void)fclose(stdprn);
182 perl_destruct_level = 1;
184 if(perl_destruct_level > 0)
189 lex_state = LEX_NOTPARSING;
191 start_env.je_prev = NULL;
192 start_env.je_ret = -1;
193 start_env.je_mustcatch = TRUE;
194 top_env = &start_env;
197 SET_NUMERIC_STANDARD();
198 #if defined(SUBVERSION) && SUBVERSION > 0
199 sprintf(patchlevel, "%7.5f", (double) 5
200 + ((double) PATCHLEVEL / (double) 1000)
201 + ((double) SUBVERSION / (double) 100000));
203 sprintf(patchlevel, "%5.3f", (double) 5 +
204 ((double) PATCHLEVEL / (double) 1000));
207 #if defined(LOCAL_PATCH_COUNT)
208 localpatches = local_patches; /* For possible -v */
211 PerlIO_init(); /* Hook to IO system */
213 fdpid = newAV(); /* for remembering popen pids by fd */
217 New(51,debname,128,char);
218 New(52,debdelim,128,char);
225 perl_destruct(sv_interp)
226 register PerlInterpreter *sv_interp;
229 int destruct_level; /* 0=none, 1=full, 2=full with checks */
234 #endif /* USE_THREADS */
236 if (!(curinterp = sv_interp))
241 /* Pass 1 on any remaining threads: detach joinables, join zombies */
243 MUTEX_LOCK(&threads_mutex);
244 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
245 "perl_destruct: waiting for %d threads...\n",
247 for (t = thr->next; t != thr; t = t->next) {
248 MUTEX_LOCK(&t->mutex);
249 switch (ThrSTATE(t)) {
252 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
253 "perl_destruct: joining zombie %p\n", t));
254 ThrSETSTATE(t, THRf_DEAD);
255 MUTEX_UNLOCK(&t->mutex);
258 * The SvREFCNT_dec below may take a long time (e.g. av
259 * may contain an object scalar whose destructor gets
260 * called) so we have to unlock threads_mutex and start
263 MUTEX_UNLOCK(&threads_mutex);
265 SvREFCNT_dec((SV*)av);
266 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
267 "perl_destruct: joined zombie %p OK\n", t));
269 case THRf_R_JOINABLE:
270 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
271 "perl_destruct: detaching thread %p\n", t));
272 ThrSETSTATE(t, THRf_R_DETACHED);
274 * We unlock threads_mutex and t->mutex in the opposite order
275 * from which we locked them just so that DETACH won't
276 * deadlock if it panics. It's only a breach of good style
277 * not a bug since they are unlocks not locks.
279 MUTEX_UNLOCK(&threads_mutex);
281 MUTEX_UNLOCK(&t->mutex);
284 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
285 "perl_destruct: ignoring %p (state %u)\n",
287 MUTEX_UNLOCK(&t->mutex);
288 /* fall through and out */
291 /* We leave the above "Pass 1" loop with threads_mutex still locked */
293 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
296 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
297 "perl_destruct: final wait for %d threads\n",
299 COND_WAIT(&nthreads_cond, &threads_mutex);
301 /* At this point, we're the last thread */
302 MUTEX_UNLOCK(&threads_mutex);
303 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
304 MUTEX_DESTROY(&threads_mutex);
305 COND_DESTROY(&nthreads_cond);
306 #endif /* !defined(FAKE_THREADS) */
307 #endif /* USE_THREADS */
309 destruct_level = perl_destruct_level;
313 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
315 if (destruct_level < i)
324 /* We must account for everything. */
326 /* Destroy the main CV and syntax tree */
328 curpad = AvARRAY(comppad);
333 SvREFCNT_dec(main_cv);
338 * Try to destruct global references. We do this first so that the
339 * destructors and destructees still exist. Some sv's might remain.
340 * Non-referenced objects are on their own.
347 /* unhook hooks which will soon be, or use, destroyed data */
348 SvREFCNT_dec(warnhook);
350 SvREFCNT_dec(diehook);
352 SvREFCNT_dec(parsehook);
355 if (destruct_level == 0){
357 DEBUG_P(debprofdump());
359 /* The exit() function will do everything that needs doing. */
363 /* loosen bonds of global variables */
366 (void)PerlIO_close(rsfp);
370 /* Filters for program text */
371 SvREFCNT_dec(rsfp_filters);
372 rsfp_filters = Nullav;
384 sawampersand = FALSE; /* must save all match strings */
385 sawstudy = FALSE; /* do fbm_instr on all strings */
400 /* magical thingies */
402 Safefree(ofs); /* $, */
405 Safefree(ors); /* $\ */
408 SvREFCNT_dec(nrs); /* $\ helper */
411 multiline = 0; /* $* */
413 SvREFCNT_dec(statname);
417 /* defgv, aka *_ should be taken care of elsewhere */
419 #if 0 /* just about all regexp stuff, seems to be ok */
421 /* shortcuts to regexp stuff */
426 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
428 regprecomp = NULL; /* uncompiled string. */
429 regparse = NULL; /* Input-scan pointer. */
430 regxend = NULL; /* End of input for compile */
431 regnpar = 0; /* () count. */
432 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
433 regsize = 0; /* Code size. */
434 regnaughty = 0; /* How bad is this pattern? */
435 regsawback = 0; /* Did we see \1, ...? */
437 reginput = NULL; /* String-input pointer. */
438 regbol = NULL; /* Beginning of input, for ^ check. */
439 regeol = NULL; /* End of input, for $ check. */
440 regstartp = (char **)NULL; /* Pointer to startp array. */
441 regendp = (char **)NULL; /* Ditto for endp. */
442 reglastparen = 0; /* Similarly for lastparen. */
443 regtill = NULL; /* How far we are required to go. */
444 regflags = 0; /* are we folding, multilining? */
445 regprev = (char)NULL; /* char before regbol, \n if none */
449 /* clean up after study() */
450 SvREFCNT_dec(lastscream);
452 Safefree(screamfirst);
454 Safefree(screamnext);
457 /* startup and shutdown function lists */
458 SvREFCNT_dec(beginav);
460 SvREFCNT_dec(initav);
465 /* temp stack during pp_sort() */
466 SvREFCNT_dec(sortstack);
469 /* shortcuts just get cleared */
479 /* reset so print() ends up where we expect */
482 /* Prepare to destruct main symbol table. */
489 if (destruct_level >= 2) {
490 if (scopestack_ix != 0)
491 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
492 (long)scopestack_ix);
493 if (savestack_ix != 0)
494 warn("Unbalanced saves: %ld more saves than restores\n",
496 if (tmps_floor != -1)
497 warn("Unbalanced tmps: %ld more allocs than frees\n",
498 (long)tmps_floor + 1);
499 if (cxstack_ix != -1)
500 warn("Unbalanced context: %ld more PUSHes than POPs\n",
501 (long)cxstack_ix + 1);
504 /* Now absolutely destruct everything, somehow or other, loops or no. */
506 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
507 while (sv_count != 0 && sv_count != last_sv_count) {
508 last_sv_count = sv_count;
511 SvFLAGS(strtab) &= ~SVTYPEMASK;
512 SvFLAGS(strtab) |= SVt_PVHV;
514 /* Destruct the global string table. */
516 /* Yell and reset the HeVAL() slots that are still holding refcounts,
517 * so that sv_free() won't fail on them.
526 array = HvARRAY(strtab);
530 warn("Unbalanced string table refcount: (%d) for \"%s\"",
531 HeVAL(hent) - Nullsv, HeKEY(hent));
532 HeVAL(hent) = Nullsv;
542 SvREFCNT_dec(strtab);
545 warn("Scalars leaked: %ld\n", (long)sv_count);
549 /* No SVs have survived, need to clean out */
553 Safefree(origfilename);
555 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
557 DEBUG_P(debprofdump());
559 MUTEX_DESTROY(&sv_mutex);
560 MUTEX_DESTROY(&malloc_mutex);
561 MUTEX_DESTROY(&eval_mutex);
562 COND_DESTROY(&eval_cond);
564 /* As the penultimate thing, free the non-arena SV for thrsv */
565 Safefree(SvPVX(thrsv));
566 Safefree(SvANY(thrsv));
569 #endif /* USE_THREADS */
571 /* As the absolutely last thing, free the non-arena SV for mess() */
574 /* we know that type >= SVt_PV */
576 Safefree(SvPVX(mess_sv));
577 Safefree(SvANY(mess_sv));
585 PerlInterpreter *sv_interp;
587 if (!(curinterp = sv_interp))
593 perl_parse(sv_interp, xsinit, argc, argv, env)
594 PerlInterpreter *sv_interp;
595 void (*xsinit)_((void));
603 char *scriptname = NULL;
604 VOL bool dosearch = FALSE;
611 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
614 croak("suidperl is no longer needed since the kernel can now execute\n\
615 setuid perl scripts securely.\n");
619 if (!(curinterp = sv_interp))
622 #if defined(NeXT) && defined(__DYNAMIC__)
623 _dyld_lookup_and_bind
624 ("__environ", (unsigned long *) &environ_pointer, NULL);
629 #ifndef VMS /* VMS doesn't have environ array */
630 origenviron = environ;
636 /* Come here if running an undumped a.out. */
638 origfilename = savepv(argv[0]);
640 cxstack_ix = -1; /* start label stack again */
642 init_postdump_symbols(argc,argv,env);
647 curpad = AvARRAY(comppad);
652 SvREFCNT_dec(main_cv);
656 oldscope = scopestack_ix;
664 /* my_exit() was called */
665 while (scopestack_ix > oldscope)
670 call_list(oldscope, endav);
672 return STATUS_NATIVE_EXPORT;
675 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
679 sv_setpvn(linestr,"",0);
680 sv = newSVpv("",0); /* first used for -I flags */
684 for (argc--,argv++; argc > 0; argc--,argv++) {
685 if (argv[0][0] != '-' || !argv[0][1])
689 validarg = " PHOOEY ";
714 if (s = moreswitches(s))
724 if (euid != uid || egid != gid)
725 croak("No -e allowed in setuid scripts");
727 e_tmpname = savepv(TMPPATH);
728 (void)mktemp(e_tmpname);
730 croak("Can't mktemp()");
731 e_fp = PerlIO_open(e_tmpname,"w");
733 croak("Cannot open temporary file");
738 PerlIO_puts(e_fp,argv[1]);
742 croak("No code specified for -e");
743 (void)PerlIO_putc(e_fp,'\n');
745 case 'I': /* -I handled both here and in moreswitches() */
747 if (!*++s && (s=argv[1]) != Nullch) {
750 while (s && isSPACE(*s))
754 for (e = s; *e && !isSPACE(*e); e++) ;
761 } /* XXX else croak? */
775 preambleav = newAV();
776 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
778 Sv = newSVpv("print myconfig();",0);
780 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
782 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
784 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
785 sv_catpv(Sv,"\" Compile-time options:");
787 sv_catpv(Sv," DEBUGGING");
790 sv_catpv(Sv," NO_EMBED");
793 sv_catpv(Sv," MULTIPLICITY");
795 sv_catpv(Sv,"\\n\",");
797 #if defined(LOCAL_PATCH_COUNT)
798 if (LOCAL_PATCH_COUNT > 0) {
800 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
801 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
803 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
807 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
810 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
812 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
817 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
818 print \" \\%ENV:\\n @env\\n\" if @env; \
819 print \" \\@INC:\\n @INC\\n\";");
822 Sv = newSVpv("config_vars(qw(",0);
827 av_push(preambleav, Sv);
828 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
839 if (!*++s || isSPACE(*s)) {
843 /* catch use of gnu style long options */
844 if (strEQ(s, "version")) {
848 if (strEQ(s, "help")) {
855 croak("Unrecognized switch: -%s (-h will show valid options)",s);
860 if (!tainting && (s = getenv("PERL5OPT"))) {
871 if (!strchr("DIMUdmw", *s))
872 croak("Illegal switch in PERL5OPT: -%c", *s);
878 scriptname = argv[0];
880 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
882 warn("Did you forget to compile with -DMULTIPLICITY?");
884 croak("Can't write to temp file for -e: %s", Strerror(errno));
888 scriptname = e_tmpname;
890 else if (scriptname == Nullch) {
892 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
900 open_script(scriptname,dosearch,sv);
902 validate_suid(validarg, scriptname);
907 main_cv = compcv = (CV*)NEWSV(1104,0);
908 sv_upgrade((SV *)compcv, SVt_PVCV);
912 av_push(comppad, Nullsv);
913 curpad = AvARRAY(comppad);
914 comppad_name = newAV();
915 comppad_name_fill = 0;
916 min_intro_pending = 0;
919 av_store(comppad_name, 0, newSVpv("@_", 2));
920 curpad[0] = (SV*)newAV();
921 SvPADMY_on(curpad[0]); /* XXX Needed? */
923 New(666, CvMUTEXP(compcv), 1, perl_mutex);
924 MUTEX_INIT(CvMUTEXP(compcv));
925 #endif /* USE_THREADS */
927 comppadlist = newAV();
928 AvREAL_off(comppadlist);
929 av_store(comppadlist, 0, (SV*)comppad_name);
930 av_store(comppadlist, 1, (SV*)comppad);
931 CvPADLIST(compcv) = comppadlist;
933 boot_core_UNIVERSAL();
935 (*xsinit)(); /* in case linked C routines want magical variables */
936 #if defined(VMS) || defined(WIN32)
940 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
941 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
944 init_predump_symbols();
946 init_postdump_symbols(argc,argv,env);
950 /* now parse the script */
953 if (yyparse() || error_count) {
955 croak("%s had compilation errors.\n", origfilename);
957 croak("Execution of %s aborted due to compilation errors.\n",
961 curcop->cop_line = 0;
965 (void)UNLINK(e_tmpname);
970 /* now that script is parsed, we can modify record separator */
972 rs = SvREFCNT_inc(nrs);
974 sv_setsv(*av_fetch(thr->magicals, find_thread_magical("/"), FALSE), rs);
976 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
977 #endif /* USE_THREADS */
988 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
989 dump_mstats("after compilation:");
1000 PerlInterpreter *sv_interp;
1007 if (!(curinterp = sv_interp))
1010 oldscope = scopestack_ix;
1015 cxstack_ix = -1; /* start context stack again */
1018 /* my_exit() was called */
1019 while (scopestack_ix > oldscope)
1022 curstash = defstash;
1024 call_list(oldscope, endav);
1026 if (getenv("PERL_DEBUG_MSTATS"))
1027 dump_mstats("after execution: ");
1030 return STATUS_NATIVE_EXPORT;
1033 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1038 if (curstack != mainstack) {
1040 SWITCHSTACK(curstack, mainstack);
1045 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1046 sawampersand ? "Enabling" : "Omitting"));
1049 DEBUG_x(dump_all());
1050 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1052 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1053 (unsigned long) thr));
1054 #endif /* USE_THREADS */
1057 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1060 if (PERLDB_SINGLE && DBsingle)
1061 sv_setiv(DBsingle, 1);
1063 call_list(oldscope, initav);
1073 else if (main_start) {
1074 CvDEPTH(main_cv) = 1;
1085 perl_get_sv(name, create)
1091 if (name[1] == '\0' && !isALPHA(name[0])
1092 && (tmp = find_thread_magical(name)) != NOT_IN_PAD) {
1093 return *av_fetch(thr->magicals, tmp, FALSE);
1095 #endif /* USE_THREADS */
1096 GV* gv = gv_fetchpv(name, create, SVt_PV);
1103 perl_get_av(name, create)
1107 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1116 perl_get_hv(name, create)
1120 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1129 perl_get_cv(name, create)
1133 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1134 if (create && !GvCVu(gv))
1135 return newSUB(start_subparse(FALSE, 0),
1136 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1144 /* Be sure to refetch the stack pointer after calling these routines. */
1147 perl_call_argv(subname, flags, argv)
1149 I32 flags; /* See G_* flags in cop.h */
1150 register char **argv; /* null terminated arg list */
1158 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1163 return perl_call_pv(subname, flags);
1167 perl_call_pv(subname, flags)
1168 char *subname; /* name of the subroutine */
1169 I32 flags; /* See G_* flags in cop.h */
1171 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1175 perl_call_method(methname, flags)
1176 char *methname; /* name of the subroutine */
1177 I32 flags; /* See G_* flags in cop.h */
1184 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1187 return perl_call_sv(*stack_sp--, flags);
1190 /* May be called with any of a CV, a GV, or an SV containing the name. */
1192 perl_call_sv(sv, flags)
1194 I32 flags; /* See G_* flags in cop.h */
1197 LOGOP myop; /* fake syntax tree node */
1203 bool oldcatch = CATCH_GET;
1208 if (flags & G_DISCARD) {
1213 Zero(&myop, 1, LOGOP);
1214 myop.op_next = Nullop;
1215 if (!(flags & G_NOARGS))
1216 myop.op_flags |= OPf_STACKED;
1217 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1218 (flags & G_ARRAY) ? OPf_WANT_LIST :
1223 EXTEND(stack_sp, 1);
1226 oldscope = scopestack_ix;
1228 if (PERLDB_SUB && curstash != debstash
1229 /* Handle first BEGIN of -d. */
1230 && (DBcv || (DBcv = GvCV(DBsub)))
1231 /* Try harder, since this may have been a sighandler, thus
1232 * curstash may be meaningless. */
1233 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1234 op->op_private |= OPpENTERSUB_DB;
1236 if (flags & G_EVAL) {
1237 cLOGOP->op_other = op;
1239 /* we're trying to emulate pp_entertry() here */
1241 register CONTEXT *cx;
1242 I32 gimme = GIMME_V;
1247 push_return(op->op_next);
1248 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1250 eval_root = op; /* Only needed so that goto works right. */
1253 if (flags & G_KEEPERR)
1268 /* my_exit() was called */
1269 curstash = defstash;
1273 croak("Callback called exit");
1282 stack_sp = stack_base + oldmark;
1283 if (flags & G_ARRAY)
1287 *++stack_sp = &sv_undef;
1295 if (op == (OP*)&myop)
1296 op = pp_entersub(ARGS);
1299 retval = stack_sp - (stack_base + oldmark);
1300 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1304 if (flags & G_EVAL) {
1305 if (scopestack_ix > oldscope) {
1309 register CONTEXT *cx;
1321 CATCH_SET(oldcatch);
1323 if (flags & G_DISCARD) {
1324 stack_sp = stack_base + oldmark;
1333 /* Eval a string. The G_EVAL flag is always assumed. */
1336 perl_eval_sv(sv, flags)
1338 I32 flags; /* See G_* flags in cop.h */
1341 UNOP myop; /* fake syntax tree node */
1343 I32 oldmark = sp - stack_base;
1350 if (flags & G_DISCARD) {
1358 EXTEND(stack_sp, 1);
1360 oldscope = scopestack_ix;
1362 if (!(flags & G_NOARGS))
1363 myop.op_flags = OPf_STACKED;
1364 myop.op_next = Nullop;
1365 myop.op_type = OP_ENTEREVAL;
1366 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1367 (flags & G_ARRAY) ? OPf_WANT_LIST :
1369 if (flags & G_KEEPERR)
1370 myop.op_flags |= OPf_SPECIAL;
1380 /* my_exit() was called */
1381 curstash = defstash;
1385 croak("Callback called exit");
1394 stack_sp = stack_base + oldmark;
1395 if (flags & G_ARRAY)
1399 *++stack_sp = &sv_undef;
1404 if (op == (OP*)&myop)
1405 op = pp_entereval(ARGS);
1408 retval = stack_sp - (stack_base + oldmark);
1409 if (!(flags & G_KEEPERR))
1414 if (flags & G_DISCARD) {
1415 stack_sp = stack_base + oldmark;
1425 perl_eval_pv(p, croak_on_error)
1431 SV* sv = newSVpv(p, 0);
1434 perl_eval_sv(sv, G_SCALAR);
1441 if (croak_on_error && SvTRUE(ERRSV))
1442 croak(SvPVx(ERRSV, na));
1447 /* Require a module. */
1453 SV* sv = sv_newmortal();
1454 sv_setpv(sv, "require '");
1457 perl_eval_sv(sv, G_DISCARD);
1461 magicname(sym,name,namlen)
1468 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1469 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1473 usage(name) /* XXX move this out into a module ? */
1476 /* This message really ought to be max 23 lines.
1477 * Removed -h because the user already knows that opton. Others? */
1479 static char *usage[] = {
1480 "-0[octal] specify record separator (\\0, if no argument)",
1481 "-a autosplit mode with -n or -p (splits $_ into @F)",
1482 "-c check syntax only (runs BEGIN and END blocks)",
1483 "-d[:debugger] run scripts under debugger",
1484 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1485 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1486 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1487 "-i[extension] edit <> files in place (make backup if extension supplied)",
1488 "-Idirectory specify @INC/#include directory (may be used more than once)",
1489 "-l[octal] enable line ending processing, specifies line terminator",
1490 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1491 "-n assume 'while (<>) { ... }' loop around your script",
1492 "-p assume loop like -n but print line also like sed",
1493 "-P run script through C preprocessor before compilation",
1494 "-s enable some switch parsing for switches after script name",
1495 "-S look for the script using PATH environment variable",
1496 "-T turn on tainting checks",
1497 "-u dump core after parsing script",
1498 "-U allow unsafe operations",
1499 "-v print version number and patchlevel of perl",
1500 "-V[:variable] print perl configuration information",
1501 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1502 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1508 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1510 printf("\n %s", *p++);
1513 /* This routine handles any switches that can be given during run */
1526 rschar = scan_oct(s, 4, &numlen);
1528 if (rschar & ~((U8)~0))
1530 else if (!rschar && numlen >= 2)
1531 nrs = newSVpv("", 0);
1534 nrs = newSVpv(&ch, 1);
1540 splitstr = savepv(s + 1);
1554 if (*s == ':' || *s == '=') {
1555 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1559 perldb = PERLDB_ALL;
1566 if (isALPHA(s[1])) {
1567 static char debopts[] = "psltocPmfrxuLHXD";
1570 for (s++; *s && (d = strchr(debopts,*s)); s++)
1571 debug |= 1 << (d - debopts);
1575 for (s++; isDIGIT(*s); s++) ;
1577 debug |= 0x80000000;
1579 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1580 for (s++; isALNUM(*s); s++) ;
1590 inplace = savepv(s+1);
1592 for (s = inplace; *s && !isSPACE(*s); s++) ;
1596 case 'I': /* -I handled both here and in parse_perl() */
1599 while (*s && isSPACE(*s))
1603 for (e = s; *e && !isSPACE(*e); e++) ;
1604 p = savepvn(s, e-s);
1610 croak("No space allowed after -I");
1620 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1630 ors = SvPV(nrs, orslen);
1631 ors = savepvn(ors, orslen);
1635 forbid_setid("-M"); /* XXX ? */
1638 forbid_setid("-m"); /* XXX ? */
1643 /* -M-foo == 'no foo' */
1644 if (*s == '-') { use = "no "; ++s; }
1645 sv = newSVpv(use,0);
1647 /* We allow -M'Module qw(Foo Bar)' */
1648 while(isALNUM(*s) || *s==':') ++s;
1650 sv_catpv(sv, start);
1651 if (*(start-1) == 'm') {
1653 croak("Can't use '%c' after -mname", *s);
1654 sv_catpv( sv, " ()");
1657 sv_catpvn(sv, start, s-start);
1658 sv_catpv(sv, " split(/,/,q{");
1663 if (preambleav == NULL)
1664 preambleav = newAV();
1665 av_push(preambleav, sv);
1668 croak("No space allowed after -%c", *(s-1));
1685 croak("Too late for \"-T\" option");
1697 #if defined(SUBVERSION) && SUBVERSION > 0
1698 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1699 PATCHLEVEL, SUBVERSION, ARCHNAME);
1701 printf("\nThis is perl, version %s built for %s",
1702 patchlevel, ARCHNAME);
1704 #if defined(LOCAL_PATCH_COUNT)
1705 if (LOCAL_PATCH_COUNT > 0)
1706 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1707 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1710 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1712 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1715 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1718 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1719 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1722 printf("atariST series port, ++jrb bammi@cadence.com\n");
1725 Perl may be copied only under the terms of either the Artistic License or the\n\
1726 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1734 if (s[1] == '-') /* Additional switches on #! line. */
1742 #ifdef ALTERNATE_SHEBANG
1743 case 'S': /* OS/2 needs -S on "extproc" line. */
1751 croak("Can't emulate -%.1s on #! line",s);
1756 /* compliments of Tom Christiansen */
1758 /* unexec() can be found in the Gnu emacs distribution */
1769 prog = newSVpv(BIN_EXP);
1770 sv_catpv(prog, "/perl");
1771 file = newSVpv(origfilename);
1772 sv_catpv(file, ".perldump");
1774 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1776 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1777 SvPVX(prog), SvPVX(file));
1781 # include <lib$routines.h>
1782 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1784 ABORT(); /* for use with undump */
1795 /* Note that strtab is a rather special HV. Assumptions are made
1796 about not iterating on it, and not adding tie magic to it.
1797 It is properly deallocated in perl_destruct() */
1799 HvSHAREKEYS_off(strtab); /* mandatory */
1800 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1801 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1803 curstash = defstash = newHV();
1804 curstname = newSVpv("main",4);
1805 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1806 SvREFCNT_dec(GvHV(gv));
1807 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1809 HvNAME(defstash) = savepv("main");
1810 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1812 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1813 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1815 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1816 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1817 sv_setpvn(ERRSV, "", 0);
1818 curstash = defstash;
1819 compiling.cop_stash = defstash;
1820 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1821 /* We must init $/ before switches are processed. */
1822 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1825 #ifdef CAN_PROTOTYPE
1827 open_script(char *scriptname, bool dosearch, SV *sv)
1830 open_script(scriptname,dosearch,sv)
1837 char *xfound = Nullch;
1838 char *xfailed = Nullch;
1842 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1843 # define SEARCH_EXTS ".bat", ".cmd", NULL
1844 # define MAX_EXT_LEN 4
1847 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1848 # define MAX_EXT_LEN 4
1851 # define SEARCH_EXTS ".pl", ".com", NULL
1852 # define MAX_EXT_LEN 4
1854 /* additional extensions to try in each dir if scriptname not found */
1856 char *ext[] = { SEARCH_EXTS };
1857 int extidx = 0, i = 0;
1858 char *curext = Nullch;
1860 # define MAX_EXT_LEN 0
1864 * If dosearch is true and if scriptname does not contain path
1865 * delimiters, search the PATH for scriptname.
1867 * If SEARCH_EXTS is also defined, will look for each
1868 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1869 * while searching the PATH.
1871 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1872 * proceeds as follows:
1874 * + look for ./scriptname{,.foo,.bar}
1875 * + search the PATH for scriptname{,.foo,.bar}
1878 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1879 * this will not look in '.' if it's not in the PATH)
1884 int hasdir, idx = 0, deftypes = 1;
1887 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1888 /* The first time through, just add SEARCH_EXTS to whatever we
1889 * already have, so we can check for default file types. */
1891 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1897 if ((strlen(tokenbuf) + strlen(scriptname)
1898 + MAX_EXT_LEN) >= sizeof tokenbuf)
1899 continue; /* don't search dir with too-long name */
1900 strcat(tokenbuf, scriptname);
1904 if (strEQ(scriptname, "-"))
1906 if (dosearch) { /* Look in '.' first. */
1907 char *cur = scriptname;
1909 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1911 if (strEQ(ext[i++],curext)) {
1912 extidx = -1; /* already has an ext */
1917 DEBUG_p(PerlIO_printf(Perl_debug_log,
1918 "Looking for %s\n",cur));
1919 if (Stat(cur,&statbuf) >= 0) {
1927 if (cur == scriptname) {
1928 len = strlen(scriptname);
1929 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1931 cur = strcpy(tokenbuf, scriptname);
1933 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1934 && strcpy(tokenbuf+len, ext[extidx++]));
1939 if (dosearch && !strchr(scriptname, '/')
1941 && !strchr(scriptname, '\\')
1943 && (s = getenv("PATH"))) {
1946 bufend = s + strlen(s);
1947 while (s < bufend) {
1948 #if defined(atarist) || defined(DOSISH)
1953 && *s != ';'; len++, s++) {
1954 if (len < sizeof tokenbuf)
1957 if (len < sizeof tokenbuf)
1958 tokenbuf[len] = '\0';
1959 #else /* ! (atarist || DOSISH) */
1960 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1963 #endif /* ! (atarist || DOSISH) */
1966 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1967 continue; /* don't search dir with too-long name */
1969 #if defined(atarist) || defined(DOSISH)
1970 && tokenbuf[len - 1] != '/'
1971 && tokenbuf[len - 1] != '\\'
1974 tokenbuf[len++] = '/';
1975 if (len == 2 && tokenbuf[0] == '.')
1977 (void)strcpy(tokenbuf + len, scriptname);
1981 len = strlen(tokenbuf);
1982 if (extidx > 0) /* reset after previous loop */
1986 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1987 retval = Stat(tokenbuf,&statbuf);
1989 } while ( retval < 0 /* not there */
1990 && extidx>=0 && ext[extidx] /* try an extension? */
1991 && strcpy(tokenbuf+len, ext[extidx++])
1996 if (S_ISREG(statbuf.st_mode)
1997 && cando(S_IRUSR,TRUE,&statbuf)
1999 && cando(S_IXUSR,TRUE,&statbuf)
2003 xfound = tokenbuf; /* bingo! */
2007 xfailed = savepv(tokenbuf);
2010 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
2012 seen_dot = 1; /* Disable message. */
2014 croak("Can't %s %s%s%s",
2015 (xfailed ? "execute" : "find"),
2016 (xfailed ? xfailed : scriptname),
2017 (xfailed ? "" : " on PATH"),
2018 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
2021 scriptname = xfound;
2024 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2025 char *s = scriptname + 8;
2034 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2035 curcop->cop_filegv = gv_fetchfile(origfilename);
2036 if (strEQ(origfilename,"-"))
2038 if (fdscript >= 0) {
2039 rsfp = PerlIO_fdopen(fdscript,"r");
2040 #if defined(HAS_FCNTL) && defined(F_SETFD)
2042 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2045 else if (preprocess) {
2046 char *cpp_cfg = CPPSTDIN;
2047 SV *cpp = NEWSV(0,0);
2048 SV *cmd = NEWSV(0,0);
2050 if (strEQ(cpp_cfg, "cppstdin"))
2051 sv_catpvf(cpp, "%s/", BIN_EXP);
2052 sv_catpv(cpp, cpp_cfg);
2055 sv_catpv(sv,PRIVLIB_EXP);
2059 sed %s -e \"/^[^#]/b\" \
2060 -e \"/^#[ ]*include[ ]/b\" \
2061 -e \"/^#[ ]*define[ ]/b\" \
2062 -e \"/^#[ ]*if[ ]/b\" \
2063 -e \"/^#[ ]*ifdef[ ]/b\" \
2064 -e \"/^#[ ]*ifndef[ ]/b\" \
2065 -e \"/^#[ ]*else/b\" \
2066 -e \"/^#[ ]*elif[ ]/b\" \
2067 -e \"/^#[ ]*undef[ ]/b\" \
2068 -e \"/^#[ ]*endif/b\" \
2071 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2074 %s %s -e '/^[^#]/b' \
2075 -e '/^#[ ]*include[ ]/b' \
2076 -e '/^#[ ]*define[ ]/b' \
2077 -e '/^#[ ]*if[ ]/b' \
2078 -e '/^#[ ]*ifdef[ ]/b' \
2079 -e '/^#[ ]*ifndef[ ]/b' \
2080 -e '/^#[ ]*else/b' \
2081 -e '/^#[ ]*elif[ ]/b' \
2082 -e '/^#[ ]*undef[ ]/b' \
2083 -e '/^#[ ]*endif/b' \
2091 (doextract ? "-e '1,/^#/d\n'" : ""),
2093 scriptname, cpp, sv, CPPMINUS);
2095 #ifdef IAMSUID /* actually, this is caught earlier */
2096 if (euid != uid && !euid) { /* if running suidperl */
2098 (void)seteuid(uid); /* musn't stay setuid root */
2101 (void)setreuid((Uid_t)-1, uid);
2103 #ifdef HAS_SETRESUID
2104 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2110 if (geteuid() != uid)
2111 croak("Can't do seteuid!\n");
2113 #endif /* IAMSUID */
2114 rsfp = my_popen(SvPVX(cmd), "r");
2118 else if (!*scriptname) {
2119 forbid_setid("program input from stdin");
2120 rsfp = PerlIO_stdin();
2123 rsfp = PerlIO_open(scriptname,"r");
2124 #if defined(HAS_FCNTL) && defined(F_SETFD)
2126 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2134 #ifndef IAMSUID /* in case script is not readable before setuid */
2135 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2136 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2138 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2139 croak("Can't do setuid\n");
2143 croak("Can't open perl script \"%s\": %s\n",
2144 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2149 validate_suid(validarg, scriptname)
2155 /* do we need to emulate setuid on scripts? */
2157 /* This code is for those BSD systems that have setuid #! scripts disabled
2158 * in the kernel because of a security problem. Merely defining DOSUID
2159 * in perl will not fix that problem, but if you have disabled setuid
2160 * scripts in the kernel, this will attempt to emulate setuid and setgid
2161 * on scripts that have those now-otherwise-useless bits set. The setuid
2162 * root version must be called suidperl or sperlN.NNN. If regular perl
2163 * discovers that it has opened a setuid script, it calls suidperl with
2164 * the same argv that it had. If suidperl finds that the script it has
2165 * just opened is NOT setuid root, it sets the effective uid back to the
2166 * uid. We don't just make perl setuid root because that loses the
2167 * effective uid we had before invoking perl, if it was different from the
2170 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2171 * be defined in suidperl only. suidperl must be setuid root. The
2172 * Configure script will set this up for you if you want it.
2179 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2180 croak("Can't stat script \"%s\"",origfilename);
2181 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2185 #ifndef HAS_SETREUID
2186 /* On this access check to make sure the directories are readable,
2187 * there is actually a small window that the user could use to make
2188 * filename point to an accessible directory. So there is a faint
2189 * chance that someone could execute a setuid script down in a
2190 * non-accessible directory. I don't know what to do about that.
2191 * But I don't think it's too important. The manual lies when
2192 * it says access() is useful in setuid programs.
2194 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2195 croak("Permission denied");
2197 /* If we can swap euid and uid, then we can determine access rights
2198 * with a simple stat of the file, and then compare device and
2199 * inode to make sure we did stat() on the same file we opened.
2200 * Then we just have to make sure he or she can execute it.
2203 struct stat tmpstatbuf;
2207 setreuid(euid,uid) < 0
2210 setresuid(euid,uid,(Uid_t)-1) < 0
2213 || getuid() != euid || geteuid() != uid)
2214 croak("Can't swap uid and euid"); /* really paranoid */
2215 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2216 croak("Permission denied"); /* testing full pathname here */
2217 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2218 tmpstatbuf.st_ino != statbuf.st_ino) {
2219 (void)PerlIO_close(rsfp);
2220 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2222 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2223 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2224 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2225 (long)statbuf.st_dev, (long)statbuf.st_ino,
2226 SvPVX(GvSV(curcop->cop_filegv)),
2227 (long)statbuf.st_uid, (long)statbuf.st_gid);
2228 (void)my_pclose(rsfp);
2230 croak("Permission denied\n");
2234 setreuid(uid,euid) < 0
2236 # if defined(HAS_SETRESUID)
2237 setresuid(uid,euid,(Uid_t)-1) < 0
2240 || getuid() != uid || geteuid() != euid)
2241 croak("Can't reswap uid and euid");
2242 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2243 croak("Permission denied\n");
2245 #endif /* HAS_SETREUID */
2246 #endif /* IAMSUID */
2248 if (!S_ISREG(statbuf.st_mode))
2249 croak("Permission denied");
2250 if (statbuf.st_mode & S_IWOTH)
2251 croak("Setuid/gid script is writable by world");
2252 doswitches = FALSE; /* -s is insecure in suid */
2254 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2255 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2256 croak("No #! line");
2257 s = SvPV(linestr,na)+2;
2259 while (!isSPACE(*s)) s++;
2260 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2261 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2262 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2263 croak("Not a perl script");
2264 while (*s == ' ' || *s == '\t') s++;
2266 * #! arg must be what we saw above. They can invoke it by
2267 * mentioning suidperl explicitly, but they may not add any strange
2268 * arguments beyond what #! says if they do invoke suidperl that way.
2270 len = strlen(validarg);
2271 if (strEQ(validarg," PHOOEY ") ||
2272 strnNE(s,validarg,len) || !isSPACE(s[len]))
2273 croak("Args must match #! line");
2276 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2277 euid == statbuf.st_uid)
2279 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2280 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2281 #endif /* IAMSUID */
2283 if (euid) { /* oops, we're not the setuid root perl */
2284 (void)PerlIO_close(rsfp);
2287 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2289 croak("Can't do setuid\n");
2292 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2294 (void)setegid(statbuf.st_gid);
2297 (void)setregid((Gid_t)-1,statbuf.st_gid);
2299 #ifdef HAS_SETRESGID
2300 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2302 setgid(statbuf.st_gid);
2306 if (getegid() != statbuf.st_gid)
2307 croak("Can't do setegid!\n");
2309 if (statbuf.st_mode & S_ISUID) {
2310 if (statbuf.st_uid != euid)
2312 (void)seteuid(statbuf.st_uid); /* all that for this */
2315 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2317 #ifdef HAS_SETRESUID
2318 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2320 setuid(statbuf.st_uid);
2324 if (geteuid() != statbuf.st_uid)
2325 croak("Can't do seteuid!\n");
2327 else if (uid) { /* oops, mustn't run as root */
2329 (void)seteuid((Uid_t)uid);
2332 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2334 #ifdef HAS_SETRESUID
2335 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2341 if (geteuid() != uid)
2342 croak("Can't do seteuid!\n");
2345 if (!cando(S_IXUSR,TRUE,&statbuf))
2346 croak("Permission denied\n"); /* they can't do this */
2349 else if (preprocess)
2350 croak("-P not allowed for setuid/setgid script\n");
2351 else if (fdscript >= 0)
2352 croak("fd script not allowed in suidperl\n");
2354 croak("Script is not setuid/setgid in suidperl\n");
2356 /* We absolutely must clear out any saved ids here, so we */
2357 /* exec the real perl, substituting fd script for scriptname. */
2358 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2359 PerlIO_rewind(rsfp);
2360 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2361 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2362 if (!origargv[which])
2363 croak("Permission denied");
2364 origargv[which] = savepv(form("/dev/fd/%d/%s",
2365 PerlIO_fileno(rsfp), origargv[which]));
2366 #if defined(HAS_FCNTL) && defined(F_SETFD)
2367 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2369 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2370 croak("Can't do setuid\n");
2371 #endif /* IAMSUID */
2373 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2374 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2376 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2377 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2379 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2382 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2383 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2384 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2385 /* not set-id, must be wrapped */
2393 register char *s, *s2;
2395 /* skip forward in input to the real script? */
2399 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2400 croak("No Perl script found in input\n");
2401 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2402 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2404 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2406 while (*s == ' ' || *s == '\t') s++;
2408 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2409 if (strnEQ(s2-4,"perl",4))
2411 while (s = moreswitches(s)) ;
2413 if (cddir && chdir(cddir) < 0)
2414 croak("Can't chdir to %s",cddir);
2422 uid = (int)getuid();
2423 euid = (int)geteuid();
2424 gid = (int)getgid();
2425 egid = (int)getegid();
2430 tainting |= (uid && (euid != uid || egid != gid));
2438 croak("No %s allowed while running setuid", s);
2440 croak("No %s allowed while running setgid", s);
2447 curstash = debstash;
2448 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2450 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2451 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2452 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2453 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2454 sv_setiv(DBsingle, 0);
2455 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2456 sv_setiv(DBtrace, 0);
2457 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2458 sv_setiv(DBsignal, 0);
2459 curstash = defstash;
2467 mainstack = curstack; /* remember in case we switch stacks */
2468 AvREAL_off(curstack); /* not a real array */
2469 av_extend(curstack,127);
2471 stack_base = AvARRAY(curstack);
2472 stack_sp = stack_base;
2473 stack_max = stack_base + 127;
2475 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2476 New(50,cxstack,cxstack_max + 1,CONTEXT);
2479 New(50,tmps_stack,128,SV*);
2485 * The following stacks almost certainly should be per-interpreter,
2486 * but for now they're not. XXX
2490 markstack_ptr = markstack;
2492 New(54,markstack,64,I32);
2493 markstack_ptr = markstack;
2494 markstack_max = markstack + 64;
2500 New(54,scopestack,32,I32);
2502 scopestack_max = 32;
2508 New(54,savestack,128,ANY);
2510 savestack_max = 128;
2516 New(54,retstack,16,OP*);
2527 Safefree(tmps_stack);
2534 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2543 subname = newSVpv("main",4);
2547 init_predump_symbols()
2554 sv_setpvn(*av_fetch(thr->magicals,find_thread_magical("\""),FALSE)," ", 1);
2556 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2557 #endif /* USE_THREADS */
2559 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2560 GvMULTI_on(stdingv);
2561 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2562 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2564 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2566 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2568 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2570 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2572 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2574 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2575 GvMULTI_on(othergv);
2576 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2577 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2579 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2581 statname = NEWSV(66,0); /* last filename we did stat on */
2584 osname = savepv(OSNAME);
2588 init_postdump_symbols(argc,argv,env)
2590 register char **argv;
2591 register char **env;
2598 argc--,argv++; /* skip name of script */
2600 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2603 if (argv[0][1] == '-') {
2607 if (s = strchr(argv[0], '=')) {
2609 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2612 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2615 toptarget = NEWSV(0,0);
2616 sv_upgrade(toptarget, SVt_PVFM);
2617 sv_setpvn(toptarget, "", 0);
2618 bodytarget = NEWSV(0,0);
2619 sv_upgrade(bodytarget, SVt_PVFM);
2620 sv_setpvn(bodytarget, "", 0);
2621 formtarget = bodytarget;
2624 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2625 sv_setpv(GvSV(tmpgv),origfilename);
2626 magicname("0", "0", 1);
2628 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2629 sv_setpv(GvSV(tmpgv),origargv[0]);
2630 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2632 (void)gv_AVadd(argvgv);
2633 av_clear(GvAVn(argvgv));
2634 for (; argc > 0; argc--,argv++) {
2635 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2638 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2642 hv_magic(hv, envgv, 'E');
2643 #ifndef VMS /* VMS doesn't have environ array */
2644 /* Note that if the supplied env parameter is actually a copy
2645 of the global environ then it may now point to free'd memory
2646 if the environment has been modified since. To avoid this
2647 problem we treat env==NULL as meaning 'use the default'
2652 environ[0] = Nullch;
2653 for (; *env; env++) {
2654 if (!(s = strchr(*env,'=')))
2660 sv = newSVpv(s--,0);
2661 (void)hv_store(hv, *env, s - *env, sv, 0);
2663 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2664 /* Sins of the RTL. See note in my_setenv(). */
2665 (void)putenv(savepv(*env));
2669 #ifdef DYNAMIC_ENV_FETCH
2670 HvNAME(hv) = savepv(ENV_HV_NAME);
2674 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2675 sv_setiv(GvSV(tmpgv), (IV)getpid());
2684 s = getenv("PERL5LIB");
2688 incpush(getenv("PERLLIB"), FALSE);
2690 /* Treat PERL5?LIB as a possible search list logical name -- the
2691 * "natural" VMS idiom for a Unix path string. We allow each
2692 * element to be a set of |-separated directories for compatibility.
2696 if (my_trnlnm("PERL5LIB",buf,0))
2697 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2699 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2703 /* Use the ~-expanded versions of APPLLIB (undocumented),
2704 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2707 incpush(APPLLIB_EXP, FALSE);
2711 incpush(ARCHLIB_EXP, FALSE);
2714 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2716 incpush(PRIVLIB_EXP, FALSE);
2719 incpush(SITEARCH_EXP, FALSE);
2722 incpush(SITELIB_EXP, FALSE);
2724 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2725 incpush(OLDARCHLIB_EXP, FALSE);
2729 incpush(".", FALSE);
2733 # define PERLLIB_SEP ';'
2736 # define PERLLIB_SEP '|'
2738 # define PERLLIB_SEP ':'
2741 #ifndef PERLLIB_MANGLE
2742 # define PERLLIB_MANGLE(s,n) (s)
2746 incpush(p, addsubdirs)
2750 SV *subdir = Nullsv;
2751 static char *archpat_auto;
2758 if (!archpat_auto) {
2759 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2760 + sizeof("//auto"));
2761 New(55, archpat_auto, len, char);
2762 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2764 for (len = sizeof(ARCHNAME) + 2;
2765 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2766 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2771 /* Break at all separators */
2773 SV *libdir = newSV(0);
2776 /* skip any consecutive separators */
2777 while ( *p == PERLLIB_SEP ) {
2778 /* Uncomment the next line for PATH semantics */
2779 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2783 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2784 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2789 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2790 p = Nullch; /* break out */
2794 * BEFORE pushing libdir onto @INC we may first push version- and
2795 * archname-specific sub-directories.
2798 struct stat tmpstatbuf;
2803 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2805 while (unix[len-1] == '/') len--; /* Cosmetic */
2806 sv_usepvn(libdir,unix,len);
2809 PerlIO_printf(PerlIO_stderr(),
2810 "Failed to unixify @INC element \"%s\"\n",
2813 /* .../archname/version if -d .../archname/version/auto */
2814 sv_setsv(subdir, libdir);
2815 sv_catpv(subdir, archpat_auto);
2816 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2817 S_ISDIR(tmpstatbuf.st_mode))
2818 av_push(GvAVn(incgv),
2819 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2821 /* .../archname if -d .../archname/auto */
2822 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2823 strlen(patchlevel) + 1, "", 0);
2824 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2825 S_ISDIR(tmpstatbuf.st_mode))
2826 av_push(GvAVn(incgv),
2827 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2830 /* finally push this lib directory on the end of @INC */
2831 av_push(GvAVn(incgv), libdir);
2834 SvREFCNT_dec(subdir);
2838 static struct thread *
2844 Newz(53, thr, 1, struct thread);
2845 curcop = &compiling;
2846 thr->cvcache = newHV();
2847 thr->magicals = newAV();
2848 thr->specific = newAV();
2849 thr->errsv = newSVpv("", 0);
2850 thr->errhv = newHV();
2851 thr->flags = THRf_R_JOINABLE;
2852 MUTEX_INIT(&thr->mutex);
2853 /* Handcraft thrsv similarly to mess_sv */
2854 New(53, thrsv, 1, SV);
2855 Newz(53, xpv, 1, XPV);
2856 SvFLAGS(thrsv) = SVt_PV;
2857 SvANY(thrsv) = (void*)xpv;
2858 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2859 SvPVX(thrsv) = (char*)thr;
2860 SvCUR_set(thrsv, sizeof(thr));
2861 SvLEN_set(thrsv, sizeof(thr));
2862 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2864 curcop = &compiling;
2867 MUTEX_LOCK(&threads_mutex);
2872 MUTEX_UNLOCK(&threads_mutex);
2874 #ifdef HAVE_THREAD_INTERN
2875 init_thread_intern(thr);
2877 thr->self = pthread_self();
2878 #endif /* HAVE_THREAD_INTERN */
2882 * These must come after the SET_THR because sv_setpvn does
2883 * SvTAINT and the taint fields require dTHR.
2885 toptarget = NEWSV(0,0);
2886 sv_upgrade(toptarget, SVt_PVFM);
2887 sv_setpvn(toptarget, "", 0);
2888 bodytarget = NEWSV(0,0);
2889 sv_upgrade(bodytarget, SVt_PVFM);
2890 sv_setpvn(bodytarget, "", 0);
2891 formtarget = bodytarget;
2894 #endif /* USE_THREADS */
2897 call_list(oldscope, list)
2902 line_t oldline = curcop->cop_line;
2907 while (AvFILL(list) >= 0) {
2908 CV *cv = (CV*)av_shift(list);
2917 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2918 (void)SvPV(atsv, len);
2921 curcop = &compiling;
2922 curcop->cop_line = oldline;
2923 if (list == beginav)
2924 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2926 sv_catpv(atsv, "END failed--cleanup aborted");
2927 while (scopestack_ix > oldscope)
2929 croak("%s", SvPVX(atsv));
2937 /* my_exit() was called */
2938 while (scopestack_ix > oldscope)
2941 curstash = defstash;
2943 call_list(oldscope, endav);
2945 curcop = &compiling;
2946 curcop->cop_line = oldline;
2948 if (list == beginav)
2949 croak("BEGIN failed--compilation aborted");
2951 croak("END failed--cleanup aborted");
2957 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2962 curcop = &compiling;
2963 curcop->cop_line = oldline;
2977 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2978 thr, (unsigned long) status));
2979 #endif /* USE_THREADS */
2988 STATUS_NATIVE_SET(status);
2998 if (vaxc$errno & 1) {
2999 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
3000 STATUS_NATIVE_SET(44);
3003 if (!vaxc$errno && errno) /* unlikely */
3004 STATUS_NATIVE_SET(44);
3006 STATUS_NATIVE_SET(vaxc$errno);
3010 STATUS_POSIX_SET(errno);
3011 else if (STATUS_POSIX == 0)
3012 STATUS_POSIX_SET(255);
3021 register CONTEXT *cx;
3030 (void)UNLINK(e_tmpname);
3031 Safefree(e_tmpname);
3035 if (cxstack_ix >= 0) {