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;
110 #if defined(USE_THREADS) && !defined(FAKE_THREADS)
114 if (!(curinterp = sv_interp))
118 Zero(sv_interp, 1, PerlInterpreter);
121 /* Init the real globals (and main thread)? */
125 Newz(53, thr, 1, struct thread);
126 MUTEX_INIT(&malloc_mutex);
127 MUTEX_INIT(&sv_mutex);
128 MUTEX_INIT(&eval_mutex);
129 COND_INIT(&eval_cond);
130 MUTEX_INIT(&threads_mutex);
131 COND_INIT(&nthreads_cond);
135 thr->flags = THRf_R_JOINABLE;
136 MUTEX_INIT(&thr->mutex);
140 #ifdef HAVE_THREAD_INTERN
141 init_thread_intern(thr);
144 DuplicateHandle(GetCurrentProcess(),
150 DUPLICATE_SAME_ACCESS);
151 if ((thr_key = TlsAlloc()) == TLS_OUT_OF_INDEXES)
152 croak("panic: pthread_key_create");
153 if (TlsSetValue(thr_key, (LPVOID) thr) != TRUE)
154 croak("panic: pthread_setspecific");
156 self = pthread_self();
157 if (pthread_key_create(&thr_key, 0))
158 croak("panic: pthread_key_create");
159 if (pthread_setspecific(thr_key, (void *) thr))
160 croak("panic: pthread_setspecific");
162 #endif /* FAKE_THREADS */
163 #endif /* USE_THREADS */
165 linestr = NEWSV(65,80);
166 sv_upgrade(linestr,SVt_PVIV);
168 if (!SvREADONLY(&sv_undef)) {
169 SvREADONLY_on(&sv_undef);
173 SvREADONLY_on(&sv_no);
175 sv_setpv(&sv_yes,Yes);
177 SvREADONLY_on(&sv_yes);
180 nrs = newSVpv("\n", 1);
181 rs = SvREFCNT_inc(nrs);
183 sighandlerp = sighandler;
188 * There is no way we can refer to them from Perl so close them to save
189 * space. The other alternative would be to provide STDAUX and STDPRN
192 (void)fclose(stdaux);
193 (void)fclose(stdprn);
199 perl_destruct_level = 1;
201 if(perl_destruct_level > 0)
207 start_env.je_prev = NULL;
208 start_env.je_ret = -1;
209 start_env.je_mustcatch = TRUE;
210 top_env = &start_env;
213 SET_NUMERIC_STANDARD();
214 #if defined(SUBVERSION) && SUBVERSION > 0
215 sprintf(patchlevel, "%7.5f", (double) 5
216 + ((double) PATCHLEVEL / (double) 1000)
217 + ((double) SUBVERSION / (double) 100000));
219 sprintf(patchlevel, "%5.3f", (double) 5 +
220 ((double) PATCHLEVEL / (double) 1000));
223 #if defined(LOCAL_PATCH_COUNT)
224 localpatches = local_patches; /* For possible -v */
227 PerlIO_init(); /* Hook to IO system */
229 fdpid = newAV(); /* for remembering popen pids by fd */
233 New(51,debname,128,char);
234 New(52,debdelim,128,char);
241 perl_destruct(sv_interp)
242 register PerlInterpreter *sv_interp;
245 int destruct_level; /* 0=none, 1=full, 2=full with checks */
250 if (!(curinterp = sv_interp))
255 /* Join with any remaining non-detached threads */
256 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
257 "perl_destruct: waiting for %d threads...\n",
259 for (t = thr->next; t != thr; t = t->next) {
260 MUTEX_LOCK(&threads_mutex);
261 MUTEX_LOCK(&t->mutex);
262 switch (ThrSTATE(t)) {
265 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
266 "perl_destruct: joining zombie %p\n", t));
267 ThrSETSTATE(t, THRf_DEAD);
268 MUTEX_UNLOCK(&t->mutex);
270 MUTEX_UNLOCK(&threads_mutex);
272 if ((WaitForSingleObject(t->Tself,INFINITE) == WAIT_FAILED)
273 || (GetExitCodeThread(t->Tself,(LPDWORD)&av) == 0))
275 if (pthread_join(t->Tself, (void**)&av))
277 croak("panic: pthread_join failed during global destruction");
278 SvREFCNT_dec((SV*)av);
279 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
280 "perl_destruct: joined zombie %p OK\n", t));
282 case THRf_R_JOINABLE:
283 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
284 "perl_destruct: detaching thread %p\n", t));
285 ThrSETSTATE(t, THRf_R_DETACHED);
287 * We unlock threads_mutex and t->mutex in the opposite order
288 * from which we locked them just so that DETACH won't
289 * deadlock if it panics. It's only a breach of good style
290 * not a bug since they are unlocks not locks.
292 MUTEX_UNLOCK(&threads_mutex);
294 MUTEX_UNLOCK(&t->mutex);
297 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
298 "perl_destruct: ignoring %p (state %u)\n",
300 MUTEX_UNLOCK(&t->mutex);
301 MUTEX_UNLOCK(&threads_mutex);
302 /* fall through and out */
305 MUTEX_LOCK(&threads_mutex);
306 /* Now wait for the thread count nthreads to drop to one */
309 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
310 "perl_destruct: final wait for %d threads\n",
312 COND_WAIT(&nthreads_cond, &threads_mutex);
314 /* At this point, we're the last thread */
315 MUTEX_UNLOCK(&threads_mutex);
316 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
317 MUTEX_DESTROY(&threads_mutex);
318 COND_DESTROY(&nthreads_cond);
319 #endif /* !defined(FAKE_THREADS) */
320 #endif /* USE_THREADS */
322 destruct_level = perl_destruct_level;
326 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
328 if (destruct_level < i)
337 /* We must account for everything. */
339 /* Destroy the main CV and syntax tree */
341 curpad = AvARRAY(comppad);
346 SvREFCNT_dec(main_cv);
351 * Try to destruct global references. We do this first so that the
352 * destructors and destructees still exist. Some sv's might remain.
353 * Non-referenced objects are on their own.
360 /* unhook hooks which will soon be, or use, destroyed data */
361 SvREFCNT_dec(warnhook);
363 SvREFCNT_dec(diehook);
365 SvREFCNT_dec(parsehook);
368 if (destruct_level == 0){
370 DEBUG_P(debprofdump());
372 /* The exit() function will do everything that needs doing. */
376 /* loosen bonds of global variables */
379 (void)PerlIO_close(rsfp);
383 /* Filters for program text */
384 SvREFCNT_dec(rsfp_filters);
385 rsfp_filters = Nullav;
397 sawampersand = FALSE; /* must save all match strings */
398 sawstudy = FALSE; /* do fbm_instr on all strings */
413 /* magical thingies */
415 Safefree(ofs); /* $, */
418 Safefree(ors); /* $\ */
421 SvREFCNT_dec(nrs); /* $\ helper */
424 multiline = 0; /* $* */
426 SvREFCNT_dec(statname);
430 /* defgv, aka *_ should be taken care of elsewhere */
432 #if 0 /* just about all regexp stuff, seems to be ok */
434 /* shortcuts to regexp stuff */
439 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
441 regprecomp = NULL; /* uncompiled string. */
442 regparse = NULL; /* Input-scan pointer. */
443 regxend = NULL; /* End of input for compile */
444 regnpar = 0; /* () count. */
445 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
446 regsize = 0; /* Code size. */
447 regnaughty = 0; /* How bad is this pattern? */
448 regsawback = 0; /* Did we see \1, ...? */
450 reginput = NULL; /* String-input pointer. */
451 regbol = NULL; /* Beginning of input, for ^ check. */
452 regeol = NULL; /* End of input, for $ check. */
453 regstartp = (char **)NULL; /* Pointer to startp array. */
454 regendp = (char **)NULL; /* Ditto for endp. */
455 reglastparen = 0; /* Similarly for lastparen. */
456 regtill = NULL; /* How far we are required to go. */
457 regflags = 0; /* are we folding, multilining? */
458 regprev = (char)NULL; /* char before regbol, \n if none */
462 /* clean up after study() */
463 SvREFCNT_dec(lastscream);
465 Safefree(screamfirst);
467 Safefree(screamnext);
470 /* startup and shutdown function lists */
471 SvREFCNT_dec(beginav);
473 SvREFCNT_dec(initav);
478 /* temp stack during pp_sort() */
479 SvREFCNT_dec(sortstack);
482 /* shortcuts just get cleared */
492 /* reset so print() ends up where we expect */
495 /* Prepare to destruct main symbol table. */
502 if (destruct_level >= 2) {
503 if (scopestack_ix != 0)
504 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
505 (long)scopestack_ix);
506 if (savestack_ix != 0)
507 warn("Unbalanced saves: %ld more saves than restores\n",
509 if (tmps_floor != -1)
510 warn("Unbalanced tmps: %ld more allocs than frees\n",
511 (long)tmps_floor + 1);
512 if (cxstack_ix != -1)
513 warn("Unbalanced context: %ld more PUSHes than POPs\n",
514 (long)cxstack_ix + 1);
517 /* Now absolutely destruct everything, somehow or other, loops or no. */
519 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
520 while (sv_count != 0 && sv_count != last_sv_count) {
521 last_sv_count = sv_count;
524 SvFLAGS(strtab) &= ~SVTYPEMASK;
525 SvFLAGS(strtab) |= SVt_PVHV;
527 /* Destruct the global string table. */
529 /* Yell and reset the HeVAL() slots that are still holding refcounts,
530 * so that sv_free() won't fail on them.
539 array = HvARRAY(strtab);
543 warn("Unbalanced string table refcount: (%d) for \"%s\"",
544 HeVAL(hent) - Nullsv, HeKEY(hent));
545 HeVAL(hent) = Nullsv;
555 SvREFCNT_dec(strtab);
558 warn("Scalars leaked: %ld\n", (long)sv_count);
562 /* No SVs have survived, need to clean out */
566 Safefree(origfilename);
568 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
570 DEBUG_P(debprofdump());
572 MUTEX_DESTROY(&sv_mutex);
573 MUTEX_DESTROY(&malloc_mutex);
574 MUTEX_DESTROY(&eval_mutex);
575 COND_DESTROY(&eval_cond);
576 #endif /* USE_THREADS */
578 /* As the absolutely last thing, free the non-arena SV for mess() */
581 /* we know that type >= SVt_PV */
583 Safefree(SvPVX(mess_sv));
584 Safefree(SvANY(mess_sv));
592 PerlInterpreter *sv_interp;
594 if (!(curinterp = sv_interp))
600 perl_parse(sv_interp, xsinit, argc, argv, env)
601 PerlInterpreter *sv_interp;
602 void (*xsinit)_((void));
610 char *scriptname = NULL;
611 VOL bool dosearch = FALSE;
618 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
621 croak("suidperl is no longer needed since the kernel can now execute\n\
622 setuid perl scripts securely.\n");
626 if (!(curinterp = sv_interp))
629 #if defined(NeXT) && defined(__DYNAMIC__)
630 _dyld_lookup_and_bind
631 ("__environ", (unsigned long *) &environ_pointer, NULL);
636 #ifndef VMS /* VMS doesn't have environ array */
637 origenviron = environ;
643 /* Come here if running an undumped a.out. */
645 origfilename = savepv(argv[0]);
647 cxstack_ix = -1; /* start label stack again */
649 init_postdump_symbols(argc,argv,env);
654 curpad = AvARRAY(comppad);
659 SvREFCNT_dec(main_cv);
663 oldscope = scopestack_ix;
671 /* my_exit() was called */
672 while (scopestack_ix > oldscope)
677 call_list(oldscope, endav);
679 return STATUS_NATIVE_EXPORT;
682 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
686 sv_setpvn(linestr,"",0);
687 sv = newSVpv("",0); /* first used for -I flags */
691 for (argc--,argv++; argc > 0; argc--,argv++) {
692 if (argv[0][0] != '-' || !argv[0][1])
696 validarg = " PHOOEY ";
721 if (s = moreswitches(s))
731 if (euid != uid || egid != gid)
732 croak("No -e allowed in setuid scripts");
734 e_tmpname = savepv(TMPPATH);
735 (void)mktemp(e_tmpname);
737 croak("Can't mktemp()");
738 e_fp = PerlIO_open(e_tmpname,"w");
740 croak("Cannot open temporary file");
745 PerlIO_puts(e_fp,argv[1]);
749 croak("No code specified for -e");
750 (void)PerlIO_putc(e_fp,'\n');
761 incpush(argv[1], TRUE);
762 sv_catpv(sv,argv[1]);
779 preambleav = newAV();
780 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
782 Sv = newSVpv("print myconfig();",0);
784 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
786 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
788 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
789 sv_catpv(Sv,"\" Compile-time options:");
791 sv_catpv(Sv," DEBUGGING");
794 sv_catpv(Sv," NO_EMBED");
797 sv_catpv(Sv," MULTIPLICITY");
799 sv_catpv(Sv,"\\n\",");
801 #if defined(LOCAL_PATCH_COUNT)
802 if (LOCAL_PATCH_COUNT > 0) {
804 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
805 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
807 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
811 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
814 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
816 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
821 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
822 print \" \\%ENV:\\n @env\\n\" if @env; \
823 print \" \\@INC:\\n @INC\\n\";");
826 Sv = newSVpv("config_vars(qw(",0);
831 av_push(preambleav, Sv);
832 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
841 if (*++s) { /* catch use of gnu style long options */
842 if (strEQ(s, "version")) {
846 if (strEQ(s, "help")) {
850 croak("Unrecognized switch: --%s (-h will show valid options)",s);
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);
975 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
987 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
988 dump_mstats("after compilation:");
999 PerlInterpreter *sv_interp;
1006 if (!(curinterp = sv_interp))
1009 oldscope = scopestack_ix;
1014 cxstack_ix = -1; /* start context stack again */
1017 /* my_exit() was called */
1018 while (scopestack_ix > oldscope)
1021 curstash = defstash;
1023 call_list(oldscope, endav);
1025 if (getenv("PERL_DEBUG_MSTATS"))
1026 dump_mstats("after execution: ");
1029 return STATUS_NATIVE_EXPORT;
1032 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1037 if (curstack != mainstack) {
1039 SWITCHSTACK(curstack, mainstack);
1044 DEBUG_r(PerlIO_printf(PerlIO_stderr(), "%s $` $& $' support.\n",
1045 sawampersand ? "Enabling" : "Omitting"));
1048 DEBUG_x(dump_all());
1049 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1051 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1052 (unsigned long) thr));
1053 #endif /* USE_THREADS */
1056 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1059 if (PERLDB_SINGLE && DBsingle)
1060 sv_setiv(DBsingle, 1);
1062 call_list(oldscope, initav);
1072 else if (main_start) {
1073 CvDEPTH(main_cv) = 1;
1084 perl_get_sv(name, create)
1088 GV* gv = gv_fetchpv(name, create, SVt_PV);
1095 perl_get_av(name, create)
1099 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1108 perl_get_hv(name, create)
1112 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1121 perl_get_cv(name, create)
1125 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1126 if (create && !GvCVu(gv))
1127 return newSUB(start_subparse(FALSE, 0),
1128 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1136 /* Be sure to refetch the stack pointer after calling these routines. */
1139 perl_call_argv(subname, flags, argv)
1141 I32 flags; /* See G_* flags in cop.h */
1142 register char **argv; /* null terminated arg list */
1150 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1155 return perl_call_pv(subname, flags);
1159 perl_call_pv(subname, flags)
1160 char *subname; /* name of the subroutine */
1161 I32 flags; /* See G_* flags in cop.h */
1163 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1167 perl_call_method(methname, flags)
1168 char *methname; /* name of the subroutine */
1169 I32 flags; /* See G_* flags in cop.h */
1176 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1179 return perl_call_sv(*stack_sp--, flags);
1182 /* May be called with any of a CV, a GV, or an SV containing the name. */
1184 perl_call_sv(sv, flags)
1186 I32 flags; /* See G_* flags in cop.h */
1189 LOGOP myop; /* fake syntax tree node */
1195 bool oldcatch = CATCH_GET;
1200 if (flags & G_DISCARD) {
1205 Zero(&myop, 1, LOGOP);
1206 myop.op_next = Nullop;
1207 if (!(flags & G_NOARGS))
1208 myop.op_flags |= OPf_STACKED;
1209 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1210 (flags & G_ARRAY) ? OPf_WANT_LIST :
1215 EXTEND(stack_sp, 1);
1218 oldscope = scopestack_ix;
1220 if (PERLDB_SUB && curstash != debstash
1221 /* Handle first BEGIN of -d. */
1222 && (DBcv || (DBcv = GvCV(DBsub)))
1223 /* Try harder, since this may have been a sighandler, thus
1224 * curstash may be meaningless. */
1225 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1226 op->op_private |= OPpENTERSUB_DB;
1228 if (flags & G_EVAL) {
1229 cLOGOP->op_other = op;
1231 /* we're trying to emulate pp_entertry() here */
1233 register CONTEXT *cx;
1234 I32 gimme = GIMME_V;
1239 push_return(op->op_next);
1240 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1242 eval_root = op; /* Only needed so that goto works right. */
1245 if (flags & G_KEEPERR)
1248 sv_setpv(GvSV(errgv),"");
1260 /* my_exit() was called */
1261 curstash = defstash;
1265 croak("Callback called exit");
1274 stack_sp = stack_base + oldmark;
1275 if (flags & G_ARRAY)
1279 *++stack_sp = &sv_undef;
1287 if (op == (OP*)&myop)
1288 op = pp_entersub(ARGS);
1291 retval = stack_sp - (stack_base + oldmark);
1292 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1293 sv_setpv(GvSV(errgv),"");
1296 if (flags & G_EVAL) {
1297 if (scopestack_ix > oldscope) {
1301 register CONTEXT *cx;
1313 CATCH_SET(oldcatch);
1315 if (flags & G_DISCARD) {
1316 stack_sp = stack_base + oldmark;
1325 /* Eval a string. The G_EVAL flag is always assumed. */
1328 perl_eval_sv(sv, flags)
1330 I32 flags; /* See G_* flags in cop.h */
1333 UNOP myop; /* fake syntax tree node */
1335 I32 oldmark = sp - stack_base;
1342 if (flags & G_DISCARD) {
1350 EXTEND(stack_sp, 1);
1352 oldscope = scopestack_ix;
1354 if (!(flags & G_NOARGS))
1355 myop.op_flags = OPf_STACKED;
1356 myop.op_next = Nullop;
1357 myop.op_type = OP_ENTEREVAL;
1358 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1359 (flags & G_ARRAY) ? OPf_WANT_LIST :
1361 if (flags & G_KEEPERR)
1362 myop.op_flags |= OPf_SPECIAL;
1372 /* my_exit() was called */
1373 curstash = defstash;
1377 croak("Callback called exit");
1386 stack_sp = stack_base + oldmark;
1387 if (flags & G_ARRAY)
1391 *++stack_sp = &sv_undef;
1396 if (op == (OP*)&myop)
1397 op = pp_entereval(ARGS);
1400 retval = stack_sp - (stack_base + oldmark);
1401 if (!(flags & G_KEEPERR))
1402 sv_setpv(GvSV(errgv),"");
1406 if (flags & G_DISCARD) {
1407 stack_sp = stack_base + oldmark;
1417 perl_eval_pv(p, croak_on_error)
1423 SV* sv = newSVpv(p, 0);
1426 perl_eval_sv(sv, G_SCALAR);
1433 if (croak_on_error && SvTRUE(GvSV(errgv)))
1434 croak(SvPVx(GvSV(errgv), na));
1439 /* Require a module. */
1445 SV* sv = sv_newmortal();
1446 sv_setpv(sv, "require '");
1449 perl_eval_sv(sv, G_DISCARD);
1453 magicname(sym,name,namlen)
1460 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1461 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1465 usage(name) /* XXX move this out into a module ? */
1468 /* This message really ought to be max 23 lines.
1469 * Removed -h because the user already knows that opton. Others? */
1470 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1471 printf("\n -0[octal] specify record separator (\\0, if no argument)");
1472 printf("\n -a autosplit mode with -n or -p (splits $_ into @F)");
1473 printf("\n -c check syntax only (runs BEGIN and END blocks)");
1474 printf("\n -d[:debugger] run scripts under debugger");
1475 printf("\n -D[number/list] set debugging flags (argument is a bit mask or flags)");
1476 printf("\n -e 'command' one line of script. Several -e's allowed. Omit [programfile].");
1477 printf("\n -F/pattern/ split() pattern for autosplit (-a). The //'s are optional.");
1478 printf("\n -i[extension] edit <> files in place (make backup if extension supplied)");
1479 printf("\n -Idirectory specify @INC/#include directory (may be used more than once)");
1480 printf("\n -l[octal] enable line ending processing, specifies line terminator");
1481 printf("\n -[mM][-]module.. executes `use/no module...' before executing your script.");
1482 printf("\n -n assume 'while (<>) { ... }' loop around your script");
1483 printf("\n -p assume loop like -n but print line also like sed");
1484 printf("\n -P run script through C preprocessor before compilation");
1485 printf("\n -s enable some switch parsing for switches after script name");
1486 printf("\n -S look for the script using PATH environment variable");
1487 printf("\n -T turn on tainting checks");
1488 printf("\n -u dump core after parsing script");
1489 printf("\n -U allow unsafe operations");
1490 printf("\n -v print version number and patchlevel of perl");
1491 printf("\n -V[:variable] print perl configuration information");
1492 printf("\n -w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.");
1493 printf("\n -x[directory] strip off text before #!perl line and perhaps cd to directory\n");
1496 /* This routine handles any switches that can be given during run */
1507 rschar = scan_oct(s, 4, &numlen);
1509 if (rschar & ~((U8)~0))
1511 else if (!rschar && numlen >= 2)
1512 nrs = newSVpv("", 0);
1515 nrs = newSVpv(&ch, 1);
1520 splitstr = savepv(s + 1);
1534 if (*s == ':' || *s == '=') {
1535 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1539 perldb = PERLDB_ALL;
1546 if (isALPHA(s[1])) {
1547 static char debopts[] = "psltocPmfrxuLHXD";
1550 for (s++; *s && (d = strchr(debopts,*s)); s++)
1551 debug |= 1 << (d - debopts);
1555 for (s++; isDIGIT(*s); s++) ;
1557 debug |= 0x80000000;
1559 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1560 for (s++; isALNUM(*s); s++) ;
1570 inplace = savepv(s+1);
1572 for (s = inplace; *s && !isSPACE(*s); s++) ;
1579 for (e = s; *e && !isSPACE(*e); e++) ;
1580 p = savepvn(s, e-s);
1587 croak("No space allowed after -I");
1597 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1606 ors = SvPV(nrs, orslen);
1607 ors = savepvn(ors, orslen);
1611 forbid_setid("-M"); /* XXX ? */
1614 forbid_setid("-m"); /* XXX ? */
1619 /* -M-foo == 'no foo' */
1620 if (*s == '-') { use = "no "; ++s; }
1621 sv = newSVpv(use,0);
1623 /* We allow -M'Module qw(Foo Bar)' */
1624 while(isALNUM(*s) || *s==':') ++s;
1626 sv_catpv(sv, start);
1627 if (*(start-1) == 'm') {
1629 croak("Can't use '%c' after -mname", *s);
1630 sv_catpv( sv, " ()");
1633 sv_catpvn(sv, start, s-start);
1634 sv_catpv(sv, " split(/,/,q{");
1639 if (preambleav == NULL)
1640 preambleav = newAV();
1641 av_push(preambleav, sv);
1644 croak("No space allowed after -%c", *(s-1));
1661 croak("Too late for \"-T\" option");
1673 #if defined(SUBVERSION) && SUBVERSION > 0
1674 printf("\nThis is perl, version 5.%03d_%02d", PATCHLEVEL, SUBVERSION);
1676 printf("\nThis is perl, version %s",patchlevel);
1679 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1681 printf("\n\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1684 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1687 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1688 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1691 printf("atariST series port, ++jrb bammi@cadence.com\n");
1694 Perl may be copied only under the terms of either the Artistic License or the\n\
1695 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1703 if (s[1] == '-') /* Additional switches on #! line. */
1711 #ifdef ALTERNATE_SHEBANG
1712 case 'S': /* OS/2 needs -S on "extproc" line. */
1720 croak("Can't emulate -%.1s on #! line",s);
1725 /* compliments of Tom Christiansen */
1727 /* unexec() can be found in the Gnu emacs distribution */
1738 prog = newSVpv(BIN_EXP);
1739 sv_catpv(prog, "/perl");
1740 file = newSVpv(origfilename);
1741 sv_catpv(file, ".perldump");
1743 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1745 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1746 SvPVX(prog), SvPVX(file));
1750 # include <lib$routines.h>
1751 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1753 ABORT(); /* for use with undump */
1764 /* Note that strtab is a rather special HV. Assumptions are made
1765 about not iterating on it, and not adding tie magic to it.
1766 It is properly deallocated in perl_destruct() */
1768 HvSHAREKEYS_off(strtab); /* mandatory */
1769 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1770 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1772 curstash = defstash = newHV();
1773 curstname = newSVpv("main",4);
1774 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1775 SvREFCNT_dec(GvHV(gv));
1776 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1778 HvNAME(defstash) = savepv("main");
1779 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1781 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1782 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1784 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1785 sv_grow(GvSV(errgv), 240); /* Preallocate - for immediate signals. */
1786 sv_setpvn(GvSV(errgv), "", 0);
1787 curstash = defstash;
1788 compiling.cop_stash = defstash;
1789 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1790 /* We must init $/ before switches are processed. */
1791 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1794 #ifdef CAN_PROTOTYPE
1796 open_script(char *scriptname, bool dosearch, SV *sv)
1799 open_script(scriptname,dosearch,sv)
1806 char *xfound = Nullch;
1807 char *xfailed = Nullch;
1811 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1812 # define SEARCH_EXTS ".bat", ".cmd", NULL
1813 # define MAX_EXT_LEN 4
1816 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1817 # define MAX_EXT_LEN 4
1820 # define SEARCH_EXTS ".pl", ".com", NULL
1821 # define MAX_EXT_LEN 4
1823 /* additional extensions to try in each dir if scriptname not found */
1825 char *ext[] = { SEARCH_EXTS };
1826 int extidx = 0, i = 0;
1827 char *curext = Nullch;
1829 # define MAX_EXT_LEN 0
1833 * If dosearch is true and if scriptname does not contain path
1834 * delimiters, search the PATH for scriptname.
1836 * If SEARCH_EXTS is also defined, will look for each
1837 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1838 * while searching the PATH.
1840 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1841 * proceeds as follows:
1843 * + look for ./scriptname{,.foo,.bar}
1844 * + search the PATH for scriptname{,.foo,.bar}
1847 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1848 * this will not look in '.' if it's not in the PATH)
1853 int hasdir, idx = 0, deftypes = 1;
1856 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1857 /* The first time through, just add SEARCH_EXTS to whatever we
1858 * already have, so we can check for default file types. */
1860 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1866 if ((strlen(tokenbuf) + strlen(scriptname)
1867 + MAX_EXT_LEN) >= sizeof tokenbuf)
1868 continue; /* don't search dir with too-long name */
1869 strcat(tokenbuf, scriptname);
1873 if (strEQ(scriptname, "-"))
1875 if (dosearch) { /* Look in '.' first. */
1876 char *cur = scriptname;
1878 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1880 if (strEQ(ext[i++],curext)) {
1881 extidx = -1; /* already has an ext */
1886 DEBUG_p(PerlIO_printf(Perl_debug_log,
1887 "Looking for %s\n",cur));
1888 if (Stat(cur,&statbuf) >= 0) {
1896 if (cur == scriptname) {
1897 len = strlen(scriptname);
1898 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1900 cur = strcpy(tokenbuf, scriptname);
1902 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1903 && strcpy(tokenbuf+len, ext[extidx++]));
1908 if (dosearch && !strchr(scriptname, '/')
1910 && !strchr(scriptname, '\\')
1912 && (s = getenv("PATH"))) {
1915 bufend = s + strlen(s);
1916 while (s < bufend) {
1917 #if defined(atarist) || defined(DOSISH)
1922 && *s != ';'; len++, s++) {
1923 if (len < sizeof tokenbuf)
1926 if (len < sizeof tokenbuf)
1927 tokenbuf[len] = '\0';
1928 #else /* ! (atarist || DOSISH) */
1929 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1932 #endif /* ! (atarist || DOSISH) */
1935 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1936 continue; /* don't search dir with too-long name */
1938 #if defined(atarist) || defined(DOSISH)
1939 && tokenbuf[len - 1] != '/'
1940 && tokenbuf[len - 1] != '\\'
1943 tokenbuf[len++] = '/';
1944 if (len == 2 && tokenbuf[0] == '.')
1946 (void)strcpy(tokenbuf + len, scriptname);
1950 len = strlen(tokenbuf);
1951 if (extidx > 0) /* reset after previous loop */
1955 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1956 retval = Stat(tokenbuf,&statbuf);
1958 } while ( retval < 0 /* not there */
1959 && extidx>=0 && ext[extidx] /* try an extension? */
1960 && strcpy(tokenbuf+len, ext[extidx++])
1965 if (S_ISREG(statbuf.st_mode)
1966 && cando(S_IRUSR,TRUE,&statbuf)
1968 && cando(S_IXUSR,TRUE,&statbuf)
1972 xfound = tokenbuf; /* bingo! */
1976 xfailed = savepv(tokenbuf);
1979 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1981 seen_dot = 1; /* Disable message. */
1983 croak("Can't %s %s%s%s",
1984 (xfailed ? "execute" : "find"),
1985 (xfailed ? xfailed : scriptname),
1986 (xfailed ? "" : " on PATH"),
1987 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1990 scriptname = xfound;
1993 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1994 char *s = scriptname + 8;
2003 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2004 curcop->cop_filegv = gv_fetchfile(origfilename);
2005 if (strEQ(origfilename,"-"))
2007 if (fdscript >= 0) {
2008 rsfp = PerlIO_fdopen(fdscript,"r");
2009 #if defined(HAS_FCNTL) && defined(F_SETFD)
2011 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2014 else if (preprocess) {
2015 char *cpp_cfg = CPPSTDIN;
2016 SV *cpp = NEWSV(0,0);
2017 SV *cmd = NEWSV(0,0);
2019 if (strEQ(cpp_cfg, "cppstdin"))
2020 sv_catpvf(cpp, "%s/", BIN_EXP);
2021 sv_catpv(cpp, cpp_cfg);
2024 sv_catpv(sv,PRIVLIB_EXP);
2028 sed %s -e \"/^[^#]/b\" \
2029 -e \"/^#[ ]*include[ ]/b\" \
2030 -e \"/^#[ ]*define[ ]/b\" \
2031 -e \"/^#[ ]*if[ ]/b\" \
2032 -e \"/^#[ ]*ifdef[ ]/b\" \
2033 -e \"/^#[ ]*ifndef[ ]/b\" \
2034 -e \"/^#[ ]*else/b\" \
2035 -e \"/^#[ ]*elif[ ]/b\" \
2036 -e \"/^#[ ]*undef[ ]/b\" \
2037 -e \"/^#[ ]*endif/b\" \
2040 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2043 %s %s -e '/^[^#]/b' \
2044 -e '/^#[ ]*include[ ]/b' \
2045 -e '/^#[ ]*define[ ]/b' \
2046 -e '/^#[ ]*if[ ]/b' \
2047 -e '/^#[ ]*ifdef[ ]/b' \
2048 -e '/^#[ ]*ifndef[ ]/b' \
2049 -e '/^#[ ]*else/b' \
2050 -e '/^#[ ]*elif[ ]/b' \
2051 -e '/^#[ ]*undef[ ]/b' \
2052 -e '/^#[ ]*endif/b' \
2060 (doextract ? "-e '1,/^#/d\n'" : ""),
2062 scriptname, cpp, sv, CPPMINUS);
2064 #ifdef IAMSUID /* actually, this is caught earlier */
2065 if (euid != uid && !euid) { /* if running suidperl */
2067 (void)seteuid(uid); /* musn't stay setuid root */
2070 (void)setreuid((Uid_t)-1, uid);
2072 #ifdef HAS_SETRESUID
2073 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2079 if (geteuid() != uid)
2080 croak("Can't do seteuid!\n");
2082 #endif /* IAMSUID */
2083 rsfp = my_popen(SvPVX(cmd), "r");
2087 else if (!*scriptname) {
2088 forbid_setid("program input from stdin");
2089 rsfp = PerlIO_stdin();
2092 rsfp = PerlIO_open(scriptname,"r");
2093 #if defined(HAS_FCNTL) && defined(F_SETFD)
2095 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2103 #ifndef IAMSUID /* in case script is not readable before setuid */
2104 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2105 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2107 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2108 croak("Can't do setuid\n");
2112 croak("Can't open perl script \"%s\": %s\n",
2113 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2118 validate_suid(validarg, 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.
2147 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2148 croak("Can't stat script \"%s\"",origfilename);
2149 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2153 #ifndef HAS_SETREUID
2154 /* On this access check to make sure the directories are readable,
2155 * there is actually a small window that the user could use to make
2156 * filename point to an accessible directory. So there is a faint
2157 * chance that someone could execute a setuid script down in a
2158 * non-accessible directory. I don't know what to do about that.
2159 * But I don't think it's too important. The manual lies when
2160 * it says access() is useful in setuid programs.
2162 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2163 croak("Permission denied");
2165 /* If we can swap euid and uid, then we can determine access rights
2166 * with a simple stat of the file, and then compare device and
2167 * inode to make sure we did stat() on the same file we opened.
2168 * Then we just have to make sure he or she can execute it.
2171 struct stat tmpstatbuf;
2175 setreuid(euid,uid) < 0
2178 setresuid(euid,uid,(Uid_t)-1) < 0
2181 || getuid() != euid || geteuid() != uid)
2182 croak("Can't swap uid and euid"); /* really paranoid */
2183 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2184 croak("Permission denied"); /* testing full pathname here */
2185 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2186 tmpstatbuf.st_ino != statbuf.st_ino) {
2187 (void)PerlIO_close(rsfp);
2188 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2190 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2191 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2192 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2193 (long)statbuf.st_dev, (long)statbuf.st_ino,
2194 SvPVX(GvSV(curcop->cop_filegv)),
2195 (long)statbuf.st_uid, (long)statbuf.st_gid);
2196 (void)my_pclose(rsfp);
2198 croak("Permission denied\n");
2202 setreuid(uid,euid) < 0
2204 # if defined(HAS_SETRESUID)
2205 setresuid(uid,euid,(Uid_t)-1) < 0
2208 || getuid() != uid || geteuid() != euid)
2209 croak("Can't reswap uid and euid");
2210 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2211 croak("Permission denied\n");
2213 #endif /* HAS_SETREUID */
2214 #endif /* IAMSUID */
2216 if (!S_ISREG(statbuf.st_mode))
2217 croak("Permission denied");
2218 if (statbuf.st_mode & S_IWOTH)
2219 croak("Setuid/gid script is writable by world");
2220 doswitches = FALSE; /* -s is insecure in suid */
2222 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2223 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2224 croak("No #! line");
2225 s = SvPV(linestr,na)+2;
2227 while (!isSPACE(*s)) s++;
2228 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2229 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2230 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2231 croak("Not a perl script");
2232 while (*s == ' ' || *s == '\t') s++;
2234 * #! arg must be what we saw above. They can invoke it by
2235 * mentioning suidperl explicitly, but they may not add any strange
2236 * arguments beyond what #! says if they do invoke suidperl that way.
2238 len = strlen(validarg);
2239 if (strEQ(validarg," PHOOEY ") ||
2240 strnNE(s,validarg,len) || !isSPACE(s[len]))
2241 croak("Args must match #! line");
2244 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2245 euid == statbuf.st_uid)
2247 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2248 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2249 #endif /* IAMSUID */
2251 if (euid) { /* oops, we're not the setuid root perl */
2252 (void)PerlIO_close(rsfp);
2255 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2257 croak("Can't do setuid\n");
2260 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2262 (void)setegid(statbuf.st_gid);
2265 (void)setregid((Gid_t)-1,statbuf.st_gid);
2267 #ifdef HAS_SETRESGID
2268 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2270 setgid(statbuf.st_gid);
2274 if (getegid() != statbuf.st_gid)
2275 croak("Can't do setegid!\n");
2277 if (statbuf.st_mode & S_ISUID) {
2278 if (statbuf.st_uid != euid)
2280 (void)seteuid(statbuf.st_uid); /* all that for this */
2283 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2285 #ifdef HAS_SETRESUID
2286 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2288 setuid(statbuf.st_uid);
2292 if (geteuid() != statbuf.st_uid)
2293 croak("Can't do seteuid!\n");
2295 else if (uid) { /* oops, mustn't run as root */
2297 (void)seteuid((Uid_t)uid);
2300 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2302 #ifdef HAS_SETRESUID
2303 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2309 if (geteuid() != uid)
2310 croak("Can't do seteuid!\n");
2313 if (!cando(S_IXUSR,TRUE,&statbuf))
2314 croak("Permission denied\n"); /* they can't do this */
2317 else if (preprocess)
2318 croak("-P not allowed for setuid/setgid script\n");
2319 else if (fdscript >= 0)
2320 croak("fd script not allowed in suidperl\n");
2322 croak("Script is not setuid/setgid in suidperl\n");
2324 /* We absolutely must clear out any saved ids here, so we */
2325 /* exec the real perl, substituting fd script for scriptname. */
2326 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2327 PerlIO_rewind(rsfp);
2328 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2329 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2330 if (!origargv[which])
2331 croak("Permission denied");
2332 origargv[which] = savepv(form("/dev/fd/%d/%s",
2333 PerlIO_fileno(rsfp), origargv[which]));
2334 #if defined(HAS_FCNTL) && defined(F_SETFD)
2335 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2337 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2338 croak("Can't do setuid\n");
2339 #endif /* IAMSUID */
2341 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2342 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2344 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2345 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2347 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2350 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2351 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2352 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2353 /* not set-id, must be wrapped */
2361 register char *s, *s2;
2363 /* skip forward in input to the real script? */
2367 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2368 croak("No Perl script found in input\n");
2369 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2370 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2372 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2374 while (*s == ' ' || *s == '\t') s++;
2376 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2377 if (strnEQ(s2-4,"perl",4))
2379 while (s = moreswitches(s)) ;
2381 if (cddir && chdir(cddir) < 0)
2382 croak("Can't chdir to %s",cddir);
2390 uid = (int)getuid();
2391 euid = (int)geteuid();
2392 gid = (int)getgid();
2393 egid = (int)getegid();
2398 tainting |= (uid && (euid != uid || egid != gid));
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;
2435 mainstack = curstack; /* remember in case we switch stacks */
2436 AvREAL_off(curstack); /* not a real array */
2437 av_extend(curstack,127);
2439 stack_base = AvARRAY(curstack);
2440 stack_sp = stack_base;
2441 stack_max = stack_base + 127;
2443 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2444 New(50,cxstack,cxstack_max + 1,CONTEXT);
2447 New(50,tmps_stack,128,SV*);
2453 * The following stacks almost certainly should be per-interpreter,
2454 * but for now they're not. XXX
2458 markstack_ptr = markstack;
2460 New(54,markstack,64,I32);
2461 markstack_ptr = markstack;
2462 markstack_max = markstack + 64;
2468 New(54,scopestack,32,I32);
2470 scopestack_max = 32;
2476 New(54,savestack,128,ANY);
2478 savestack_max = 128;
2484 New(54,retstack,16,OP*);
2495 Safefree(tmps_stack);
2502 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2511 subname = newSVpv("main",4);
2515 init_predump_symbols()
2521 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2523 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2524 GvMULTI_on(stdingv);
2525 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2526 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2528 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2530 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2532 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2534 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2536 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2538 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2539 GvMULTI_on(othergv);
2540 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2541 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2543 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2545 statname = NEWSV(66,0); /* last filename we did stat on */
2548 osname = savepv(OSNAME);
2552 init_postdump_symbols(argc,argv,env)
2554 register char **argv;
2555 register char **env;
2561 argc--,argv++; /* skip name of script */
2563 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2566 if (argv[0][1] == '-') {
2570 if (s = strchr(argv[0], '=')) {
2572 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2575 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2578 toptarget = NEWSV(0,0);
2579 sv_upgrade(toptarget, SVt_PVFM);
2580 sv_setpvn(toptarget, "", 0);
2581 bodytarget = NEWSV(0,0);
2582 sv_upgrade(bodytarget, SVt_PVFM);
2583 sv_setpvn(bodytarget, "", 0);
2584 formtarget = bodytarget;
2587 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2588 sv_setpv(GvSV(tmpgv),origfilename);
2589 magicname("0", "0", 1);
2591 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2592 sv_setpv(GvSV(tmpgv),origargv[0]);
2593 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2595 (void)gv_AVadd(argvgv);
2596 av_clear(GvAVn(argvgv));
2597 for (; argc > 0; argc--,argv++) {
2598 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2601 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2605 hv_magic(hv, envgv, 'E');
2606 #ifndef VMS /* VMS doesn't have environ array */
2607 /* Note that if the supplied env parameter is actually a copy
2608 of the global environ then it may now point to free'd memory
2609 if the environment has been modified since. To avoid this
2610 problem we treat env==NULL as meaning 'use the default'
2615 environ[0] = Nullch;
2616 for (; *env; env++) {
2617 if (!(s = strchr(*env,'=')))
2623 sv = newSVpv(s--,0);
2624 (void)hv_store(hv, *env, s - *env, sv, 0);
2626 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2627 /* Sins of the RTL. See note in my_setenv(). */
2628 (void)putenv(savepv(*env));
2632 #ifdef DYNAMIC_ENV_FETCH
2633 HvNAME(hv) = savepv(ENV_HV_NAME);
2637 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2638 sv_setiv(GvSV(tmpgv), (IV)getpid());
2647 s = getenv("PERL5LIB");
2651 incpush(getenv("PERLLIB"), FALSE);
2653 /* Treat PERL5?LIB as a possible search list logical name -- the
2654 * "natural" VMS idiom for a Unix path string. We allow each
2655 * element to be a set of |-separated directories for compatibility.
2659 if (my_trnlnm("PERL5LIB",buf,0))
2660 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2662 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2666 /* Use the ~-expanded versions of APPLLIB (undocumented),
2667 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2670 incpush(APPLLIB_EXP, FALSE);
2674 incpush(ARCHLIB_EXP, FALSE);
2677 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2679 incpush(PRIVLIB_EXP, FALSE);
2682 incpush(SITEARCH_EXP, FALSE);
2685 incpush(SITELIB_EXP, FALSE);
2687 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2688 incpush(OLDARCHLIB_EXP, FALSE);
2692 incpush(".", FALSE);
2696 # define PERLLIB_SEP ';'
2699 # define PERLLIB_SEP '|'
2701 # define PERLLIB_SEP ':'
2704 #ifndef PERLLIB_MANGLE
2705 # define PERLLIB_MANGLE(s,n) (s)
2709 incpush(p, addsubdirs)
2713 SV *subdir = Nullsv;
2714 static char *archpat_auto;
2721 if (!archpat_auto) {
2722 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2723 + sizeof("//auto"));
2724 New(55, archpat_auto, len, char);
2725 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2727 for (len = sizeof(ARCHNAME) + 2;
2728 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2729 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2734 /* Break at all separators */
2736 SV *libdir = newSV(0);
2739 /* skip any consecutive separators */
2740 while ( *p == PERLLIB_SEP ) {
2741 /* Uncomment the next line for PATH semantics */
2742 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2746 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2747 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2752 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2753 p = Nullch; /* break out */
2757 * BEFORE pushing libdir onto @INC we may first push version- and
2758 * archname-specific sub-directories.
2761 struct stat tmpstatbuf;
2766 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2768 while (unix[len-1] == '/') len--; /* Cosmetic */
2769 sv_usepvn(libdir,unix,len);
2772 PerlIO_printf(PerlIO_stderr(),
2773 "Failed to unixify @INC element \"%s\"\n",
2776 /* .../archname/version if -d .../archname/version/auto */
2777 sv_setsv(subdir, libdir);
2778 sv_catpv(subdir, archpat_auto);
2779 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2780 S_ISDIR(tmpstatbuf.st_mode))
2781 av_push(GvAVn(incgv),
2782 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2784 /* .../archname if -d .../archname/auto */
2785 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2786 strlen(patchlevel) + 1, "", 0);
2787 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2788 S_ISDIR(tmpstatbuf.st_mode))
2789 av_push(GvAVn(incgv),
2790 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2793 /* finally push this lib directory on the end of @INC */
2794 av_push(GvAVn(incgv), libdir);
2797 SvREFCNT_dec(subdir);
2801 call_list(oldscope, list)
2806 line_t oldline = curcop->cop_line;
2811 while (AvFILL(list) >= 0) {
2812 CV *cv = (CV*)av_shift(list);
2819 SV* atsv = GvSV(errgv);
2821 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2822 (void)SvPV(atsv, len);
2825 curcop = &compiling;
2826 curcop->cop_line = oldline;
2827 if (list == beginav)
2828 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2830 sv_catpv(atsv, "END failed--cleanup aborted");
2831 while (scopestack_ix > oldscope)
2833 croak("%s", SvPVX(atsv));
2841 /* my_exit() was called */
2842 while (scopestack_ix > oldscope)
2845 curstash = defstash;
2847 call_list(oldscope, endav);
2849 curcop = &compiling;
2850 curcop->cop_line = oldline;
2852 if (list == beginav)
2853 croak("BEGIN failed--compilation aborted");
2855 croak("END failed--cleanup aborted");
2861 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2866 curcop = &compiling;
2867 curcop->cop_line = oldline;
2881 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread 0x%lx, status %lu\n",
2882 (unsigned long) thr, (unsigned long) status));
2883 #endif /* USE_THREADS */
2892 STATUS_NATIVE_SET(status);
2902 if (vaxc$errno & 1) {
2903 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2904 STATUS_NATIVE_SET(44);
2907 if (!vaxc$errno && errno) /* unlikely */
2908 STATUS_NATIVE_SET(44);
2910 STATUS_NATIVE_SET(vaxc$errno);
2914 STATUS_POSIX_SET(errno);
2915 else if (STATUS_POSIX == 0)
2916 STATUS_POSIX_SET(255);
2925 register CONTEXT *cx;
2934 (void)UNLINK(e_tmpname);
2935 Safefree(e_tmpname);
2939 if (cxstack_ix >= 0) {