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));
72 static void init_perllib _((void));
73 static void init_postdump_symbols _((int, char **, char **));
74 static void init_predump_symbols _((void));
75 static void my_exit_jump _((void)) __attribute__((noreturn));
76 static void nuke_stacks _((void));
77 static void open_script _((char *, bool, SV *));
78 static void usage _((char *));
79 static void validate_suid _((char *, char*));
81 static int fdscript = -1;
83 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
84 #include <asm/sigcontext.h>
86 catch_sigsegv(int signo, struct sigcontext_struct sc)
88 signal(SIGSEGV, SIG_DFL);
89 fprintf(stderr, "Segmentation fault dereferencing 0x%lx\n"
90 "return_address = 0x%lx, eip = 0x%lx\n",
91 sc.cr2, __builtin_return_address(0), sc.eip);
92 fprintf(stderr, "thread = 0x%lx\n", (unsigned long)THR);
99 PerlInterpreter *sv_interp;
102 New(53, sv_interp, 1, PerlInterpreter);
107 perl_construct(register PerlInterpreter *sv_interp)
113 #endif /* FAKE_THREADS */
114 #endif /* USE_THREADS */
116 if (!(curinterp = sv_interp))
120 Zero(sv_interp, 1, PerlInterpreter);
123 /* Init the real globals (and main thread)? */
128 if (pthread_key_create(&thr_key, 0))
129 croak("panic: pthread_key_create");
130 MUTEX_INIT(&malloc_mutex);
131 MUTEX_INIT(&sv_mutex);
133 * Safe to use basic SV functions from now on (though
134 * not things like mortals or tainting yet).
136 MUTEX_INIT(&eval_mutex);
137 COND_INIT(&eval_cond);
138 MUTEX_INIT(&threads_mutex);
139 COND_INIT(&nthreads_cond);
140 MUTEX_INIT(&keys_mutex);
142 thr = new_struct_thread(0);
143 #endif /* USE_THREADS */
145 linestr = NEWSV(65,80);
146 sv_upgrade(linestr,SVt_PVIV);
148 if (!SvREADONLY(&sv_undef)) {
149 SvREADONLY_on(&sv_undef);
153 SvREADONLY_on(&sv_no);
155 sv_setpv(&sv_yes,Yes);
157 SvREADONLY_on(&sv_yes);
160 nrs = newSVpv("\n", 1);
161 rs = SvREFCNT_inc(nrs);
163 sighandlerp = sighandler;
168 * There is no way we can refer to them from Perl so close them to save
169 * space. The other alternative would be to provide STDAUX and STDPRN
172 (void)fclose(stdaux);
173 (void)fclose(stdprn);
179 perl_destruct_level = 1;
181 if(perl_destruct_level > 0)
186 lex_state = LEX_NOTPARSING;
188 start_env.je_prev = NULL;
189 start_env.je_ret = -1;
190 start_env.je_mustcatch = TRUE;
191 top_env = &start_env;
194 SET_NUMERIC_STANDARD();
195 #if defined(SUBVERSION) && SUBVERSION > 0
196 sprintf(patchlevel, "%7.5f", (double) 5
197 + ((double) PATCHLEVEL / (double) 1000)
198 + ((double) SUBVERSION / (double) 100000));
200 sprintf(patchlevel, "%5.3f", (double) 5 +
201 ((double) PATCHLEVEL / (double) 1000));
204 #if defined(LOCAL_PATCH_COUNT)
205 localpatches = local_patches; /* For possible -v */
208 PerlIO_init(); /* Hook to IO system */
210 fdpid = newAV(); /* for remembering popen pids by fd */
212 for (i = 0; i < N_PER_THREAD_MAGICALS; i++)
213 magical_keys[i] = NOT_IN_PAD;
214 keys = newSVpv("", 0);
217 New(51,debname,128,char);
218 New(52,debdelim,128,char);
225 perl_destruct(register PerlInterpreter *sv_interp)
228 int destruct_level; /* 0=none, 1=full, 2=full with checks */
233 #endif /* USE_THREADS */
235 if (!(curinterp = sv_interp))
240 /* Pass 1 on any remaining threads: detach joinables, join zombies */
242 MUTEX_LOCK(&threads_mutex);
243 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
244 "perl_destruct: waiting for %d threads...\n",
246 for (t = thr->next; t != thr; t = t->next) {
247 MUTEX_LOCK(&t->mutex);
248 switch (ThrSTATE(t)) {
251 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
252 "perl_destruct: joining zombie %p\n", t));
253 ThrSETSTATE(t, THRf_DEAD);
254 MUTEX_UNLOCK(&t->mutex);
257 * The SvREFCNT_dec below may take a long time (e.g. av
258 * may contain an object scalar whose destructor gets
259 * called) so we have to unlock threads_mutex and start
262 MUTEX_UNLOCK(&threads_mutex);
264 SvREFCNT_dec((SV*)av);
265 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
266 "perl_destruct: joined zombie %p OK\n", t));
268 case THRf_R_JOINABLE:
269 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
270 "perl_destruct: detaching thread %p\n", t));
271 ThrSETSTATE(t, THRf_R_DETACHED);
273 * We unlock threads_mutex and t->mutex in the opposite order
274 * from which we locked them just so that DETACH won't
275 * deadlock if it panics. It's only a breach of good style
276 * not a bug since they are unlocks not locks.
278 MUTEX_UNLOCK(&threads_mutex);
280 MUTEX_UNLOCK(&t->mutex);
283 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
284 "perl_destruct: ignoring %p (state %u)\n",
286 MUTEX_UNLOCK(&t->mutex);
287 /* fall through and out */
290 /* We leave the above "Pass 1" loop with threads_mutex still locked */
292 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
295 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
296 "perl_destruct: final wait for %d threads\n",
298 COND_WAIT(&nthreads_cond, &threads_mutex);
300 /* At this point, we're the last thread */
301 MUTEX_UNLOCK(&threads_mutex);
302 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
303 MUTEX_DESTROY(&threads_mutex);
304 COND_DESTROY(&nthreads_cond);
305 #endif /* !defined(FAKE_THREADS) */
306 #endif /* USE_THREADS */
308 destruct_level = perl_destruct_level;
312 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
314 if (destruct_level < i)
323 /* We must account for everything. */
325 /* Destroy the main CV and syntax tree */
327 curpad = AvARRAY(comppad);
332 SvREFCNT_dec(main_cv);
337 * Try to destruct global references. We do this first so that the
338 * destructors and destructees still exist. Some sv's might remain.
339 * Non-referenced objects are on their own.
346 /* unhook hooks which will soon be, or use, destroyed data */
347 SvREFCNT_dec(warnhook);
349 SvREFCNT_dec(diehook);
351 SvREFCNT_dec(parsehook);
354 if (destruct_level == 0){
356 DEBUG_P(debprofdump());
358 /* The exit() function will do everything that needs doing. */
362 /* loosen bonds of global variables */
365 (void)PerlIO_close(rsfp);
369 /* Filters for program text */
370 SvREFCNT_dec(rsfp_filters);
371 rsfp_filters = Nullav;
383 sawampersand = FALSE; /* must save all match strings */
384 sawstudy = FALSE; /* do fbm_instr on all strings */
399 /* magical thingies */
401 Safefree(ofs); /* $, */
404 Safefree(ors); /* $\ */
407 SvREFCNT_dec(nrs); /* $\ helper */
410 multiline = 0; /* $* */
412 SvREFCNT_dec(statname);
416 /* defgv, aka *_ should be taken care of elsewhere */
418 #if 0 /* just about all regexp stuff, seems to be ok */
420 /* shortcuts to regexp stuff */
425 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
427 regprecomp = NULL; /* uncompiled string. */
428 regparse = NULL; /* Input-scan pointer. */
429 regxend = NULL; /* End of input for compile */
430 regnpar = 0; /* () count. */
431 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
432 regsize = 0; /* Code size. */
433 regnaughty = 0; /* How bad is this pattern? */
434 regsawback = 0; /* Did we see \1, ...? */
436 reginput = NULL; /* String-input pointer. */
437 regbol = NULL; /* Beginning of input, for ^ check. */
438 regeol = NULL; /* End of input, for $ check. */
439 regstartp = (char **)NULL; /* Pointer to startp array. */
440 regendp = (char **)NULL; /* Ditto for endp. */
441 reglastparen = 0; /* Similarly for lastparen. */
442 regtill = NULL; /* How far we are required to go. */
443 regflags = 0; /* are we folding, multilining? */
444 regprev = (char)NULL; /* char before regbol, \n if none */
448 /* clean up after study() */
449 SvREFCNT_dec(lastscream);
451 Safefree(screamfirst);
453 Safefree(screamnext);
456 /* startup and shutdown function lists */
457 SvREFCNT_dec(beginav);
459 SvREFCNT_dec(initav);
464 /* temp stack during pp_sort() */
465 SvREFCNT_dec(sortstack);
468 /* 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));
584 perl_free(PerlInterpreter *sv_interp)
586 if (!(curinterp = sv_interp))
592 perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
597 char *scriptname = NULL;
598 VOL bool dosearch = FALSE;
605 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
608 croak("suidperl is no longer needed since the kernel can now execute\n\
609 setuid perl scripts securely.\n");
613 if (!(curinterp = sv_interp))
616 #if defined(NeXT) && defined(__DYNAMIC__)
617 _dyld_lookup_and_bind
618 ("__environ", (unsigned long *) &environ_pointer, NULL);
623 #ifndef VMS /* VMS doesn't have environ array */
624 origenviron = environ;
630 /* Come here if running an undumped a.out. */
632 origfilename = savepv(argv[0]);
634 cxstack_ix = -1; /* start label stack again */
636 init_postdump_symbols(argc,argv,env);
641 curpad = AvARRAY(comppad);
646 SvREFCNT_dec(main_cv);
650 oldscope = scopestack_ix;
658 /* my_exit() was called */
659 while (scopestack_ix > oldscope)
664 call_list(oldscope, endav);
666 return STATUS_NATIVE_EXPORT;
669 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
673 sv_setpvn(linestr,"",0);
674 sv = newSVpv("",0); /* first used for -I flags */
678 for (argc--,argv++; argc > 0; argc--,argv++) {
679 if (argv[0][0] != '-' || !argv[0][1])
683 validarg = " PHOOEY ";
708 if (s = moreswitches(s))
718 if (euid != uid || egid != gid)
719 croak("No -e allowed in setuid scripts");
721 e_tmpname = savepv(TMPPATH);
722 (void)mktemp(e_tmpname);
724 croak("Can't mktemp()");
725 e_fp = PerlIO_open(e_tmpname,"w");
727 croak("Cannot open temporary file");
732 PerlIO_puts(e_fp,argv[1]);
736 croak("No code specified for -e");
737 (void)PerlIO_putc(e_fp,'\n');
739 case 'I': /* -I handled both here and in moreswitches() */
741 if (!*++s && (s=argv[1]) != Nullch) {
744 while (s && isSPACE(*s))
748 for (e = s; *e && !isSPACE(*e); e++) ;
755 } /* XXX else croak? */
769 preambleav = newAV();
770 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
772 Sv = newSVpv("print myconfig();",0);
774 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
776 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
778 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
779 sv_catpv(Sv,"\" Compile-time options:");
781 sv_catpv(Sv," DEBUGGING");
784 sv_catpv(Sv," NO_EMBED");
787 sv_catpv(Sv," MULTIPLICITY");
789 sv_catpv(Sv,"\\n\",");
791 #if defined(LOCAL_PATCH_COUNT)
792 if (LOCAL_PATCH_COUNT > 0) {
794 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
795 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
797 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
801 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
804 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
806 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
811 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
812 print \" \\%ENV:\\n @env\\n\" if @env; \
813 print \" \\@INC:\\n @INC\\n\";");
816 Sv = newSVpv("config_vars(qw(",0);
821 av_push(preambleav, Sv);
822 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
833 if (!*++s || isSPACE(*s)) {
837 /* catch use of gnu style long options */
838 if (strEQ(s, "version")) {
842 if (strEQ(s, "help")) {
849 croak("Unrecognized switch: -%s (-h will show valid options)",s);
854 if (!tainting && (s = getenv("PERL5OPT"))) {
865 if (!strchr("DIMUdmw", *s))
866 croak("Illegal switch in PERL5OPT: -%c", *s);
872 scriptname = argv[0];
874 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
876 warn("Did you forget to compile with -DMULTIPLICITY?");
878 croak("Can't write to temp file for -e: %s", Strerror(errno));
882 scriptname = e_tmpname;
884 else if (scriptname == Nullch) {
886 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
894 open_script(scriptname,dosearch,sv);
896 validate_suid(validarg, scriptname);
901 main_cv = compcv = (CV*)NEWSV(1104,0);
902 sv_upgrade((SV *)compcv, SVt_PVCV);
906 av_push(comppad, Nullsv);
907 curpad = AvARRAY(comppad);
908 comppad_name = newAV();
909 comppad_name_fill = 0;
910 min_intro_pending = 0;
913 av_store(comppad_name, 0, newSVpv("@_", 2));
914 curpad[0] = (SV*)newAV();
915 SvPADMY_on(curpad[0]); /* XXX Needed? */
917 New(666, CvMUTEXP(compcv), 1, perl_mutex);
918 MUTEX_INIT(CvMUTEXP(compcv));
919 #endif /* USE_THREADS */
921 comppadlist = newAV();
922 AvREAL_off(comppadlist);
923 av_store(comppadlist, 0, (SV*)comppad_name);
924 av_store(comppadlist, 1, (SV*)comppad);
925 CvPADLIST(compcv) = comppadlist;
927 boot_core_UNIVERSAL();
929 (*xsinit)(); /* in case linked C routines want magical variables */
930 #if defined(VMS) || defined(WIN32)
934 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
935 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
938 init_predump_symbols();
940 init_postdump_symbols(argc,argv,env);
944 /* now parse the script */
947 if (yyparse() || error_count) {
949 croak("%s had compilation errors.\n", origfilename);
951 croak("Execution of %s aborted due to compilation errors.\n",
955 curcop->cop_line = 0;
959 (void)UNLINK(e_tmpname);
964 /* now that script is parsed, we can modify record separator */
966 rs = SvREFCNT_inc(nrs);
968 sv_setsv(*av_fetch(thr->specific, find_thread_magical("/"), TRUE), rs);
970 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
971 #endif /* USE_THREADS */
982 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
983 dump_mstats("after compilation:");
993 perl_run(PerlInterpreter *sv_interp)
1000 if (!(curinterp = sv_interp))
1003 oldscope = scopestack_ix;
1008 cxstack_ix = -1; /* start context stack again */
1011 /* my_exit() was called */
1012 while (scopestack_ix > oldscope)
1015 curstash = defstash;
1017 call_list(oldscope, endav);
1019 if (getenv("PERL_DEBUG_MSTATS"))
1020 dump_mstats("after execution: ");
1023 return STATUS_NATIVE_EXPORT;
1026 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1031 if (curstack != mainstack) {
1033 SWITCHSTACK(curstack, mainstack);
1038 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1039 sawampersand ? "Enabling" : "Omitting"));
1042 DEBUG_x(dump_all());
1043 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1045 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1046 (unsigned long) thr));
1047 #endif /* USE_THREADS */
1050 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1053 if (PERLDB_SINGLE && DBsingle)
1054 sv_setiv(DBsingle, 1);
1056 call_list(oldscope, initav);
1066 else if (main_start) {
1067 CvDEPTH(main_cv) = 1;
1078 perl_get_sv(char *name, I32 create)
1080 GV* gv = gv_fetchpv(name, create, SVt_PV);
1087 perl_get_av(char *name, I32 create)
1089 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1098 perl_get_hv(char *name, I32 create)
1100 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1109 perl_get_cv(char *name, I32 create)
1111 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1112 if (create && !GvCVu(gv))
1113 return newSUB(start_subparse(FALSE, 0),
1114 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1122 /* Be sure to refetch the stack pointer after calling these routines. */
1125 perl_call_argv(char *subname, I32 flags, register char **argv)
1127 /* See G_* flags in cop.h */
1128 /* null terminated arg list */
1136 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1141 return perl_call_pv(subname, flags);
1145 perl_call_pv(char *subname, I32 flags)
1146 /* name of the subroutine */
1147 /* See G_* flags in cop.h */
1149 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1153 perl_call_method(char *methname, I32 flags)
1154 /* name of the subroutine */
1155 /* See G_* flags in cop.h */
1162 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1165 return perl_call_sv(*stack_sp--, flags);
1168 /* May be called with any of a CV, a GV, or an SV containing the name. */
1170 perl_call_sv(SV *sv, I32 flags)
1172 /* See G_* flags in cop.h */
1175 LOGOP myop; /* fake syntax tree node */
1181 bool oldcatch = CATCH_GET;
1186 if (flags & G_DISCARD) {
1191 Zero(&myop, 1, LOGOP);
1192 myop.op_next = Nullop;
1193 if (!(flags & G_NOARGS))
1194 myop.op_flags |= OPf_STACKED;
1195 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1196 (flags & G_ARRAY) ? OPf_WANT_LIST :
1201 EXTEND(stack_sp, 1);
1204 oldscope = scopestack_ix;
1206 if (PERLDB_SUB && curstash != debstash
1207 /* Handle first BEGIN of -d. */
1208 && (DBcv || (DBcv = GvCV(DBsub)))
1209 /* Try harder, since this may have been a sighandler, thus
1210 * curstash may be meaningless. */
1211 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1212 op->op_private |= OPpENTERSUB_DB;
1214 if (flags & G_EVAL) {
1215 cLOGOP->op_other = op;
1217 /* we're trying to emulate pp_entertry() here */
1219 register CONTEXT *cx;
1220 I32 gimme = GIMME_V;
1225 push_return(op->op_next);
1226 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1228 eval_root = op; /* Only needed so that goto works right. */
1231 if (flags & G_KEEPERR)
1246 /* my_exit() was called */
1247 curstash = defstash;
1251 croak("Callback called exit");
1260 stack_sp = stack_base + oldmark;
1261 if (flags & G_ARRAY)
1265 *++stack_sp = &sv_undef;
1273 if (op == (OP*)&myop)
1274 op = pp_entersub(ARGS);
1277 retval = stack_sp - (stack_base + oldmark);
1278 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1282 if (flags & G_EVAL) {
1283 if (scopestack_ix > oldscope) {
1287 register CONTEXT *cx;
1299 CATCH_SET(oldcatch);
1301 if (flags & G_DISCARD) {
1302 stack_sp = stack_base + oldmark;
1311 /* Eval a string. The G_EVAL flag is always assumed. */
1314 perl_eval_sv(SV *sv, I32 flags)
1316 /* See G_* flags in cop.h */
1319 UNOP myop; /* fake syntax tree node */
1321 I32 oldmark = sp - stack_base;
1328 if (flags & G_DISCARD) {
1336 EXTEND(stack_sp, 1);
1338 oldscope = scopestack_ix;
1340 if (!(flags & G_NOARGS))
1341 myop.op_flags = OPf_STACKED;
1342 myop.op_next = Nullop;
1343 myop.op_type = OP_ENTEREVAL;
1344 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1345 (flags & G_ARRAY) ? OPf_WANT_LIST :
1347 if (flags & G_KEEPERR)
1348 myop.op_flags |= OPf_SPECIAL;
1358 /* my_exit() was called */
1359 curstash = defstash;
1363 croak("Callback called exit");
1372 stack_sp = stack_base + oldmark;
1373 if (flags & G_ARRAY)
1377 *++stack_sp = &sv_undef;
1382 if (op == (OP*)&myop)
1383 op = pp_entereval(ARGS);
1386 retval = stack_sp - (stack_base + oldmark);
1387 if (!(flags & G_KEEPERR))
1392 if (flags & G_DISCARD) {
1393 stack_sp = stack_base + oldmark;
1403 perl_eval_pv(char *p, I32 croak_on_error)
1407 SV* sv = newSVpv(p, 0);
1410 perl_eval_sv(sv, G_SCALAR);
1417 if (croak_on_error && SvTRUE(errsv))
1418 croak(SvPV(errsv, na));
1423 /* Require a module. */
1426 perl_require_pv(char *pv)
1428 SV* sv = sv_newmortal();
1429 sv_setpv(sv, "require '");
1432 perl_eval_sv(sv, G_DISCARD);
1436 magicname(char *sym, char *name, I32 namlen)
1440 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1441 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1445 usage(char *name) /* XXX move this out into a module ? */
1448 /* This message really ought to be max 23 lines.
1449 * Removed -h because the user already knows that opton. Others? */
1451 static char *usage[] = {
1452 "-0[octal] specify record separator (\\0, if no argument)",
1453 "-a autosplit mode with -n or -p (splits $_ into @F)",
1454 "-c check syntax only (runs BEGIN and END blocks)",
1455 "-d[:debugger] run scripts under debugger",
1456 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1457 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1458 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1459 "-i[extension] edit <> files in place (make backup if extension supplied)",
1460 "-Idirectory specify @INC/#include directory (may be used more than once)",
1461 "-l[octal] enable line ending processing, specifies line terminator",
1462 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1463 "-n assume 'while (<>) { ... }' loop around your script",
1464 "-p assume loop like -n but print line also like sed",
1465 "-P run script through C preprocessor before compilation",
1466 "-s enable some switch parsing for switches after script name",
1467 "-S look for the script using PATH environment variable",
1468 "-T turn on tainting checks",
1469 "-u dump core after parsing script",
1470 "-U allow unsafe operations",
1471 "-v print version number and patchlevel of perl",
1472 "-V[:variable] print perl configuration information",
1473 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1474 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1480 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1482 printf("\n %s", *p++);
1485 /* This routine handles any switches that can be given during run */
1488 moreswitches(char *s)
1497 rschar = scan_oct(s, 4, &numlen);
1499 if (rschar & ~((U8)~0))
1501 else if (!rschar && numlen >= 2)
1502 nrs = newSVpv("", 0);
1505 nrs = newSVpv(&ch, 1);
1511 splitstr = savepv(s + 1);
1525 if (*s == ':' || *s == '=') {
1526 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1530 perldb = PERLDB_ALL;
1537 if (isALPHA(s[1])) {
1538 static char debopts[] = "psltocPmfrxuLHXD";
1541 for (s++; *s && (d = strchr(debopts,*s)); s++)
1542 debug |= 1 << (d - debopts);
1546 for (s++; isDIGIT(*s); s++) ;
1548 debug |= 0x80000000;
1550 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1551 for (s++; isALNUM(*s); s++) ;
1561 inplace = savepv(s+1);
1563 for (s = inplace; *s && !isSPACE(*s); s++) ;
1567 case 'I': /* -I handled both here and in parse_perl() */
1570 while (*s && isSPACE(*s))
1574 for (e = s; *e && !isSPACE(*e); e++) ;
1575 p = savepvn(s, e-s);
1581 croak("No space allowed after -I");
1591 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1601 ors = SvPV(nrs, orslen);
1602 ors = savepvn(ors, orslen);
1606 forbid_setid("-M"); /* XXX ? */
1609 forbid_setid("-m"); /* XXX ? */
1614 /* -M-foo == 'no foo' */
1615 if (*s == '-') { use = "no "; ++s; }
1616 sv = newSVpv(use,0);
1618 /* We allow -M'Module qw(Foo Bar)' */
1619 while(isALNUM(*s) || *s==':') ++s;
1621 sv_catpv(sv, start);
1622 if (*(start-1) == 'm') {
1624 croak("Can't use '%c' after -mname", *s);
1625 sv_catpv( sv, " ()");
1628 sv_catpvn(sv, start, s-start);
1629 sv_catpv(sv, " split(/,/,q{");
1634 if (preambleav == NULL)
1635 preambleav = newAV();
1636 av_push(preambleav, sv);
1639 croak("No space allowed after -%c", *(s-1));
1656 croak("Too late for \"-T\" option");
1668 #if defined(SUBVERSION) && SUBVERSION > 0
1669 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1670 PATCHLEVEL, SUBVERSION, ARCHNAME);
1672 printf("\nThis is perl, version %s built for %s",
1673 patchlevel, ARCHNAME);
1675 #if defined(LOCAL_PATCH_COUNT)
1676 if (LOCAL_PATCH_COUNT > 0)
1677 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1678 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1681 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1683 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1686 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1689 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1690 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1693 printf("atariST series port, ++jrb bammi@cadence.com\n");
1696 Perl may be copied only under the terms of either the Artistic License or the\n\
1697 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1705 if (s[1] == '-') /* Additional switches on #! line. */
1713 #ifdef ALTERNATE_SHEBANG
1714 case 'S': /* OS/2 needs -S on "extproc" line. */
1722 croak("Can't emulate -%.1s on #! line",s);
1727 /* compliments of Tom Christiansen */
1729 /* unexec() can be found in the Gnu emacs distribution */
1740 prog = newSVpv(BIN_EXP);
1741 sv_catpv(prog, "/perl");
1742 file = newSVpv(origfilename);
1743 sv_catpv(file, ".perldump");
1745 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1747 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1748 SvPVX(prog), SvPVX(file));
1752 # include <lib$routines.h>
1753 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1755 ABORT(); /* for use with undump */
1761 init_main_stash(void)
1766 /* Note that strtab is a rather special HV. Assumptions are made
1767 about not iterating on it, and not adding tie magic to it.
1768 It is properly deallocated in perl_destruct() */
1770 HvSHAREKEYS_off(strtab); /* mandatory */
1771 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1772 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1774 curstash = defstash = newHV();
1775 curstname = newSVpv("main",4);
1776 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1777 SvREFCNT_dec(GvHV(gv));
1778 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1780 HvNAME(defstash) = savepv("main");
1781 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1783 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1784 errsv = newSVpv("", 0);
1786 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1787 sv_grow(errsv, 240); /* Preallocate - for immediate signals. */
1788 sv_setpvn(errsv, "", 0);
1789 curstash = defstash;
1790 compiling.cop_stash = defstash;
1791 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1792 /* We must init $/ before switches are processed. */
1793 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1796 #ifdef CAN_PROTOTYPE
1798 open_script(char *scriptname, bool dosearch, SV *sv)
1801 open_script(scriptname,dosearch,sv)
1808 char *xfound = Nullch;
1809 char *xfailed = Nullch;
1813 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1814 # define SEARCH_EXTS ".bat", ".cmd", NULL
1815 # define MAX_EXT_LEN 4
1818 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1819 # define MAX_EXT_LEN 4
1822 # define SEARCH_EXTS ".pl", ".com", NULL
1823 # define MAX_EXT_LEN 4
1825 /* additional extensions to try in each dir if scriptname not found */
1827 char *ext[] = { SEARCH_EXTS };
1828 int extidx = 0, i = 0;
1829 char *curext = Nullch;
1831 # define MAX_EXT_LEN 0
1835 * If dosearch is true and if scriptname does not contain path
1836 * delimiters, search the PATH for scriptname.
1838 * If SEARCH_EXTS is also defined, will look for each
1839 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1840 * while searching the PATH.
1842 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1843 * proceeds as follows:
1845 * + look for ./scriptname{,.foo,.bar}
1846 * + search the PATH for scriptname{,.foo,.bar}
1849 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1850 * this will not look in '.' if it's not in the PATH)
1855 int hasdir, idx = 0, deftypes = 1;
1858 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1859 /* The first time through, just add SEARCH_EXTS to whatever we
1860 * already have, so we can check for default file types. */
1862 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1868 if ((strlen(tokenbuf) + strlen(scriptname)
1869 + MAX_EXT_LEN) >= sizeof tokenbuf)
1870 continue; /* don't search dir with too-long name */
1871 strcat(tokenbuf, scriptname);
1875 if (strEQ(scriptname, "-"))
1877 if (dosearch) { /* Look in '.' first. */
1878 char *cur = scriptname;
1880 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1882 if (strEQ(ext[i++],curext)) {
1883 extidx = -1; /* already has an ext */
1888 DEBUG_p(PerlIO_printf(Perl_debug_log,
1889 "Looking for %s\n",cur));
1890 if (Stat(cur,&statbuf) >= 0) {
1898 if (cur == scriptname) {
1899 len = strlen(scriptname);
1900 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1902 cur = strcpy(tokenbuf, scriptname);
1904 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1905 && strcpy(tokenbuf+len, ext[extidx++]));
1910 if (dosearch && !strchr(scriptname, '/')
1912 && !strchr(scriptname, '\\')
1914 && (s = getenv("PATH"))) {
1917 bufend = s + strlen(s);
1918 while (s < bufend) {
1919 #if defined(atarist) || defined(DOSISH)
1924 && *s != ';'; len++, s++) {
1925 if (len < sizeof tokenbuf)
1928 if (len < sizeof tokenbuf)
1929 tokenbuf[len] = '\0';
1930 #else /* ! (atarist || DOSISH) */
1931 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1934 #endif /* ! (atarist || DOSISH) */
1937 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1938 continue; /* don't search dir with too-long name */
1940 #if defined(atarist) || defined(DOSISH)
1941 && tokenbuf[len - 1] != '/'
1942 && tokenbuf[len - 1] != '\\'
1945 tokenbuf[len++] = '/';
1946 if (len == 2 && tokenbuf[0] == '.')
1948 (void)strcpy(tokenbuf + len, scriptname);
1952 len = strlen(tokenbuf);
1953 if (extidx > 0) /* reset after previous loop */
1957 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1958 retval = Stat(tokenbuf,&statbuf);
1960 } while ( retval < 0 /* not there */
1961 && extidx>=0 && ext[extidx] /* try an extension? */
1962 && strcpy(tokenbuf+len, ext[extidx++])
1967 if (S_ISREG(statbuf.st_mode)
1968 && cando(S_IRUSR,TRUE,&statbuf)
1970 && cando(S_IXUSR,TRUE,&statbuf)
1974 xfound = tokenbuf; /* bingo! */
1978 xfailed = savepv(tokenbuf);
1981 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1983 seen_dot = 1; /* Disable message. */
1985 croak("Can't %s %s%s%s",
1986 (xfailed ? "execute" : "find"),
1987 (xfailed ? xfailed : scriptname),
1988 (xfailed ? "" : " on PATH"),
1989 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1992 scriptname = xfound;
1995 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1996 char *s = scriptname + 8;
2005 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2006 curcop->cop_filegv = gv_fetchfile(origfilename);
2007 if (strEQ(origfilename,"-"))
2009 if (fdscript >= 0) {
2010 rsfp = PerlIO_fdopen(fdscript,"r");
2011 #if defined(HAS_FCNTL) && defined(F_SETFD)
2013 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2016 else if (preprocess) {
2017 char *cpp_cfg = CPPSTDIN;
2018 SV *cpp = NEWSV(0,0);
2019 SV *cmd = NEWSV(0,0);
2021 if (strEQ(cpp_cfg, "cppstdin"))
2022 sv_catpvf(cpp, "%s/", BIN_EXP);
2023 sv_catpv(cpp, cpp_cfg);
2026 sv_catpv(sv,PRIVLIB_EXP);
2030 sed %s -e \"/^[^#]/b\" \
2031 -e \"/^#[ ]*include[ ]/b\" \
2032 -e \"/^#[ ]*define[ ]/b\" \
2033 -e \"/^#[ ]*if[ ]/b\" \
2034 -e \"/^#[ ]*ifdef[ ]/b\" \
2035 -e \"/^#[ ]*ifndef[ ]/b\" \
2036 -e \"/^#[ ]*else/b\" \
2037 -e \"/^#[ ]*elif[ ]/b\" \
2038 -e \"/^#[ ]*undef[ ]/b\" \
2039 -e \"/^#[ ]*endif/b\" \
2042 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2045 %s %s -e '/^[^#]/b' \
2046 -e '/^#[ ]*include[ ]/b' \
2047 -e '/^#[ ]*define[ ]/b' \
2048 -e '/^#[ ]*if[ ]/b' \
2049 -e '/^#[ ]*ifdef[ ]/b' \
2050 -e '/^#[ ]*ifndef[ ]/b' \
2051 -e '/^#[ ]*else/b' \
2052 -e '/^#[ ]*elif[ ]/b' \
2053 -e '/^#[ ]*undef[ ]/b' \
2054 -e '/^#[ ]*endif/b' \
2062 (doextract ? "-e '1,/^#/d\n'" : ""),
2064 scriptname, cpp, sv, CPPMINUS);
2066 #ifdef IAMSUID /* actually, this is caught earlier */
2067 if (euid != uid && !euid) { /* if running suidperl */
2069 (void)seteuid(uid); /* musn't stay setuid root */
2072 (void)setreuid((Uid_t)-1, uid);
2074 #ifdef HAS_SETRESUID
2075 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2081 if (geteuid() != uid)
2082 croak("Can't do seteuid!\n");
2084 #endif /* IAMSUID */
2085 rsfp = my_popen(SvPVX(cmd), "r");
2089 else if (!*scriptname) {
2090 forbid_setid("program input from stdin");
2091 rsfp = PerlIO_stdin();
2094 rsfp = PerlIO_open(scriptname,"r");
2095 #if defined(HAS_FCNTL) && defined(F_SETFD)
2097 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2105 #ifndef IAMSUID /* in case script is not readable before setuid */
2106 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2107 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2109 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2110 croak("Can't do setuid\n");
2114 croak("Can't open perl script \"%s\": %s\n",
2115 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2120 validate_suid(char *validarg, char *scriptname)
2124 /* do we need to emulate setuid on scripts? */
2126 /* This code is for those BSD systems that have setuid #! scripts disabled
2127 * in the kernel because of a security problem. Merely defining DOSUID
2128 * in perl will not fix that problem, but if you have disabled setuid
2129 * scripts in the kernel, this will attempt to emulate setuid and setgid
2130 * on scripts that have those now-otherwise-useless bits set. The setuid
2131 * root version must be called suidperl or sperlN.NNN. If regular perl
2132 * discovers that it has opened a setuid script, it calls suidperl with
2133 * the same argv that it had. If suidperl finds that the script it has
2134 * just opened is NOT setuid root, it sets the effective uid back to the
2135 * uid. We don't just make perl setuid root because that loses the
2136 * effective uid we had before invoking perl, if it was different from the
2139 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2140 * be defined in suidperl only. suidperl must be setuid root. The
2141 * Configure script will set this up for you if you want it.
2148 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2149 croak("Can't stat script \"%s\"",origfilename);
2150 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2154 #ifndef HAS_SETREUID
2155 /* On this access check to make sure the directories are readable,
2156 * there is actually a small window that the user could use to make
2157 * filename point to an accessible directory. So there is a faint
2158 * chance that someone could execute a setuid script down in a
2159 * non-accessible directory. I don't know what to do about that.
2160 * But I don't think it's too important. The manual lies when
2161 * it says access() is useful in setuid programs.
2163 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2164 croak("Permission denied");
2166 /* If we can swap euid and uid, then we can determine access rights
2167 * with a simple stat of the file, and then compare device and
2168 * inode to make sure we did stat() on the same file we opened.
2169 * Then we just have to make sure he or she can execute it.
2172 struct stat tmpstatbuf;
2176 setreuid(euid,uid) < 0
2179 setresuid(euid,uid,(Uid_t)-1) < 0
2182 || getuid() != euid || geteuid() != uid)
2183 croak("Can't swap uid and euid"); /* really paranoid */
2184 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2185 croak("Permission denied"); /* testing full pathname here */
2186 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2187 tmpstatbuf.st_ino != statbuf.st_ino) {
2188 (void)PerlIO_close(rsfp);
2189 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2191 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2192 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2193 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2194 (long)statbuf.st_dev, (long)statbuf.st_ino,
2195 SvPVX(GvSV(curcop->cop_filegv)),
2196 (long)statbuf.st_uid, (long)statbuf.st_gid);
2197 (void)my_pclose(rsfp);
2199 croak("Permission denied\n");
2203 setreuid(uid,euid) < 0
2205 # if defined(HAS_SETRESUID)
2206 setresuid(uid,euid,(Uid_t)-1) < 0
2209 || getuid() != uid || geteuid() != euid)
2210 croak("Can't reswap uid and euid");
2211 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2212 croak("Permission denied\n");
2214 #endif /* HAS_SETREUID */
2215 #endif /* IAMSUID */
2217 if (!S_ISREG(statbuf.st_mode))
2218 croak("Permission denied");
2219 if (statbuf.st_mode & S_IWOTH)
2220 croak("Setuid/gid script is writable by world");
2221 doswitches = FALSE; /* -s is insecure in suid */
2223 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2224 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2225 croak("No #! line");
2226 s = SvPV(linestr,na)+2;
2228 while (!isSPACE(*s)) s++;
2229 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2230 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2231 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2232 croak("Not a perl script");
2233 while (*s == ' ' || *s == '\t') s++;
2235 * #! arg must be what we saw above. They can invoke it by
2236 * mentioning suidperl explicitly, but they may not add any strange
2237 * arguments beyond what #! says if they do invoke suidperl that way.
2239 len = strlen(validarg);
2240 if (strEQ(validarg," PHOOEY ") ||
2241 strnNE(s,validarg,len) || !isSPACE(s[len]))
2242 croak("Args must match #! line");
2245 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2246 euid == statbuf.st_uid)
2248 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2249 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2250 #endif /* IAMSUID */
2252 if (euid) { /* oops, we're not the setuid root perl */
2253 (void)PerlIO_close(rsfp);
2256 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2258 croak("Can't do setuid\n");
2261 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2263 (void)setegid(statbuf.st_gid);
2266 (void)setregid((Gid_t)-1,statbuf.st_gid);
2268 #ifdef HAS_SETRESGID
2269 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2271 setgid(statbuf.st_gid);
2275 if (getegid() != statbuf.st_gid)
2276 croak("Can't do setegid!\n");
2278 if (statbuf.st_mode & S_ISUID) {
2279 if (statbuf.st_uid != euid)
2281 (void)seteuid(statbuf.st_uid); /* all that for this */
2284 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2286 #ifdef HAS_SETRESUID
2287 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2289 setuid(statbuf.st_uid);
2293 if (geteuid() != statbuf.st_uid)
2294 croak("Can't do seteuid!\n");
2296 else if (uid) { /* oops, mustn't run as root */
2298 (void)seteuid((Uid_t)uid);
2301 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2303 #ifdef HAS_SETRESUID
2304 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2310 if (geteuid() != uid)
2311 croak("Can't do seteuid!\n");
2314 if (!cando(S_IXUSR,TRUE,&statbuf))
2315 croak("Permission denied\n"); /* they can't do this */
2318 else if (preprocess)
2319 croak("-P not allowed for setuid/setgid script\n");
2320 else if (fdscript >= 0)
2321 croak("fd script not allowed in suidperl\n");
2323 croak("Script is not setuid/setgid in suidperl\n");
2325 /* We absolutely must clear out any saved ids here, so we */
2326 /* exec the real perl, substituting fd script for scriptname. */
2327 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2328 PerlIO_rewind(rsfp);
2329 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2330 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2331 if (!origargv[which])
2332 croak("Permission denied");
2333 origargv[which] = savepv(form("/dev/fd/%d/%s",
2334 PerlIO_fileno(rsfp), origargv[which]));
2335 #if defined(HAS_FCNTL) && defined(F_SETFD)
2336 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2338 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2339 croak("Can't do setuid\n");
2340 #endif /* IAMSUID */
2342 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2343 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2345 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2346 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2348 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2351 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2352 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2353 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2354 /* not set-id, must be wrapped */
2360 find_beginning(void)
2362 register char *s, *s2;
2364 /* skip forward in input to the real script? */
2368 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2369 croak("No Perl script found in input\n");
2370 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2371 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2373 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2375 while (*s == ' ' || *s == '\t') s++;
2377 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2378 if (strnEQ(s2-4,"perl",4))
2380 while (s = moreswitches(s)) ;
2382 if (cddir && chdir(cddir) < 0)
2383 croak("Can't chdir to %s",cddir);
2391 uid = (int)getuid();
2392 euid = (int)geteuid();
2393 gid = (int)getgid();
2394 egid = (int)getegid();
2399 tainting |= (uid && (euid != uid || egid != gid));
2403 forbid_setid(char *s)
2406 croak("No %s allowed while running setuid", s);
2408 croak("No %s allowed while running setgid", s);
2415 curstash = debstash;
2416 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2418 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2419 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2420 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2421 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2422 sv_setiv(DBsingle, 0);
2423 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2424 sv_setiv(DBtrace, 0);
2425 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2426 sv_setiv(DBsignal, 0);
2427 curstash = defstash;
2431 init_stacks(ARGSproto)
2434 mainstack = curstack; /* remember in case we switch stacks */
2435 AvREAL_off(curstack); /* not a real array */
2436 av_extend(curstack,127);
2438 stack_base = AvARRAY(curstack);
2439 stack_sp = stack_base;
2440 stack_max = stack_base + 127;
2442 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2443 New(50,cxstack,cxstack_max + 1,CONTEXT);
2446 New(50,tmps_stack,128,SV*);
2452 * The following stacks almost certainly should be per-interpreter,
2453 * but for now they're not. XXX
2457 markstack_ptr = markstack;
2459 New(54,markstack,64,I32);
2460 markstack_ptr = markstack;
2461 markstack_max = markstack + 64;
2467 New(54,scopestack,32,I32);
2469 scopestack_max = 32;
2475 New(54,savestack,128,ANY);
2477 savestack_max = 128;
2483 New(54,retstack,16,OP*);
2494 Safefree(tmps_stack);
2501 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2510 subname = newSVpv("main",4);
2514 init_predump_symbols(void)
2521 sv_setpvn(*av_fetch(thr->specific,find_thread_magical("\""),TRUE), " ", 1);
2523 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2524 #endif /* USE_THREADS */
2526 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2527 GvMULTI_on(stdingv);
2528 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2529 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2531 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2533 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2535 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2537 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2539 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2541 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2542 GvMULTI_on(othergv);
2543 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2544 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2546 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2548 statname = NEWSV(66,0); /* last filename we did stat on */
2551 osname = savepv(OSNAME);
2555 init_postdump_symbols(register int argc, register char **argv, register char **env)
2562 argc--,argv++; /* skip name of script */
2564 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2567 if (argv[0][1] == '-') {
2571 if (s = strchr(argv[0], '=')) {
2573 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2576 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2579 toptarget = NEWSV(0,0);
2580 sv_upgrade(toptarget, SVt_PVFM);
2581 sv_setpvn(toptarget, "", 0);
2582 bodytarget = NEWSV(0,0);
2583 sv_upgrade(bodytarget, SVt_PVFM);
2584 sv_setpvn(bodytarget, "", 0);
2585 formtarget = bodytarget;
2588 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2589 sv_setpv(GvSV(tmpgv),origfilename);
2590 magicname("0", "0", 1);
2592 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2593 sv_setpv(GvSV(tmpgv),origargv[0]);
2594 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2596 (void)gv_AVadd(argvgv);
2597 av_clear(GvAVn(argvgv));
2598 for (; argc > 0; argc--,argv++) {
2599 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2602 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2606 hv_magic(hv, envgv, 'E');
2607 #ifndef VMS /* VMS doesn't have environ array */
2608 /* Note that if the supplied env parameter is actually a copy
2609 of the global environ then it may now point to free'd memory
2610 if the environment has been modified since. To avoid this
2611 problem we treat env==NULL as meaning 'use the default'
2616 environ[0] = Nullch;
2617 for (; *env; env++) {
2618 if (!(s = strchr(*env,'=')))
2624 sv = newSVpv(s--,0);
2625 (void)hv_store(hv, *env, s - *env, sv, 0);
2627 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2628 /* Sins of the RTL. See note in my_setenv(). */
2629 (void)putenv(savepv(*env));
2633 #ifdef DYNAMIC_ENV_FETCH
2634 HvNAME(hv) = savepv(ENV_HV_NAME);
2638 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2639 sv_setiv(GvSV(tmpgv), (IV)getpid());
2648 s = getenv("PERL5LIB");
2652 incpush(getenv("PERLLIB"), FALSE);
2654 /* Treat PERL5?LIB as a possible search list logical name -- the
2655 * "natural" VMS idiom for a Unix path string. We allow each
2656 * element to be a set of |-separated directories for compatibility.
2660 if (my_trnlnm("PERL5LIB",buf,0))
2661 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2663 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2667 /* Use the ~-expanded versions of APPLLIB (undocumented),
2668 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2671 incpush(APPLLIB_EXP, FALSE);
2675 incpush(ARCHLIB_EXP, FALSE);
2678 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2680 incpush(PRIVLIB_EXP, FALSE);
2683 incpush(SITEARCH_EXP, FALSE);
2686 incpush(SITELIB_EXP, FALSE);
2688 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2689 incpush(OLDARCHLIB_EXP, FALSE);
2693 incpush(".", FALSE);
2697 # define PERLLIB_SEP ';'
2700 # define PERLLIB_SEP '|'
2702 # define PERLLIB_SEP ':'
2705 #ifndef PERLLIB_MANGLE
2706 # define PERLLIB_MANGLE(s,n) (s)
2710 incpush(char *p, int addsubdirs)
2712 SV *subdir = Nullsv;
2713 static char *archpat_auto;
2720 if (!archpat_auto) {
2721 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2722 + sizeof("//auto"));
2723 New(55, archpat_auto, len, char);
2724 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2726 for (len = sizeof(ARCHNAME) + 2;
2727 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2728 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2733 /* Break at all separators */
2735 SV *libdir = newSV(0);
2738 /* skip any consecutive separators */
2739 while ( *p == PERLLIB_SEP ) {
2740 /* Uncomment the next line for PATH semantics */
2741 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2745 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2746 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2751 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2752 p = Nullch; /* break out */
2756 * BEFORE pushing libdir onto @INC we may first push version- and
2757 * archname-specific sub-directories.
2760 struct stat tmpstatbuf;
2765 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2767 while (unix[len-1] == '/') len--; /* Cosmetic */
2768 sv_usepvn(libdir,unix,len);
2771 PerlIO_printf(PerlIO_stderr(),
2772 "Failed to unixify @INC element \"%s\"\n",
2775 /* .../archname/version if -d .../archname/version/auto */
2776 sv_setsv(subdir, libdir);
2777 sv_catpv(subdir, archpat_auto);
2778 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2779 S_ISDIR(tmpstatbuf.st_mode))
2780 av_push(GvAVn(incgv),
2781 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2783 /* .../archname if -d .../archname/auto */
2784 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2785 strlen(patchlevel) + 1, "", 0);
2786 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2787 S_ISDIR(tmpstatbuf.st_mode))
2788 av_push(GvAVn(incgv),
2789 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2792 /* finally push this lib directory on the end of @INC */
2793 av_push(GvAVn(incgv), libdir);
2796 SvREFCNT_dec(subdir);
2800 call_list(I32 oldscope, AV *list)
2803 line_t oldline = curcop->cop_line;
2808 while (AvFILL(list) >= 0) {
2809 CV *cv = (CV*)av_shift(list);
2816 SV* atsv = sv_mortalcopy(errsv);
2818 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2819 (void)SvPV(atsv, len);
2822 curcop = &compiling;
2823 curcop->cop_line = oldline;
2824 if (list == beginav)
2825 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2827 sv_catpv(atsv, "END failed--cleanup aborted");
2828 while (scopestack_ix > oldscope)
2830 croak("%s", SvPVX(atsv));
2838 /* my_exit() was called */
2839 while (scopestack_ix > oldscope)
2842 curstash = defstash;
2844 call_list(oldscope, endav);
2846 curcop = &compiling;
2847 curcop->cop_line = oldline;
2849 if (list == beginav)
2850 croak("BEGIN failed--compilation aborted");
2852 croak("END failed--cleanup aborted");
2858 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2863 curcop = &compiling;
2864 curcop->cop_line = oldline;
2877 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2878 thr, (unsigned long) status));
2879 #endif /* USE_THREADS */
2888 STATUS_NATIVE_SET(status);
2895 my_failure_exit(void)
2898 if (vaxc$errno & 1) {
2899 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2900 STATUS_NATIVE_SET(44);
2903 if (!vaxc$errno && errno) /* unlikely */
2904 STATUS_NATIVE_SET(44);
2906 STATUS_NATIVE_SET(vaxc$errno);
2910 STATUS_POSIX_SET(errno);
2911 else if (STATUS_POSIX == 0)
2912 STATUS_POSIX_SET(255);
2921 register CONTEXT *cx;
2930 (void)UNLINK(e_tmpname);
2931 Safefree(e_tmpname);
2935 if (cxstack_ix >= 0) {