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( sv_interp )
108 register PerlInterpreter *sv_interp;
114 #endif /* FAKE_THREADS */
115 #endif /* USE_THREADS */
117 if (!(curinterp = sv_interp))
121 Zero(sv_interp, 1, PerlInterpreter);
124 /* Init the real globals (and main thread)? */
129 if (pthread_key_create(&thr_key, 0))
130 croak("panic: pthread_key_create");
131 MUTEX_INIT(&malloc_mutex);
132 MUTEX_INIT(&sv_mutex);
134 * Safe to use basic SV functions from now on (though
135 * not things like mortals or tainting yet).
137 MUTEX_INIT(&eval_mutex);
138 COND_INIT(&eval_cond);
139 MUTEX_INIT(&threads_mutex);
140 COND_INIT(&nthreads_cond);
141 MUTEX_INIT(&keys_mutex);
143 thr = new_struct_thread(0);
144 #endif /* USE_THREADS */
146 linestr = NEWSV(65,80);
147 sv_upgrade(linestr,SVt_PVIV);
149 if (!SvREADONLY(&sv_undef)) {
150 SvREADONLY_on(&sv_undef);
154 SvREADONLY_on(&sv_no);
156 sv_setpv(&sv_yes,Yes);
158 SvREADONLY_on(&sv_yes);
161 nrs = newSVpv("\n", 1);
162 rs = SvREFCNT_inc(nrs);
164 sighandlerp = sighandler;
169 * There is no way we can refer to them from Perl so close them to save
170 * space. The other alternative would be to provide STDAUX and STDPRN
173 (void)fclose(stdaux);
174 (void)fclose(stdprn);
180 perl_destruct_level = 1;
182 if(perl_destruct_level > 0)
187 lex_state = LEX_NOTPARSING;
189 start_env.je_prev = NULL;
190 start_env.je_ret = -1;
191 start_env.je_mustcatch = TRUE;
192 top_env = &start_env;
195 SET_NUMERIC_STANDARD();
196 #if defined(SUBVERSION) && SUBVERSION > 0
197 sprintf(patchlevel, "%7.5f", (double) 5
198 + ((double) PATCHLEVEL / (double) 1000)
199 + ((double) SUBVERSION / (double) 100000));
201 sprintf(patchlevel, "%5.3f", (double) 5 +
202 ((double) PATCHLEVEL / (double) 1000));
205 #if defined(LOCAL_PATCH_COUNT)
206 localpatches = local_patches; /* For possible -v */
209 PerlIO_init(); /* Hook to IO system */
211 fdpid = newAV(); /* for remembering popen pids by fd */
213 for (i = 0; i < N_PER_THREAD_MAGICALS; i++)
214 magical_keys[i] = NOT_IN_PAD;
215 keys = newSVpv("", 0);
218 New(51,debname,128,char);
219 New(52,debdelim,128,char);
226 perl_destruct(sv_interp)
227 register PerlInterpreter *sv_interp;
230 int destruct_level; /* 0=none, 1=full, 2=full with checks */
235 #endif /* USE_THREADS */
237 if (!(curinterp = sv_interp))
242 /* Pass 1 on any remaining threads: detach joinables, join zombies */
244 MUTEX_LOCK(&threads_mutex);
245 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
246 "perl_destruct: waiting for %d threads...\n",
248 for (t = thr->next; t != thr; t = t->next) {
249 MUTEX_LOCK(&t->mutex);
250 switch (ThrSTATE(t)) {
253 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
254 "perl_destruct: joining zombie %p\n", t));
255 ThrSETSTATE(t, THRf_DEAD);
256 MUTEX_UNLOCK(&t->mutex);
259 * The SvREFCNT_dec below may take a long time (e.g. av
260 * may contain an object scalar whose destructor gets
261 * called) so we have to unlock threads_mutex and start
264 MUTEX_UNLOCK(&threads_mutex);
266 SvREFCNT_dec((SV*)av);
267 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
268 "perl_destruct: joined zombie %p OK\n", t));
270 case THRf_R_JOINABLE:
271 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
272 "perl_destruct: detaching thread %p\n", t));
273 ThrSETSTATE(t, THRf_R_DETACHED);
275 * We unlock threads_mutex and t->mutex in the opposite order
276 * from which we locked them just so that DETACH won't
277 * deadlock if it panics. It's only a breach of good style
278 * not a bug since they are unlocks not locks.
280 MUTEX_UNLOCK(&threads_mutex);
282 MUTEX_UNLOCK(&t->mutex);
285 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
286 "perl_destruct: ignoring %p (state %u)\n",
288 MUTEX_UNLOCK(&t->mutex);
289 /* fall through and out */
292 /* We leave the above "Pass 1" loop with threads_mutex still locked */
294 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
297 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
298 "perl_destruct: final wait for %d threads\n",
300 COND_WAIT(&nthreads_cond, &threads_mutex);
302 /* At this point, we're the last thread */
303 MUTEX_UNLOCK(&threads_mutex);
304 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
305 MUTEX_DESTROY(&threads_mutex);
306 COND_DESTROY(&nthreads_cond);
307 #endif /* !defined(FAKE_THREADS) */
308 #endif /* USE_THREADS */
310 destruct_level = perl_destruct_level;
314 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
316 if (destruct_level < i)
325 /* We must account for everything. */
327 /* Destroy the main CV and syntax tree */
329 curpad = AvARRAY(comppad);
334 SvREFCNT_dec(main_cv);
339 * Try to destruct global references. We do this first so that the
340 * destructors and destructees still exist. Some sv's might remain.
341 * Non-referenced objects are on their own.
348 /* unhook hooks which will soon be, or use, destroyed data */
349 SvREFCNT_dec(warnhook);
351 SvREFCNT_dec(diehook);
353 SvREFCNT_dec(parsehook);
356 if (destruct_level == 0){
358 DEBUG_P(debprofdump());
360 /* The exit() function will do everything that needs doing. */
364 /* loosen bonds of global variables */
367 (void)PerlIO_close(rsfp);
371 /* Filters for program text */
372 SvREFCNT_dec(rsfp_filters);
373 rsfp_filters = Nullav;
385 sawampersand = FALSE; /* must save all match strings */
386 sawstudy = FALSE; /* do fbm_instr on all strings */
401 /* magical thingies */
403 Safefree(ofs); /* $, */
406 Safefree(ors); /* $\ */
409 SvREFCNT_dec(nrs); /* $\ helper */
412 multiline = 0; /* $* */
414 SvREFCNT_dec(statname);
418 /* defgv, aka *_ should be taken care of elsewhere */
420 #if 0 /* just about all regexp stuff, seems to be ok */
422 /* shortcuts to regexp stuff */
427 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
429 regprecomp = NULL; /* uncompiled string. */
430 regparse = NULL; /* Input-scan pointer. */
431 regxend = NULL; /* End of input for compile */
432 regnpar = 0; /* () count. */
433 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
434 regsize = 0; /* Code size. */
435 regnaughty = 0; /* How bad is this pattern? */
436 regsawback = 0; /* Did we see \1, ...? */
438 reginput = NULL; /* String-input pointer. */
439 regbol = NULL; /* Beginning of input, for ^ check. */
440 regeol = NULL; /* End of input, for $ check. */
441 regstartp = (char **)NULL; /* Pointer to startp array. */
442 regendp = (char **)NULL; /* Ditto for endp. */
443 reglastparen = 0; /* Similarly for lastparen. */
444 regtill = NULL; /* How far we are required to go. */
445 regflags = 0; /* are we folding, multilining? */
446 regprev = (char)NULL; /* char before regbol, \n if none */
450 /* clean up after study() */
451 SvREFCNT_dec(lastscream);
453 Safefree(screamfirst);
455 Safefree(screamnext);
458 /* startup and shutdown function lists */
459 SvREFCNT_dec(beginav);
461 SvREFCNT_dec(initav);
466 /* temp stack during pp_sort() */
467 SvREFCNT_dec(sortstack);
470 /* shortcuts just get cleared */
481 /* reset so print() ends up where we expect */
484 /* Prepare to destruct main symbol table. */
491 if (destruct_level >= 2) {
492 if (scopestack_ix != 0)
493 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
494 (long)scopestack_ix);
495 if (savestack_ix != 0)
496 warn("Unbalanced saves: %ld more saves than restores\n",
498 if (tmps_floor != -1)
499 warn("Unbalanced tmps: %ld more allocs than frees\n",
500 (long)tmps_floor + 1);
501 if (cxstack_ix != -1)
502 warn("Unbalanced context: %ld more PUSHes than POPs\n",
503 (long)cxstack_ix + 1);
506 /* Now absolutely destruct everything, somehow or other, loops or no. */
508 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
509 while (sv_count != 0 && sv_count != last_sv_count) {
510 last_sv_count = sv_count;
513 SvFLAGS(strtab) &= ~SVTYPEMASK;
514 SvFLAGS(strtab) |= SVt_PVHV;
516 /* Destruct the global string table. */
518 /* Yell and reset the HeVAL() slots that are still holding refcounts,
519 * so that sv_free() won't fail on them.
528 array = HvARRAY(strtab);
532 warn("Unbalanced string table refcount: (%d) for \"%s\"",
533 HeVAL(hent) - Nullsv, HeKEY(hent));
534 HeVAL(hent) = Nullsv;
544 SvREFCNT_dec(strtab);
547 warn("Scalars leaked: %ld\n", (long)sv_count);
551 /* No SVs have survived, need to clean out */
555 Safefree(origfilename);
557 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
559 DEBUG_P(debprofdump());
561 MUTEX_DESTROY(&sv_mutex);
562 MUTEX_DESTROY(&malloc_mutex);
563 MUTEX_DESTROY(&eval_mutex);
564 COND_DESTROY(&eval_cond);
566 /* As the penultimate thing, free the non-arena SV for thrsv */
567 Safefree(SvPVX(thrsv));
568 Safefree(SvANY(thrsv));
571 #endif /* USE_THREADS */
573 /* As the absolutely last thing, free the non-arena SV for mess() */
576 /* we know that type >= SVt_PV */
578 Safefree(SvPVX(mess_sv));
579 Safefree(SvANY(mess_sv));
587 PerlInterpreter *sv_interp;
589 if (!(curinterp = sv_interp))
595 perl_parse(sv_interp, xsinit, argc, argv, env)
596 PerlInterpreter *sv_interp;
597 void (*xsinit)_((void));
605 char *scriptname = NULL;
606 VOL bool dosearch = FALSE;
613 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
616 croak("suidperl is no longer needed since the kernel can now execute\n\
617 setuid perl scripts securely.\n");
621 if (!(curinterp = sv_interp))
624 #if defined(NeXT) && defined(__DYNAMIC__)
625 _dyld_lookup_and_bind
626 ("__environ", (unsigned long *) &environ_pointer, NULL);
631 #ifndef VMS /* VMS doesn't have environ array */
632 origenviron = environ;
638 /* Come here if running an undumped a.out. */
640 origfilename = savepv(argv[0]);
642 cxstack_ix = -1; /* start label stack again */
644 init_postdump_symbols(argc,argv,env);
649 curpad = AvARRAY(comppad);
654 SvREFCNT_dec(main_cv);
658 oldscope = scopestack_ix;
666 /* my_exit() was called */
667 while (scopestack_ix > oldscope)
672 call_list(oldscope, endav);
674 return STATUS_NATIVE_EXPORT;
677 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
681 sv_setpvn(linestr,"",0);
682 sv = newSVpv("",0); /* first used for -I flags */
686 for (argc--,argv++; argc > 0; argc--,argv++) {
687 if (argv[0][0] != '-' || !argv[0][1])
691 validarg = " PHOOEY ";
716 if (s = moreswitches(s))
726 if (euid != uid || egid != gid)
727 croak("No -e allowed in setuid scripts");
729 e_tmpname = savepv(TMPPATH);
730 (void)mktemp(e_tmpname);
732 croak("Can't mktemp()");
733 e_fp = PerlIO_open(e_tmpname,"w");
735 croak("Cannot open temporary file");
740 PerlIO_puts(e_fp,argv[1]);
744 croak("No code specified for -e");
745 (void)PerlIO_putc(e_fp,'\n');
747 case 'I': /* -I handled both here and in moreswitches() */
749 if (!*++s && (s=argv[1]) != Nullch) {
752 while (s && isSPACE(*s))
756 for (e = s; *e && !isSPACE(*e); e++) ;
763 } /* XXX else croak? */
777 preambleav = newAV();
778 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
780 Sv = newSVpv("print myconfig();",0);
782 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
784 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
786 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
787 sv_catpv(Sv,"\" Compile-time options:");
789 sv_catpv(Sv," DEBUGGING");
792 sv_catpv(Sv," NO_EMBED");
795 sv_catpv(Sv," MULTIPLICITY");
797 sv_catpv(Sv,"\\n\",");
799 #if defined(LOCAL_PATCH_COUNT)
800 if (LOCAL_PATCH_COUNT > 0) {
802 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
803 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
805 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
809 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
812 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
814 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
819 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
820 print \" \\%ENV:\\n @env\\n\" if @env; \
821 print \" \\@INC:\\n @INC\\n\";");
824 Sv = newSVpv("config_vars(qw(",0);
829 av_push(preambleav, Sv);
830 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
841 if (!*++s || isSPACE(*s)) {
845 /* catch use of gnu style long options */
846 if (strEQ(s, "version")) {
850 if (strEQ(s, "help")) {
857 croak("Unrecognized switch: -%s (-h will show valid options)",s);
862 if (!tainting && (s = getenv("PERL5OPT"))) {
873 if (!strchr("DIMUdmw", *s))
874 croak("Illegal switch in PERL5OPT: -%c", *s);
880 scriptname = argv[0];
882 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
884 warn("Did you forget to compile with -DMULTIPLICITY?");
886 croak("Can't write to temp file for -e: %s", Strerror(errno));
890 scriptname = e_tmpname;
892 else if (scriptname == Nullch) {
894 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
902 open_script(scriptname,dosearch,sv);
904 validate_suid(validarg, scriptname);
909 main_cv = compcv = (CV*)NEWSV(1104,0);
910 sv_upgrade((SV *)compcv, SVt_PVCV);
914 av_push(comppad, Nullsv);
915 curpad = AvARRAY(comppad);
916 comppad_name = newAV();
917 comppad_name_fill = 0;
918 min_intro_pending = 0;
921 av_store(comppad_name, 0, newSVpv("@_", 2));
922 curpad[0] = (SV*)newAV();
923 SvPADMY_on(curpad[0]); /* XXX Needed? */
925 New(666, CvMUTEXP(compcv), 1, perl_mutex);
926 MUTEX_INIT(CvMUTEXP(compcv));
927 #endif /* USE_THREADS */
929 comppadlist = newAV();
930 AvREAL_off(comppadlist);
931 av_store(comppadlist, 0, (SV*)comppad_name);
932 av_store(comppadlist, 1, (SV*)comppad);
933 CvPADLIST(compcv) = comppadlist;
935 boot_core_UNIVERSAL();
937 (*xsinit)(); /* in case linked C routines want magical variables */
938 #if defined(VMS) || defined(WIN32)
942 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
943 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
946 init_predump_symbols();
948 init_postdump_symbols(argc,argv,env);
952 /* now parse the script */
955 if (yyparse() || error_count) {
957 croak("%s had compilation errors.\n", origfilename);
959 croak("Execution of %s aborted due to compilation errors.\n",
963 curcop->cop_line = 0;
967 (void)UNLINK(e_tmpname);
972 /* now that script is parsed, we can modify record separator */
974 rs = SvREFCNT_inc(nrs);
976 sv_setsv(*av_fetch(thr->specific, find_thread_magical("/"), TRUE), rs);
978 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
979 #endif /* USE_THREADS */
990 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
991 dump_mstats("after compilation:");
1002 PerlInterpreter *sv_interp;
1009 if (!(curinterp = sv_interp))
1012 oldscope = scopestack_ix;
1017 cxstack_ix = -1; /* start context stack again */
1020 /* my_exit() was called */
1021 while (scopestack_ix > oldscope)
1024 curstash = defstash;
1026 call_list(oldscope, endav);
1028 if (getenv("PERL_DEBUG_MSTATS"))
1029 dump_mstats("after execution: ");
1032 return STATUS_NATIVE_EXPORT;
1035 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1040 if (curstack != mainstack) {
1042 SWITCHSTACK(curstack, mainstack);
1047 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1048 sawampersand ? "Enabling" : "Omitting"));
1051 DEBUG_x(dump_all());
1052 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1054 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1055 (unsigned long) thr));
1056 #endif /* USE_THREADS */
1059 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1062 if (PERLDB_SINGLE && DBsingle)
1063 sv_setiv(DBsingle, 1);
1065 call_list(oldscope, initav);
1075 else if (main_start) {
1076 CvDEPTH(main_cv) = 1;
1087 perl_get_sv(name, create)
1091 GV* gv = gv_fetchpv(name, create, SVt_PV);
1098 perl_get_av(name, create)
1102 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1111 perl_get_hv(name, create)
1115 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1124 perl_get_cv(name, create)
1128 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1129 if (create && !GvCVu(gv))
1130 return newSUB(start_subparse(FALSE, 0),
1131 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1139 /* Be sure to refetch the stack pointer after calling these routines. */
1142 perl_call_argv(subname, flags, argv)
1144 I32 flags; /* See G_* flags in cop.h */
1145 register char **argv; /* null terminated arg list */
1153 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1158 return perl_call_pv(subname, flags);
1162 perl_call_pv(subname, flags)
1163 char *subname; /* name of the subroutine */
1164 I32 flags; /* See G_* flags in cop.h */
1166 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1170 perl_call_method(methname, flags)
1171 char *methname; /* name of the subroutine */
1172 I32 flags; /* See G_* flags in cop.h */
1179 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1182 return perl_call_sv(*stack_sp--, flags);
1185 /* May be called with any of a CV, a GV, or an SV containing the name. */
1187 perl_call_sv(sv, flags)
1189 I32 flags; /* See G_* flags in cop.h */
1192 LOGOP myop; /* fake syntax tree node */
1198 bool oldcatch = CATCH_GET;
1203 if (flags & G_DISCARD) {
1208 Zero(&myop, 1, LOGOP);
1209 myop.op_next = Nullop;
1210 if (!(flags & G_NOARGS))
1211 myop.op_flags |= OPf_STACKED;
1212 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1213 (flags & G_ARRAY) ? OPf_WANT_LIST :
1218 EXTEND(stack_sp, 1);
1221 oldscope = scopestack_ix;
1223 if (PERLDB_SUB && curstash != debstash
1224 /* Handle first BEGIN of -d. */
1225 && (DBcv || (DBcv = GvCV(DBsub)))
1226 /* Try harder, since this may have been a sighandler, thus
1227 * curstash may be meaningless. */
1228 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1229 op->op_private |= OPpENTERSUB_DB;
1231 if (flags & G_EVAL) {
1232 cLOGOP->op_other = op;
1234 /* we're trying to emulate pp_entertry() here */
1236 register CONTEXT *cx;
1237 I32 gimme = GIMME_V;
1242 push_return(op->op_next);
1243 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1245 eval_root = op; /* Only needed so that goto works right. */
1248 if (flags & G_KEEPERR)
1263 /* my_exit() was called */
1264 curstash = defstash;
1268 croak("Callback called exit");
1277 stack_sp = stack_base + oldmark;
1278 if (flags & G_ARRAY)
1282 *++stack_sp = &sv_undef;
1290 if (op == (OP*)&myop)
1291 op = pp_entersub(ARGS);
1294 retval = stack_sp - (stack_base + oldmark);
1295 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1299 if (flags & G_EVAL) {
1300 if (scopestack_ix > oldscope) {
1304 register CONTEXT *cx;
1316 CATCH_SET(oldcatch);
1318 if (flags & G_DISCARD) {
1319 stack_sp = stack_base + oldmark;
1328 /* Eval a string. The G_EVAL flag is always assumed. */
1331 perl_eval_sv(sv, flags)
1333 I32 flags; /* See G_* flags in cop.h */
1336 UNOP myop; /* fake syntax tree node */
1338 I32 oldmark = sp - stack_base;
1345 if (flags & G_DISCARD) {
1353 EXTEND(stack_sp, 1);
1355 oldscope = scopestack_ix;
1357 if (!(flags & G_NOARGS))
1358 myop.op_flags = OPf_STACKED;
1359 myop.op_next = Nullop;
1360 myop.op_type = OP_ENTEREVAL;
1361 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1362 (flags & G_ARRAY) ? OPf_WANT_LIST :
1364 if (flags & G_KEEPERR)
1365 myop.op_flags |= OPf_SPECIAL;
1375 /* my_exit() was called */
1376 curstash = defstash;
1380 croak("Callback called exit");
1389 stack_sp = stack_base + oldmark;
1390 if (flags & G_ARRAY)
1394 *++stack_sp = &sv_undef;
1399 if (op == (OP*)&myop)
1400 op = pp_entereval(ARGS);
1403 retval = stack_sp - (stack_base + oldmark);
1404 if (!(flags & G_KEEPERR))
1409 if (flags & G_DISCARD) {
1410 stack_sp = stack_base + oldmark;
1420 perl_eval_pv(p, croak_on_error)
1426 SV* sv = newSVpv(p, 0);
1429 perl_eval_sv(sv, G_SCALAR);
1436 if (croak_on_error && SvTRUE(errsv))
1437 croak(SvPV(errsv, na));
1442 /* Require a module. */
1448 SV* sv = sv_newmortal();
1449 sv_setpv(sv, "require '");
1452 perl_eval_sv(sv, G_DISCARD);
1456 magicname(sym,name,namlen)
1463 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1464 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1468 usage(name) /* XXX move this out into a module ? */
1471 /* This message really ought to be max 23 lines.
1472 * Removed -h because the user already knows that opton. Others? */
1474 static char *usage[] = {
1475 "-0[octal] specify record separator (\\0, if no argument)",
1476 "-a autosplit mode with -n or -p (splits $_ into @F)",
1477 "-c check syntax only (runs BEGIN and END blocks)",
1478 "-d[:debugger] run scripts under debugger",
1479 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1480 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1481 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1482 "-i[extension] edit <> files in place (make backup if extension supplied)",
1483 "-Idirectory specify @INC/#include directory (may be used more than once)",
1484 "-l[octal] enable line ending processing, specifies line terminator",
1485 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1486 "-n assume 'while (<>) { ... }' loop around your script",
1487 "-p assume loop like -n but print line also like sed",
1488 "-P run script through C preprocessor before compilation",
1489 "-s enable some switch parsing for switches after script name",
1490 "-S look for the script using PATH environment variable",
1491 "-T turn on tainting checks",
1492 "-u dump core after parsing script",
1493 "-U allow unsafe operations",
1494 "-v print version number and patchlevel of perl",
1495 "-V[:variable] print perl configuration information",
1496 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1497 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1503 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1505 printf("\n %s", *p++);
1508 /* This routine handles any switches that can be given during run */
1521 rschar = scan_oct(s, 4, &numlen);
1523 if (rschar & ~((U8)~0))
1525 else if (!rschar && numlen >= 2)
1526 nrs = newSVpv("", 0);
1529 nrs = newSVpv(&ch, 1);
1535 splitstr = savepv(s + 1);
1549 if (*s == ':' || *s == '=') {
1550 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1554 perldb = PERLDB_ALL;
1561 if (isALPHA(s[1])) {
1562 static char debopts[] = "psltocPmfrxuLHXD";
1565 for (s++; *s && (d = strchr(debopts,*s)); s++)
1566 debug |= 1 << (d - debopts);
1570 for (s++; isDIGIT(*s); s++) ;
1572 debug |= 0x80000000;
1574 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1575 for (s++; isALNUM(*s); s++) ;
1585 inplace = savepv(s+1);
1587 for (s = inplace; *s && !isSPACE(*s); s++) ;
1591 case 'I': /* -I handled both here and in parse_perl() */
1594 while (*s && isSPACE(*s))
1598 for (e = s; *e && !isSPACE(*e); e++) ;
1599 p = savepvn(s, e-s);
1605 croak("No space allowed after -I");
1615 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1625 ors = SvPV(nrs, orslen);
1626 ors = savepvn(ors, orslen);
1630 forbid_setid("-M"); /* XXX ? */
1633 forbid_setid("-m"); /* XXX ? */
1638 /* -M-foo == 'no foo' */
1639 if (*s == '-') { use = "no "; ++s; }
1640 sv = newSVpv(use,0);
1642 /* We allow -M'Module qw(Foo Bar)' */
1643 while(isALNUM(*s) || *s==':') ++s;
1645 sv_catpv(sv, start);
1646 if (*(start-1) == 'm') {
1648 croak("Can't use '%c' after -mname", *s);
1649 sv_catpv( sv, " ()");
1652 sv_catpvn(sv, start, s-start);
1653 sv_catpv(sv, " split(/,/,q{");
1658 if (preambleav == NULL)
1659 preambleav = newAV();
1660 av_push(preambleav, sv);
1663 croak("No space allowed after -%c", *(s-1));
1680 croak("Too late for \"-T\" option");
1692 #if defined(SUBVERSION) && SUBVERSION > 0
1693 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1694 PATCHLEVEL, SUBVERSION, ARCHNAME);
1696 printf("\nThis is perl, version %s built for %s",
1697 patchlevel, ARCHNAME);
1699 #if defined(LOCAL_PATCH_COUNT)
1700 if (LOCAL_PATCH_COUNT > 0)
1701 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1702 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1705 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1707 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1710 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1713 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1714 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1717 printf("atariST series port, ++jrb bammi@cadence.com\n");
1720 Perl may be copied only under the terms of either the Artistic License or the\n\
1721 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1729 if (s[1] == '-') /* Additional switches on #! line. */
1737 #ifdef ALTERNATE_SHEBANG
1738 case 'S': /* OS/2 needs -S on "extproc" line. */
1746 croak("Can't emulate -%.1s on #! line",s);
1751 /* compliments of Tom Christiansen */
1753 /* unexec() can be found in the Gnu emacs distribution */
1764 prog = newSVpv(BIN_EXP);
1765 sv_catpv(prog, "/perl");
1766 file = newSVpv(origfilename);
1767 sv_catpv(file, ".perldump");
1769 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1771 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1772 SvPVX(prog), SvPVX(file));
1776 # include <lib$routines.h>
1777 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1779 ABORT(); /* for use with undump */
1790 /* Note that strtab is a rather special HV. Assumptions are made
1791 about not iterating on it, and not adding tie magic to it.
1792 It is properly deallocated in perl_destruct() */
1794 HvSHAREKEYS_off(strtab); /* mandatory */
1795 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1796 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1798 curstash = defstash = newHV();
1799 curstname = newSVpv("main",4);
1800 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1801 SvREFCNT_dec(GvHV(gv));
1802 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1804 HvNAME(defstash) = savepv("main");
1805 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1807 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1808 errsv = newSVpv("", 0);
1810 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1811 sv_grow(errsv, 240); /* Preallocate - for immediate signals. */
1812 sv_setpvn(errsv, "", 0);
1813 curstash = defstash;
1814 compiling.cop_stash = defstash;
1815 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1816 /* We must init $/ before switches are processed. */
1817 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1820 #ifdef CAN_PROTOTYPE
1822 open_script(char *scriptname, bool dosearch, SV *sv)
1825 open_script(scriptname,dosearch,sv)
1832 char *xfound = Nullch;
1833 char *xfailed = Nullch;
1837 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1838 # define SEARCH_EXTS ".bat", ".cmd", NULL
1839 # define MAX_EXT_LEN 4
1842 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1843 # define MAX_EXT_LEN 4
1846 # define SEARCH_EXTS ".pl", ".com", NULL
1847 # define MAX_EXT_LEN 4
1849 /* additional extensions to try in each dir if scriptname not found */
1851 char *ext[] = { SEARCH_EXTS };
1852 int extidx = 0, i = 0;
1853 char *curext = Nullch;
1855 # define MAX_EXT_LEN 0
1859 * If dosearch is true and if scriptname does not contain path
1860 * delimiters, search the PATH for scriptname.
1862 * If SEARCH_EXTS is also defined, will look for each
1863 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1864 * while searching the PATH.
1866 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1867 * proceeds as follows:
1869 * + look for ./scriptname{,.foo,.bar}
1870 * + search the PATH for scriptname{,.foo,.bar}
1873 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1874 * this will not look in '.' if it's not in the PATH)
1879 int hasdir, idx = 0, deftypes = 1;
1882 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1883 /* The first time through, just add SEARCH_EXTS to whatever we
1884 * already have, so we can check for default file types. */
1886 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1892 if ((strlen(tokenbuf) + strlen(scriptname)
1893 + MAX_EXT_LEN) >= sizeof tokenbuf)
1894 continue; /* don't search dir with too-long name */
1895 strcat(tokenbuf, scriptname);
1899 if (strEQ(scriptname, "-"))
1901 if (dosearch) { /* Look in '.' first. */
1902 char *cur = scriptname;
1904 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1906 if (strEQ(ext[i++],curext)) {
1907 extidx = -1; /* already has an ext */
1912 DEBUG_p(PerlIO_printf(Perl_debug_log,
1913 "Looking for %s\n",cur));
1914 if (Stat(cur,&statbuf) >= 0) {
1922 if (cur == scriptname) {
1923 len = strlen(scriptname);
1924 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1926 cur = strcpy(tokenbuf, scriptname);
1928 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1929 && strcpy(tokenbuf+len, ext[extidx++]));
1934 if (dosearch && !strchr(scriptname, '/')
1936 && !strchr(scriptname, '\\')
1938 && (s = getenv("PATH"))) {
1941 bufend = s + strlen(s);
1942 while (s < bufend) {
1943 #if defined(atarist) || defined(DOSISH)
1948 && *s != ';'; len++, s++) {
1949 if (len < sizeof tokenbuf)
1952 if (len < sizeof tokenbuf)
1953 tokenbuf[len] = '\0';
1954 #else /* ! (atarist || DOSISH) */
1955 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1958 #endif /* ! (atarist || DOSISH) */
1961 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1962 continue; /* don't search dir with too-long name */
1964 #if defined(atarist) || defined(DOSISH)
1965 && tokenbuf[len - 1] != '/'
1966 && tokenbuf[len - 1] != '\\'
1969 tokenbuf[len++] = '/';
1970 if (len == 2 && tokenbuf[0] == '.')
1972 (void)strcpy(tokenbuf + len, scriptname);
1976 len = strlen(tokenbuf);
1977 if (extidx > 0) /* reset after previous loop */
1981 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1982 retval = Stat(tokenbuf,&statbuf);
1984 } while ( retval < 0 /* not there */
1985 && extidx>=0 && ext[extidx] /* try an extension? */
1986 && strcpy(tokenbuf+len, ext[extidx++])
1991 if (S_ISREG(statbuf.st_mode)
1992 && cando(S_IRUSR,TRUE,&statbuf)
1994 && cando(S_IXUSR,TRUE,&statbuf)
1998 xfound = tokenbuf; /* bingo! */
2002 xfailed = savepv(tokenbuf);
2005 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
2007 seen_dot = 1; /* Disable message. */
2009 croak("Can't %s %s%s%s",
2010 (xfailed ? "execute" : "find"),
2011 (xfailed ? xfailed : scriptname),
2012 (xfailed ? "" : " on PATH"),
2013 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
2016 scriptname = xfound;
2019 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2020 char *s = scriptname + 8;
2029 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2030 curcop->cop_filegv = gv_fetchfile(origfilename);
2031 if (strEQ(origfilename,"-"))
2033 if (fdscript >= 0) {
2034 rsfp = PerlIO_fdopen(fdscript,"r");
2035 #if defined(HAS_FCNTL) && defined(F_SETFD)
2037 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2040 else if (preprocess) {
2041 char *cpp_cfg = CPPSTDIN;
2042 SV *cpp = NEWSV(0,0);
2043 SV *cmd = NEWSV(0,0);
2045 if (strEQ(cpp_cfg, "cppstdin"))
2046 sv_catpvf(cpp, "%s/", BIN_EXP);
2047 sv_catpv(cpp, cpp_cfg);
2050 sv_catpv(sv,PRIVLIB_EXP);
2054 sed %s -e \"/^[^#]/b\" \
2055 -e \"/^#[ ]*include[ ]/b\" \
2056 -e \"/^#[ ]*define[ ]/b\" \
2057 -e \"/^#[ ]*if[ ]/b\" \
2058 -e \"/^#[ ]*ifdef[ ]/b\" \
2059 -e \"/^#[ ]*ifndef[ ]/b\" \
2060 -e \"/^#[ ]*else/b\" \
2061 -e \"/^#[ ]*elif[ ]/b\" \
2062 -e \"/^#[ ]*undef[ ]/b\" \
2063 -e \"/^#[ ]*endif/b\" \
2066 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2069 %s %s -e '/^[^#]/b' \
2070 -e '/^#[ ]*include[ ]/b' \
2071 -e '/^#[ ]*define[ ]/b' \
2072 -e '/^#[ ]*if[ ]/b' \
2073 -e '/^#[ ]*ifdef[ ]/b' \
2074 -e '/^#[ ]*ifndef[ ]/b' \
2075 -e '/^#[ ]*else/b' \
2076 -e '/^#[ ]*elif[ ]/b' \
2077 -e '/^#[ ]*undef[ ]/b' \
2078 -e '/^#[ ]*endif/b' \
2086 (doextract ? "-e '1,/^#/d\n'" : ""),
2088 scriptname, cpp, sv, CPPMINUS);
2090 #ifdef IAMSUID /* actually, this is caught earlier */
2091 if (euid != uid && !euid) { /* if running suidperl */
2093 (void)seteuid(uid); /* musn't stay setuid root */
2096 (void)setreuid((Uid_t)-1, uid);
2098 #ifdef HAS_SETRESUID
2099 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2105 if (geteuid() != uid)
2106 croak("Can't do seteuid!\n");
2108 #endif /* IAMSUID */
2109 rsfp = my_popen(SvPVX(cmd), "r");
2113 else if (!*scriptname) {
2114 forbid_setid("program input from stdin");
2115 rsfp = PerlIO_stdin();
2118 rsfp = PerlIO_open(scriptname,"r");
2119 #if defined(HAS_FCNTL) && defined(F_SETFD)
2121 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2129 #ifndef IAMSUID /* in case script is not readable before setuid */
2130 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2131 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2133 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2134 croak("Can't do setuid\n");
2138 croak("Can't open perl script \"%s\": %s\n",
2139 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2144 validate_suid(validarg, scriptname)
2150 /* do we need to emulate setuid on scripts? */
2152 /* This code is for those BSD systems that have setuid #! scripts disabled
2153 * in the kernel because of a security problem. Merely defining DOSUID
2154 * in perl will not fix that problem, but if you have disabled setuid
2155 * scripts in the kernel, this will attempt to emulate setuid and setgid
2156 * on scripts that have those now-otherwise-useless bits set. The setuid
2157 * root version must be called suidperl or sperlN.NNN. If regular perl
2158 * discovers that it has opened a setuid script, it calls suidperl with
2159 * the same argv that it had. If suidperl finds that the script it has
2160 * just opened is NOT setuid root, it sets the effective uid back to the
2161 * uid. We don't just make perl setuid root because that loses the
2162 * effective uid we had before invoking perl, if it was different from the
2165 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2166 * be defined in suidperl only. suidperl must be setuid root. The
2167 * Configure script will set this up for you if you want it.
2174 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2175 croak("Can't stat script \"%s\"",origfilename);
2176 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2180 #ifndef HAS_SETREUID
2181 /* On this access check to make sure the directories are readable,
2182 * there is actually a small window that the user could use to make
2183 * filename point to an accessible directory. So there is a faint
2184 * chance that someone could execute a setuid script down in a
2185 * non-accessible directory. I don't know what to do about that.
2186 * But I don't think it's too important. The manual lies when
2187 * it says access() is useful in setuid programs.
2189 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2190 croak("Permission denied");
2192 /* If we can swap euid and uid, then we can determine access rights
2193 * with a simple stat of the file, and then compare device and
2194 * inode to make sure we did stat() on the same file we opened.
2195 * Then we just have to make sure he or she can execute it.
2198 struct stat tmpstatbuf;
2202 setreuid(euid,uid) < 0
2205 setresuid(euid,uid,(Uid_t)-1) < 0
2208 || getuid() != euid || geteuid() != uid)
2209 croak("Can't swap uid and euid"); /* really paranoid */
2210 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2211 croak("Permission denied"); /* testing full pathname here */
2212 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2213 tmpstatbuf.st_ino != statbuf.st_ino) {
2214 (void)PerlIO_close(rsfp);
2215 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2217 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2218 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2219 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2220 (long)statbuf.st_dev, (long)statbuf.st_ino,
2221 SvPVX(GvSV(curcop->cop_filegv)),
2222 (long)statbuf.st_uid, (long)statbuf.st_gid);
2223 (void)my_pclose(rsfp);
2225 croak("Permission denied\n");
2229 setreuid(uid,euid) < 0
2231 # if defined(HAS_SETRESUID)
2232 setresuid(uid,euid,(Uid_t)-1) < 0
2235 || getuid() != uid || geteuid() != euid)
2236 croak("Can't reswap uid and euid");
2237 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2238 croak("Permission denied\n");
2240 #endif /* HAS_SETREUID */
2241 #endif /* IAMSUID */
2243 if (!S_ISREG(statbuf.st_mode))
2244 croak("Permission denied");
2245 if (statbuf.st_mode & S_IWOTH)
2246 croak("Setuid/gid script is writable by world");
2247 doswitches = FALSE; /* -s is insecure in suid */
2249 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2250 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2251 croak("No #! line");
2252 s = SvPV(linestr,na)+2;
2254 while (!isSPACE(*s)) s++;
2255 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2256 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2257 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2258 croak("Not a perl script");
2259 while (*s == ' ' || *s == '\t') s++;
2261 * #! arg must be what we saw above. They can invoke it by
2262 * mentioning suidperl explicitly, but they may not add any strange
2263 * arguments beyond what #! says if they do invoke suidperl that way.
2265 len = strlen(validarg);
2266 if (strEQ(validarg," PHOOEY ") ||
2267 strnNE(s,validarg,len) || !isSPACE(s[len]))
2268 croak("Args must match #! line");
2271 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2272 euid == statbuf.st_uid)
2274 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2275 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2276 #endif /* IAMSUID */
2278 if (euid) { /* oops, we're not the setuid root perl */
2279 (void)PerlIO_close(rsfp);
2282 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2284 croak("Can't do setuid\n");
2287 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2289 (void)setegid(statbuf.st_gid);
2292 (void)setregid((Gid_t)-1,statbuf.st_gid);
2294 #ifdef HAS_SETRESGID
2295 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2297 setgid(statbuf.st_gid);
2301 if (getegid() != statbuf.st_gid)
2302 croak("Can't do setegid!\n");
2304 if (statbuf.st_mode & S_ISUID) {
2305 if (statbuf.st_uid != euid)
2307 (void)seteuid(statbuf.st_uid); /* all that for this */
2310 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2312 #ifdef HAS_SETRESUID
2313 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2315 setuid(statbuf.st_uid);
2319 if (geteuid() != statbuf.st_uid)
2320 croak("Can't do seteuid!\n");
2322 else if (uid) { /* oops, mustn't run as root */
2324 (void)seteuid((Uid_t)uid);
2327 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2329 #ifdef HAS_SETRESUID
2330 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2336 if (geteuid() != uid)
2337 croak("Can't do seteuid!\n");
2340 if (!cando(S_IXUSR,TRUE,&statbuf))
2341 croak("Permission denied\n"); /* they can't do this */
2344 else if (preprocess)
2345 croak("-P not allowed for setuid/setgid script\n");
2346 else if (fdscript >= 0)
2347 croak("fd script not allowed in suidperl\n");
2349 croak("Script is not setuid/setgid in suidperl\n");
2351 /* We absolutely must clear out any saved ids here, so we */
2352 /* exec the real perl, substituting fd script for scriptname. */
2353 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2354 PerlIO_rewind(rsfp);
2355 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2356 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2357 if (!origargv[which])
2358 croak("Permission denied");
2359 origargv[which] = savepv(form("/dev/fd/%d/%s",
2360 PerlIO_fileno(rsfp), origargv[which]));
2361 #if defined(HAS_FCNTL) && defined(F_SETFD)
2362 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2364 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2365 croak("Can't do setuid\n");
2366 #endif /* IAMSUID */
2368 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2369 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2371 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2372 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2374 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2377 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2378 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2379 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2380 /* not set-id, must be wrapped */
2388 register char *s, *s2;
2390 /* skip forward in input to the real script? */
2394 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2395 croak("No Perl script found in input\n");
2396 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2397 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2399 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2401 while (*s == ' ' || *s == '\t') s++;
2403 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2404 if (strnEQ(s2-4,"perl",4))
2406 while (s = moreswitches(s)) ;
2408 if (cddir && chdir(cddir) < 0)
2409 croak("Can't chdir to %s",cddir);
2417 uid = (int)getuid();
2418 euid = (int)geteuid();
2419 gid = (int)getgid();
2420 egid = (int)getegid();
2425 tainting |= (uid && (euid != uid || egid != gid));
2433 croak("No %s allowed while running setuid", s);
2435 croak("No %s allowed while running setgid", s);
2442 curstash = debstash;
2443 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2445 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2446 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2447 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2448 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2449 sv_setiv(DBsingle, 0);
2450 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2451 sv_setiv(DBtrace, 0);
2452 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2453 sv_setiv(DBsignal, 0);
2454 curstash = defstash;
2462 mainstack = curstack; /* remember in case we switch stacks */
2463 AvREAL_off(curstack); /* not a real array */
2464 av_extend(curstack,127);
2466 stack_base = AvARRAY(curstack);
2467 stack_sp = stack_base;
2468 stack_max = stack_base + 127;
2470 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2471 New(50,cxstack,cxstack_max + 1,CONTEXT);
2474 New(50,tmps_stack,128,SV*);
2480 * The following stacks almost certainly should be per-interpreter,
2481 * but for now they're not. XXX
2485 markstack_ptr = markstack;
2487 New(54,markstack,64,I32);
2488 markstack_ptr = markstack;
2489 markstack_max = markstack + 64;
2495 New(54,scopestack,32,I32);
2497 scopestack_max = 32;
2503 New(54,savestack,128,ANY);
2505 savestack_max = 128;
2511 New(54,retstack,16,OP*);
2522 Safefree(tmps_stack);
2529 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2538 subname = newSVpv("main",4);
2542 init_predump_symbols()
2549 sv_setpvn(*av_fetch(thr->specific,find_thread_magical("\""),TRUE), " ", 1);
2551 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2552 #endif /* USE_THREADS */
2554 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2555 GvMULTI_on(stdingv);
2556 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2557 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2559 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2561 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2563 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2565 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2567 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2569 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2570 GvMULTI_on(othergv);
2571 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2572 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2574 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2576 statname = NEWSV(66,0); /* last filename we did stat on */
2579 osname = savepv(OSNAME);
2583 init_postdump_symbols(argc,argv,env)
2585 register char **argv;
2586 register char **env;
2593 argc--,argv++; /* skip name of script */
2595 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2598 if (argv[0][1] == '-') {
2602 if (s = strchr(argv[0], '=')) {
2604 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2607 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2610 toptarget = NEWSV(0,0);
2611 sv_upgrade(toptarget, SVt_PVFM);
2612 sv_setpvn(toptarget, "", 0);
2613 bodytarget = NEWSV(0,0);
2614 sv_upgrade(bodytarget, SVt_PVFM);
2615 sv_setpvn(bodytarget, "", 0);
2616 formtarget = bodytarget;
2619 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2620 sv_setpv(GvSV(tmpgv),origfilename);
2621 magicname("0", "0", 1);
2623 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2624 sv_setpv(GvSV(tmpgv),origargv[0]);
2625 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2627 (void)gv_AVadd(argvgv);
2628 av_clear(GvAVn(argvgv));
2629 for (; argc > 0; argc--,argv++) {
2630 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2633 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2637 hv_magic(hv, envgv, 'E');
2638 #ifndef VMS /* VMS doesn't have environ array */
2639 /* Note that if the supplied env parameter is actually a copy
2640 of the global environ then it may now point to free'd memory
2641 if the environment has been modified since. To avoid this
2642 problem we treat env==NULL as meaning 'use the default'
2647 environ[0] = Nullch;
2648 for (; *env; env++) {
2649 if (!(s = strchr(*env,'=')))
2655 sv = newSVpv(s--,0);
2656 (void)hv_store(hv, *env, s - *env, sv, 0);
2658 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2659 /* Sins of the RTL. See note in my_setenv(). */
2660 (void)putenv(savepv(*env));
2664 #ifdef DYNAMIC_ENV_FETCH
2665 HvNAME(hv) = savepv(ENV_HV_NAME);
2669 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2670 sv_setiv(GvSV(tmpgv), (IV)getpid());
2679 s = getenv("PERL5LIB");
2683 incpush(getenv("PERLLIB"), FALSE);
2685 /* Treat PERL5?LIB as a possible search list logical name -- the
2686 * "natural" VMS idiom for a Unix path string. We allow each
2687 * element to be a set of |-separated directories for compatibility.
2691 if (my_trnlnm("PERL5LIB",buf,0))
2692 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2694 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2698 /* Use the ~-expanded versions of APPLLIB (undocumented),
2699 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2702 incpush(APPLLIB_EXP, FALSE);
2706 incpush(ARCHLIB_EXP, FALSE);
2709 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2711 incpush(PRIVLIB_EXP, FALSE);
2714 incpush(SITEARCH_EXP, FALSE);
2717 incpush(SITELIB_EXP, FALSE);
2719 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2720 incpush(OLDARCHLIB_EXP, FALSE);
2724 incpush(".", FALSE);
2728 # define PERLLIB_SEP ';'
2731 # define PERLLIB_SEP '|'
2733 # define PERLLIB_SEP ':'
2736 #ifndef PERLLIB_MANGLE
2737 # define PERLLIB_MANGLE(s,n) (s)
2741 incpush(p, addsubdirs)
2745 SV *subdir = Nullsv;
2746 static char *archpat_auto;
2753 if (!archpat_auto) {
2754 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2755 + sizeof("//auto"));
2756 New(55, archpat_auto, len, char);
2757 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2759 for (len = sizeof(ARCHNAME) + 2;
2760 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2761 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2766 /* Break at all separators */
2768 SV *libdir = newSV(0);
2771 /* skip any consecutive separators */
2772 while ( *p == PERLLIB_SEP ) {
2773 /* Uncomment the next line for PATH semantics */
2774 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2778 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2779 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2784 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2785 p = Nullch; /* break out */
2789 * BEFORE pushing libdir onto @INC we may first push version- and
2790 * archname-specific sub-directories.
2793 struct stat tmpstatbuf;
2798 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2800 while (unix[len-1] == '/') len--; /* Cosmetic */
2801 sv_usepvn(libdir,unix,len);
2804 PerlIO_printf(PerlIO_stderr(),
2805 "Failed to unixify @INC element \"%s\"\n",
2808 /* .../archname/version if -d .../archname/version/auto */
2809 sv_setsv(subdir, libdir);
2810 sv_catpv(subdir, archpat_auto);
2811 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2812 S_ISDIR(tmpstatbuf.st_mode))
2813 av_push(GvAVn(incgv),
2814 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2816 /* .../archname if -d .../archname/auto */
2817 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2818 strlen(patchlevel) + 1, "", 0);
2819 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2820 S_ISDIR(tmpstatbuf.st_mode))
2821 av_push(GvAVn(incgv),
2822 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2825 /* finally push this lib directory on the end of @INC */
2826 av_push(GvAVn(incgv), libdir);
2829 SvREFCNT_dec(subdir);
2833 call_list(oldscope, list)
2838 line_t oldline = curcop->cop_line;
2843 while (AvFILL(list) >= 0) {
2844 CV *cv = (CV*)av_shift(list);
2851 SV* atsv = sv_mortalcopy(errsv);
2853 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2854 (void)SvPV(atsv, len);
2857 curcop = &compiling;
2858 curcop->cop_line = oldline;
2859 if (list == beginav)
2860 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2862 sv_catpv(atsv, "END failed--cleanup aborted");
2863 while (scopestack_ix > oldscope)
2865 croak("%s", SvPVX(atsv));
2873 /* my_exit() was called */
2874 while (scopestack_ix > oldscope)
2877 curstash = defstash;
2879 call_list(oldscope, endav);
2881 curcop = &compiling;
2882 curcop->cop_line = oldline;
2884 if (list == beginav)
2885 croak("BEGIN failed--compilation aborted");
2887 croak("END failed--cleanup aborted");
2893 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2898 curcop = &compiling;
2899 curcop->cop_line = oldline;
2913 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2914 thr, (unsigned long) status));
2915 #endif /* USE_THREADS */
2924 STATUS_NATIVE_SET(status);
2934 if (vaxc$errno & 1) {
2935 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2936 STATUS_NATIVE_SET(44);
2939 if (!vaxc$errno && errno) /* unlikely */
2940 STATUS_NATIVE_SET(44);
2942 STATUS_NATIVE_SET(vaxc$errno);
2946 STATUS_POSIX_SET(errno);
2947 else if (STATUS_POSIX == 0)
2948 STATUS_POSIX_SET(255);
2957 register CONTEXT *cx;
2966 (void)UNLINK(e_tmpname);
2967 Safefree(e_tmpname);
2971 if (cxstack_ix >= 0) {