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 New(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);
143 self = pthread_self();
144 if (pthread_key_create(&thr_key, 0))
145 croak("panic: pthread_key_create");
146 if (pthread_setspecific(thr_key, (void *) thr))
147 croak("panic: pthread_setspecific");
148 #endif /* FAKE_THREADS */
149 #endif /* USE_THREADS */
151 linestr = NEWSV(65,80);
152 sv_upgrade(linestr,SVt_PVIV);
154 if (!SvREADONLY(&sv_undef)) {
155 SvREADONLY_on(&sv_undef);
159 SvREADONLY_on(&sv_no);
161 sv_setpv(&sv_yes,Yes);
163 SvREADONLY_on(&sv_yes);
166 nrs = newSVpv("\n", 1);
167 rs = SvREFCNT_inc(nrs);
169 sighandlerp = sighandler;
174 * There is no way we can refer to them from Perl so close them to save
175 * space. The other alternative would be to provide STDAUX and STDPRN
178 (void)fclose(stdaux);
179 (void)fclose(stdprn);
185 perl_destruct_level = 1;
187 if(perl_destruct_level > 0)
192 lex_state = LEX_NOTPARSING;
194 start_env.je_prev = NULL;
195 start_env.je_ret = -1;
196 start_env.je_mustcatch = TRUE;
197 top_env = &start_env;
200 SET_NUMERIC_STANDARD();
201 #if defined(SUBVERSION) && SUBVERSION > 0
202 sprintf(patchlevel, "%7.5f", (double) 5
203 + ((double) PATCHLEVEL / (double) 1000)
204 + ((double) SUBVERSION / (double) 100000));
206 sprintf(patchlevel, "%5.3f", (double) 5 +
207 ((double) PATCHLEVEL / (double) 1000));
210 #if defined(LOCAL_PATCH_COUNT)
211 localpatches = local_patches; /* For possible -v */
214 PerlIO_init(); /* Hook to IO system */
216 fdpid = newAV(); /* for remembering popen pids by fd */
220 New(51,debname,128,char);
221 New(52,debdelim,128,char);
228 perl_destruct(sv_interp)
229 register PerlInterpreter *sv_interp;
232 int destruct_level; /* 0=none, 1=full, 2=full with checks */
237 if (!(curinterp = sv_interp))
242 /* Join with any remaining non-detached threads */
243 MUTEX_LOCK(&threads_mutex);
244 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
245 "perl_destruct: waiting for %d threads...\n",
247 for (t = thr->next; t != thr; t = t->next) {
248 MUTEX_LOCK(&t->mutex);
249 switch (ThrSTATE(t)) {
252 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
253 "perl_destruct: joining zombie %p\n", t));
254 ThrSETSTATE(t, THRf_DEAD);
255 MUTEX_UNLOCK(&t->mutex);
257 MUTEX_UNLOCK(&threads_mutex);
258 if (pthread_join(t->Tself, (void**)&av))
259 croak("panic: pthread_join failed during global destruction");
260 SvREFCNT_dec((SV*)av);
261 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
262 "perl_destruct: joined zombie %p OK\n", t));
264 case THRf_R_JOINABLE:
265 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
266 "perl_destruct: detaching thread %p\n", t));
267 ThrSETSTATE(t, THRf_R_DETACHED);
269 * We unlock threads_mutex and t->mutex in the opposite order
270 * from which we locked them just so that DETACH won't
271 * deadlock if it panics. It's only a breach of good style
272 * not a bug since they are unlocks not locks.
274 MUTEX_UNLOCK(&threads_mutex);
276 MUTEX_UNLOCK(&t->mutex);
279 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
280 "perl_destruct: ignoring %p (state %u)\n",
282 MUTEX_UNLOCK(&t->mutex);
283 MUTEX_UNLOCK(&threads_mutex);
284 /* fall through and out */
287 /* Now wait for the thread count nthreads to drop to one */
290 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
291 "perl_destruct: final wait for %d threads\n",
293 COND_WAIT(&nthreads_cond, &threads_mutex);
295 /* At this point, we're the last thread */
296 MUTEX_UNLOCK(&threads_mutex);
297 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
298 MUTEX_DESTROY(&threads_mutex);
299 COND_DESTROY(&nthreads_cond);
300 #endif /* !defined(FAKE_THREADS) */
301 #endif /* USE_THREADS */
303 destruct_level = perl_destruct_level;
307 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
309 if (destruct_level < i)
318 /* We must account for everything. */
320 /* Destroy the main CV and syntax tree */
322 curpad = AvARRAY(comppad);
327 SvREFCNT_dec(main_cv);
332 * Try to destruct global references. We do this first so that the
333 * destructors and destructees still exist. Some sv's might remain.
334 * Non-referenced objects are on their own.
341 /* unhook hooks which will soon be, or use, destroyed data */
342 SvREFCNT_dec(warnhook);
344 SvREFCNT_dec(diehook);
346 SvREFCNT_dec(parsehook);
349 if (destruct_level == 0){
351 DEBUG_P(debprofdump());
353 /* The exit() function will do everything that needs doing. */
357 /* loosen bonds of global variables */
360 (void)PerlIO_close(rsfp);
364 /* Filters for program text */
365 SvREFCNT_dec(rsfp_filters);
366 rsfp_filters = Nullav;
378 sawampersand = FALSE; /* must save all match strings */
379 sawstudy = FALSE; /* do fbm_instr on all strings */
394 /* magical thingies */
396 Safefree(ofs); /* $, */
399 Safefree(ors); /* $\ */
402 SvREFCNT_dec(nrs); /* $\ helper */
405 multiline = 0; /* $* */
407 SvREFCNT_dec(statname);
411 /* defgv, aka *_ should be taken care of elsewhere */
413 #if 0 /* just about all regexp stuff, seems to be ok */
415 /* shortcuts to regexp stuff */
420 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
422 regprecomp = NULL; /* uncompiled string. */
423 regparse = NULL; /* Input-scan pointer. */
424 regxend = NULL; /* End of input for compile */
425 regnpar = 0; /* () count. */
426 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
427 regsize = 0; /* Code size. */
428 regnaughty = 0; /* How bad is this pattern? */
429 regsawback = 0; /* Did we see \1, ...? */
431 reginput = NULL; /* String-input pointer. */
432 regbol = NULL; /* Beginning of input, for ^ check. */
433 regeol = NULL; /* End of input, for $ check. */
434 regstartp = (char **)NULL; /* Pointer to startp array. */
435 regendp = (char **)NULL; /* Ditto for endp. */
436 reglastparen = 0; /* Similarly for lastparen. */
437 regtill = NULL; /* How far we are required to go. */
438 regflags = 0; /* are we folding, multilining? */
439 regprev = (char)NULL; /* char before regbol, \n if none */
443 /* clean up after study() */
444 SvREFCNT_dec(lastscream);
446 Safefree(screamfirst);
448 Safefree(screamnext);
451 /* startup and shutdown function lists */
452 SvREFCNT_dec(beginav);
454 SvREFCNT_dec(initav);
459 /* temp stack during pp_sort() */
460 SvREFCNT_dec(sortstack);
463 /* shortcuts just get cleared */
473 /* reset so print() ends up where we expect */
476 /* Prepare to destruct main symbol table. */
483 if (destruct_level >= 2) {
484 if (scopestack_ix != 0)
485 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
486 (long)scopestack_ix);
487 if (savestack_ix != 0)
488 warn("Unbalanced saves: %ld more saves than restores\n",
490 if (tmps_floor != -1)
491 warn("Unbalanced tmps: %ld more allocs than frees\n",
492 (long)tmps_floor + 1);
493 if (cxstack_ix != -1)
494 warn("Unbalanced context: %ld more PUSHes than POPs\n",
495 (long)cxstack_ix + 1);
498 /* Now absolutely destruct everything, somehow or other, loops or no. */
500 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
501 while (sv_count != 0 && sv_count != last_sv_count) {
502 last_sv_count = sv_count;
505 SvFLAGS(strtab) &= ~SVTYPEMASK;
506 SvFLAGS(strtab) |= SVt_PVHV;
508 /* Destruct the global string table. */
510 /* Yell and reset the HeVAL() slots that are still holding refcounts,
511 * so that sv_free() won't fail on them.
520 array = HvARRAY(strtab);
524 warn("Unbalanced string table refcount: (%d) for \"%s\"",
525 HeVAL(hent) - Nullsv, HeKEY(hent));
526 HeVAL(hent) = Nullsv;
536 SvREFCNT_dec(strtab);
539 warn("Scalars leaked: %ld\n", (long)sv_count);
543 /* No SVs have survived, need to clean out */
547 Safefree(origfilename);
549 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
551 DEBUG_P(debprofdump());
553 MUTEX_DESTROY(&sv_mutex);
554 MUTEX_DESTROY(&malloc_mutex);
555 MUTEX_DESTROY(&eval_mutex);
556 COND_DESTROY(&eval_cond);
557 #endif /* USE_THREADS */
559 /* As the absolutely last thing, free the non-arena SV for mess() */
562 /* we know that type >= SVt_PV */
564 Safefree(SvPVX(mess_sv));
565 Safefree(SvANY(mess_sv));
573 PerlInterpreter *sv_interp;
575 if (!(curinterp = sv_interp))
581 perl_parse(sv_interp, xsinit, argc, argv, env)
582 PerlInterpreter *sv_interp;
583 void (*xsinit)_((void));
591 char *scriptname = NULL;
592 VOL bool dosearch = FALSE;
599 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
602 croak("suidperl is no longer needed since the kernel can now execute\n\
603 setuid perl scripts securely.\n");
607 if (!(curinterp = sv_interp))
610 #if defined(NeXT) && defined(__DYNAMIC__)
611 _dyld_lookup_and_bind
612 ("__environ", (unsigned long *) &environ_pointer, NULL);
617 #ifndef VMS /* VMS doesn't have environ array */
618 origenviron = environ;
624 /* Come here if running an undumped a.out. */
626 origfilename = savepv(argv[0]);
628 cxstack_ix = -1; /* start label stack again */
630 init_postdump_symbols(argc,argv,env);
635 curpad = AvARRAY(comppad);
640 SvREFCNT_dec(main_cv);
644 oldscope = scopestack_ix;
652 /* my_exit() was called */
653 while (scopestack_ix > oldscope)
658 call_list(oldscope, endav);
660 return STATUS_NATIVE_EXPORT;
663 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
667 sv_setpvn(linestr,"",0);
668 sv = newSVpv("",0); /* first used for -I flags */
672 for (argc--,argv++; argc > 0; argc--,argv++) {
673 if (argv[0][0] != '-' || !argv[0][1])
677 validarg = " PHOOEY ";
702 if (s = moreswitches(s))
712 if (euid != uid || egid != gid)
713 croak("No -e allowed in setuid scripts");
715 e_tmpname = savepv(TMPPATH);
716 (void)mktemp(e_tmpname);
718 croak("Can't mktemp()");
719 e_fp = PerlIO_open(e_tmpname,"w");
721 croak("Cannot open temporary file");
726 PerlIO_puts(e_fp,argv[1]);
730 croak("No code specified for -e");
731 (void)PerlIO_putc(e_fp,'\n');
733 case 'I': /* -I handled both here and in moreswitches() */
735 if (!*++s && (s=argv[1]) != Nullch) {
738 while (s && isSPACE(*s))
742 for (e = s; *e && !isSPACE(*e); e++) ;
749 } /* XXX else croak? */
763 preambleav = newAV();
764 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
766 Sv = newSVpv("print myconfig();",0);
768 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
770 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
772 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
773 sv_catpv(Sv,"\" Compile-time options:");
775 sv_catpv(Sv," DEBUGGING");
778 sv_catpv(Sv," NO_EMBED");
781 sv_catpv(Sv," MULTIPLICITY");
783 sv_catpv(Sv,"\\n\",");
785 #if defined(LOCAL_PATCH_COUNT)
786 if (LOCAL_PATCH_COUNT > 0) {
788 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
789 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
791 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
795 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
798 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
800 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
805 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
806 print \" \\%ENV:\\n @env\\n\" if @env; \
807 print \" \\@INC:\\n @INC\\n\";");
810 Sv = newSVpv("config_vars(qw(",0);
815 av_push(preambleav, Sv);
816 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
827 if (!*++s || isSPACE(*s)) {
831 /* catch use of gnu style long options */
832 if (strEQ(s, "version")) {
836 if (strEQ(s, "help")) {
843 croak("Unrecognized switch: -%s (-h will show valid options)",s);
848 if (!tainting && (s = getenv("PERL5OPT"))) {
859 if (!strchr("DIMUdmw", *s))
860 croak("Illegal switch in PERL5OPT: -%c", *s);
866 scriptname = argv[0];
868 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
870 warn("Did you forget to compile with -DMULTIPLICITY?");
872 croak("Can't write to temp file for -e: %s", Strerror(errno));
876 scriptname = e_tmpname;
878 else if (scriptname == Nullch) {
880 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
888 open_script(scriptname,dosearch,sv);
890 validate_suid(validarg, scriptname);
895 main_cv = compcv = (CV*)NEWSV(1104,0);
896 sv_upgrade((SV *)compcv, SVt_PVCV);
900 av_push(comppad, Nullsv);
901 curpad = AvARRAY(comppad);
902 comppad_name = newAV();
903 comppad_name_fill = 0;
904 min_intro_pending = 0;
907 av_store(comppad_name, 0, newSVpv("@_", 2));
908 curpad[0] = (SV*)newAV();
909 SvPADMY_on(curpad[0]); /* XXX Needed? */
911 New(666, CvMUTEXP(compcv), 1, perl_mutex);
912 MUTEX_INIT(CvMUTEXP(compcv));
913 #endif /* USE_THREADS */
915 comppadlist = newAV();
916 AvREAL_off(comppadlist);
917 av_store(comppadlist, 0, (SV*)comppad_name);
918 av_store(comppadlist, 1, (SV*)comppad);
919 CvPADLIST(compcv) = comppadlist;
921 boot_core_UNIVERSAL();
923 (*xsinit)(); /* in case linked C routines want magical variables */
924 #if defined(VMS) || defined(WIN32)
928 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
929 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
932 init_predump_symbols();
934 init_postdump_symbols(argc,argv,env);
938 /* now parse the script */
941 if (yyparse() || error_count) {
943 croak("%s had compilation errors.\n", origfilename);
945 croak("Execution of %s aborted due to compilation errors.\n",
949 curcop->cop_line = 0;
953 (void)UNLINK(e_tmpname);
958 /* now that script is parsed, we can modify record separator */
960 rs = SvREFCNT_inc(nrs);
961 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
973 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
974 dump_mstats("after compilation:");
985 PerlInterpreter *sv_interp;
992 if (!(curinterp = sv_interp))
995 oldscope = scopestack_ix;
1000 cxstack_ix = -1; /* start context stack again */
1003 /* my_exit() was called */
1004 while (scopestack_ix > oldscope)
1007 curstash = defstash;
1009 call_list(oldscope, endav);
1011 if (getenv("PERL_DEBUG_MSTATS"))
1012 dump_mstats("after execution: ");
1015 return STATUS_NATIVE_EXPORT;
1018 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1023 if (curstack != mainstack) {
1025 SWITCHSTACK(curstack, mainstack);
1030 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1031 sawampersand ? "Enabling" : "Omitting"));
1034 DEBUG_x(dump_all());
1035 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1037 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1038 (unsigned long) thr));
1039 #endif /* USE_THREADS */
1042 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1045 if (PERLDB_SINGLE && DBsingle)
1046 sv_setiv(DBsingle, 1);
1048 call_list(oldscope, initav);
1058 else if (main_start) {
1059 CvDEPTH(main_cv) = 1;
1070 perl_get_sv(name, create)
1074 GV* gv = gv_fetchpv(name, create, SVt_PV);
1081 perl_get_av(name, create)
1085 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1094 perl_get_hv(name, create)
1098 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1107 perl_get_cv(name, create)
1111 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1112 if (create && !GvCVu(gv))
1113 return newSUB(start_subparse(FALSE, 0),
1114 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1122 /* Be sure to refetch the stack pointer after calling these routines. */
1125 perl_call_argv(subname, flags, argv)
1127 I32 flags; /* See G_* flags in cop.h */
1128 register char **argv; /* null terminated arg list */
1136 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1141 return perl_call_pv(subname, flags);
1145 perl_call_pv(subname, flags)
1146 char *subname; /* name of the subroutine */
1147 I32 flags; /* See G_* flags in cop.h */
1149 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1153 perl_call_method(methname, flags)
1154 char *methname; /* name of the subroutine */
1155 I32 flags; /* See G_* flags in cop.h */
1162 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1165 return perl_call_sv(*stack_sp--, flags);
1168 /* May be called with any of a CV, a GV, or an SV containing the name. */
1170 perl_call_sv(sv, flags)
1172 I32 flags; /* See G_* flags in cop.h */
1175 LOGOP myop; /* fake syntax tree node */
1181 bool oldcatch = CATCH_GET;
1186 if (flags & G_DISCARD) {
1191 Zero(&myop, 1, LOGOP);
1192 myop.op_next = Nullop;
1193 if (!(flags & G_NOARGS))
1194 myop.op_flags |= OPf_STACKED;
1195 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1196 (flags & G_ARRAY) ? OPf_WANT_LIST :
1201 EXTEND(stack_sp, 1);
1204 oldscope = scopestack_ix;
1206 if (PERLDB_SUB && curstash != debstash
1207 /* Handle first BEGIN of -d. */
1208 && (DBcv || (DBcv = GvCV(DBsub)))
1209 /* Try harder, since this may have been a sighandler, thus
1210 * curstash may be meaningless. */
1211 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1212 op->op_private |= OPpENTERSUB_DB;
1214 if (flags & G_EVAL) {
1215 cLOGOP->op_other = op;
1217 /* we're trying to emulate pp_entertry() here */
1219 register CONTEXT *cx;
1220 I32 gimme = GIMME_V;
1225 push_return(op->op_next);
1226 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1228 eval_root = op; /* Only needed so that goto works right. */
1231 if (flags & G_KEEPERR)
1234 sv_setpv(GvSV(errgv),"");
1246 /* my_exit() was called */
1247 curstash = defstash;
1251 croak("Callback called exit");
1260 stack_sp = stack_base + oldmark;
1261 if (flags & G_ARRAY)
1265 *++stack_sp = &sv_undef;
1273 if (op == (OP*)&myop)
1274 op = pp_entersub(ARGS);
1277 retval = stack_sp - (stack_base + oldmark);
1278 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1279 sv_setpv(GvSV(errgv),"");
1282 if (flags & G_EVAL) {
1283 if (scopestack_ix > oldscope) {
1287 register CONTEXT *cx;
1299 CATCH_SET(oldcatch);
1301 if (flags & G_DISCARD) {
1302 stack_sp = stack_base + oldmark;
1311 /* Eval a string. The G_EVAL flag is always assumed. */
1314 perl_eval_sv(sv, flags)
1316 I32 flags; /* See G_* flags in cop.h */
1319 UNOP myop; /* fake syntax tree node */
1321 I32 oldmark = sp - stack_base;
1328 if (flags & G_DISCARD) {
1336 EXTEND(stack_sp, 1);
1338 oldscope = scopestack_ix;
1340 if (!(flags & G_NOARGS))
1341 myop.op_flags = OPf_STACKED;
1342 myop.op_next = Nullop;
1343 myop.op_type = OP_ENTEREVAL;
1344 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1345 (flags & G_ARRAY) ? OPf_WANT_LIST :
1347 if (flags & G_KEEPERR)
1348 myop.op_flags |= OPf_SPECIAL;
1358 /* my_exit() was called */
1359 curstash = defstash;
1363 croak("Callback called exit");
1372 stack_sp = stack_base + oldmark;
1373 if (flags & G_ARRAY)
1377 *++stack_sp = &sv_undef;
1382 if (op == (OP*)&myop)
1383 op = pp_entereval(ARGS);
1386 retval = stack_sp - (stack_base + oldmark);
1387 if (!(flags & G_KEEPERR))
1388 sv_setpv(GvSV(errgv),"");
1392 if (flags & G_DISCARD) {
1393 stack_sp = stack_base + oldmark;
1403 perl_eval_pv(p, croak_on_error)
1409 SV* sv = newSVpv(p, 0);
1412 perl_eval_sv(sv, G_SCALAR);
1419 if (croak_on_error && SvTRUE(GvSV(errgv)))
1420 croak(SvPVx(GvSV(errgv), na));
1425 /* Require a module. */
1431 SV* sv = sv_newmortal();
1432 sv_setpv(sv, "require '");
1435 perl_eval_sv(sv, G_DISCARD);
1439 magicname(sym,name,namlen)
1446 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1447 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1451 usage(name) /* XXX move this out into a module ? */
1454 /* This message really ought to be max 23 lines.
1455 * Removed -h because the user already knows that opton. Others? */
1457 static char *usage[] = {
1458 "-0[octal] specify record separator (\\0, if no argument)",
1459 "-a autosplit mode with -n or -p (splits $_ into @F)",
1460 "-c check syntax only (runs BEGIN and END blocks)",
1461 "-d[:debugger] run scripts under debugger",
1462 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1463 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1464 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1465 "-i[extension] edit <> files in place (make backup if extension supplied)",
1466 "-Idirectory specify @INC/#include directory (may be used more than once)",
1467 "-l[octal] enable line ending processing, specifies line terminator",
1468 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1469 "-n assume 'while (<>) { ... }' loop around your script",
1470 "-p assume loop like -n but print line also like sed",
1471 "-P run script through C preprocessor before compilation",
1472 "-s enable some switch parsing for switches after script name",
1473 "-S look for the script using PATH environment variable",
1474 "-T turn on tainting checks",
1475 "-u dump core after parsing script",
1476 "-U allow unsafe operations",
1477 "-v print version number and patchlevel of perl",
1478 "-V[:variable] print perl configuration information",
1479 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1480 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1486 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1488 printf("\n %s", *p++);
1491 /* This routine handles any switches that can be given during run */
1502 rschar = scan_oct(s, 4, &numlen);
1504 if (rschar & ~((U8)~0))
1506 else if (!rschar && numlen >= 2)
1507 nrs = newSVpv("", 0);
1510 nrs = newSVpv(&ch, 1);
1515 splitstr = savepv(s + 1);
1529 if (*s == ':' || *s == '=') {
1530 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1534 perldb = PERLDB_ALL;
1541 if (isALPHA(s[1])) {
1542 static char debopts[] = "psltocPmfrxuLHXD";
1545 for (s++; *s && (d = strchr(debopts,*s)); s++)
1546 debug |= 1 << (d - debopts);
1550 for (s++; isDIGIT(*s); s++) ;
1552 debug |= 0x80000000;
1554 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1555 for (s++; isALNUM(*s); s++) ;
1565 inplace = savepv(s+1);
1567 for (s = inplace; *s && !isSPACE(*s); s++) ;
1571 case 'I': /* -I handled both here and in parse_perl() */
1574 while (*s && isSPACE(*s))
1578 for (e = s; *e && !isSPACE(*e); e++) ;
1579 p = savepvn(s, e-s);
1585 croak("No space allowed after -I");
1595 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1604 ors = SvPV(nrs, orslen);
1605 ors = savepvn(ors, orslen);
1609 forbid_setid("-M"); /* XXX ? */
1612 forbid_setid("-m"); /* XXX ? */
1617 /* -M-foo == 'no foo' */
1618 if (*s == '-') { use = "no "; ++s; }
1619 sv = newSVpv(use,0);
1621 /* We allow -M'Module qw(Foo Bar)' */
1622 while(isALNUM(*s) || *s==':') ++s;
1624 sv_catpv(sv, start);
1625 if (*(start-1) == 'm') {
1627 croak("Can't use '%c' after -mname", *s);
1628 sv_catpv( sv, " ()");
1631 sv_catpvn(sv, start, s-start);
1632 sv_catpv(sv, " split(/,/,q{");
1637 if (preambleav == NULL)
1638 preambleav = newAV();
1639 av_push(preambleav, sv);
1642 croak("No space allowed after -%c", *(s-1));
1659 croak("Too late for \"-T\" option");
1671 #if defined(SUBVERSION) && SUBVERSION > 0
1672 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1673 PATCHLEVEL, SUBVERSION, ARCHNAME);
1675 printf("\nThis is perl, version %s built for %s",
1676 patchlevel, ARCHNAME);
1678 #if defined(LOCAL_PATCH_COUNT)
1679 if (LOCAL_PATCH_COUNT > 0)
1680 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1681 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1684 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1686 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1689 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1692 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1693 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1696 printf("atariST series port, ++jrb bammi@cadence.com\n");
1699 Perl may be copied only under the terms of either the Artistic License or the\n\
1700 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1708 if (s[1] == '-') /* Additional switches on #! line. */
1716 #ifdef ALTERNATE_SHEBANG
1717 case 'S': /* OS/2 needs -S on "extproc" line. */
1725 croak("Can't emulate -%.1s on #! line",s);
1730 /* compliments of Tom Christiansen */
1732 /* unexec() can be found in the Gnu emacs distribution */
1743 prog = newSVpv(BIN_EXP);
1744 sv_catpv(prog, "/perl");
1745 file = newSVpv(origfilename);
1746 sv_catpv(file, ".perldump");
1748 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1750 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1751 SvPVX(prog), SvPVX(file));
1755 # include <lib$routines.h>
1756 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1758 ABORT(); /* for use with undump */
1769 /* Note that strtab is a rather special HV. Assumptions are made
1770 about not iterating on it, and not adding tie magic to it.
1771 It is properly deallocated in perl_destruct() */
1773 HvSHAREKEYS_off(strtab); /* mandatory */
1774 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1775 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1777 curstash = defstash = newHV();
1778 curstname = newSVpv("main",4);
1779 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1780 SvREFCNT_dec(GvHV(gv));
1781 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1783 HvNAME(defstash) = savepv("main");
1784 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1786 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1787 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1789 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1790 sv_grow(GvSV(errgv), 240); /* Preallocate - for immediate signals. */
1791 sv_setpvn(GvSV(errgv), "", 0);
1792 curstash = defstash;
1793 compiling.cop_stash = defstash;
1794 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1795 /* We must init $/ before switches are processed. */
1796 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1799 #ifdef CAN_PROTOTYPE
1801 open_script(char *scriptname, bool dosearch, SV *sv)
1804 open_script(scriptname,dosearch,sv)
1811 char *xfound = Nullch;
1812 char *xfailed = Nullch;
1816 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1817 # define SEARCH_EXTS ".bat", ".cmd", NULL
1818 # define MAX_EXT_LEN 4
1821 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1822 # define MAX_EXT_LEN 4
1825 # define SEARCH_EXTS ".pl", ".com", NULL
1826 # define MAX_EXT_LEN 4
1828 /* additional extensions to try in each dir if scriptname not found */
1830 char *ext[] = { SEARCH_EXTS };
1831 int extidx = 0, i = 0;
1832 char *curext = Nullch;
1834 # define MAX_EXT_LEN 0
1838 * If dosearch is true and if scriptname does not contain path
1839 * delimiters, search the PATH for scriptname.
1841 * If SEARCH_EXTS is also defined, will look for each
1842 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1843 * while searching the PATH.
1845 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1846 * proceeds as follows:
1848 * + look for ./scriptname{,.foo,.bar}
1849 * + search the PATH for scriptname{,.foo,.bar}
1852 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1853 * this will not look in '.' if it's not in the PATH)
1858 int hasdir, idx = 0, deftypes = 1;
1861 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1862 /* The first time through, just add SEARCH_EXTS to whatever we
1863 * already have, so we can check for default file types. */
1865 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1871 if ((strlen(tokenbuf) + strlen(scriptname)
1872 + MAX_EXT_LEN) >= sizeof tokenbuf)
1873 continue; /* don't search dir with too-long name */
1874 strcat(tokenbuf, scriptname);
1878 if (strEQ(scriptname, "-"))
1880 if (dosearch) { /* Look in '.' first. */
1881 char *cur = scriptname;
1883 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1885 if (strEQ(ext[i++],curext)) {
1886 extidx = -1; /* already has an ext */
1891 DEBUG_p(PerlIO_printf(Perl_debug_log,
1892 "Looking for %s\n",cur));
1893 if (Stat(cur,&statbuf) >= 0) {
1901 if (cur == scriptname) {
1902 len = strlen(scriptname);
1903 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1905 cur = strcpy(tokenbuf, scriptname);
1907 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1908 && strcpy(tokenbuf+len, ext[extidx++]));
1913 if (dosearch && !strchr(scriptname, '/')
1915 && !strchr(scriptname, '\\')
1917 && (s = getenv("PATH"))) {
1920 bufend = s + strlen(s);
1921 while (s < bufend) {
1922 #if defined(atarist) || defined(DOSISH)
1927 && *s != ';'; len++, s++) {
1928 if (len < sizeof tokenbuf)
1931 if (len < sizeof tokenbuf)
1932 tokenbuf[len] = '\0';
1933 #else /* ! (atarist || DOSISH) */
1934 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1937 #endif /* ! (atarist || DOSISH) */
1940 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1941 continue; /* don't search dir with too-long name */
1943 #if defined(atarist) || defined(DOSISH)
1944 && tokenbuf[len - 1] != '/'
1945 && tokenbuf[len - 1] != '\\'
1948 tokenbuf[len++] = '/';
1949 if (len == 2 && tokenbuf[0] == '.')
1951 (void)strcpy(tokenbuf + len, scriptname);
1955 len = strlen(tokenbuf);
1956 if (extidx > 0) /* reset after previous loop */
1960 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1961 retval = Stat(tokenbuf,&statbuf);
1963 } while ( retval < 0 /* not there */
1964 && extidx>=0 && ext[extidx] /* try an extension? */
1965 && strcpy(tokenbuf+len, ext[extidx++])
1970 if (S_ISREG(statbuf.st_mode)
1971 && cando(S_IRUSR,TRUE,&statbuf)
1973 && cando(S_IXUSR,TRUE,&statbuf)
1977 xfound = tokenbuf; /* bingo! */
1981 xfailed = savepv(tokenbuf);
1984 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1986 seen_dot = 1; /* Disable message. */
1988 croak("Can't %s %s%s%s",
1989 (xfailed ? "execute" : "find"),
1990 (xfailed ? xfailed : scriptname),
1991 (xfailed ? "" : " on PATH"),
1992 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1995 scriptname = xfound;
1998 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1999 char *s = scriptname + 8;
2008 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2009 curcop->cop_filegv = gv_fetchfile(origfilename);
2010 if (strEQ(origfilename,"-"))
2012 if (fdscript >= 0) {
2013 rsfp = PerlIO_fdopen(fdscript,"r");
2014 #if defined(HAS_FCNTL) && defined(F_SETFD)
2016 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2019 else if (preprocess) {
2020 char *cpp_cfg = CPPSTDIN;
2021 SV *cpp = NEWSV(0,0);
2022 SV *cmd = NEWSV(0,0);
2024 if (strEQ(cpp_cfg, "cppstdin"))
2025 sv_catpvf(cpp, "%s/", BIN_EXP);
2026 sv_catpv(cpp, cpp_cfg);
2029 sv_catpv(sv,PRIVLIB_EXP);
2033 sed %s -e \"/^[^#]/b\" \
2034 -e \"/^#[ ]*include[ ]/b\" \
2035 -e \"/^#[ ]*define[ ]/b\" \
2036 -e \"/^#[ ]*if[ ]/b\" \
2037 -e \"/^#[ ]*ifdef[ ]/b\" \
2038 -e \"/^#[ ]*ifndef[ ]/b\" \
2039 -e \"/^#[ ]*else/b\" \
2040 -e \"/^#[ ]*elif[ ]/b\" \
2041 -e \"/^#[ ]*undef[ ]/b\" \
2042 -e \"/^#[ ]*endif/b\" \
2045 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2048 %s %s -e '/^[^#]/b' \
2049 -e '/^#[ ]*include[ ]/b' \
2050 -e '/^#[ ]*define[ ]/b' \
2051 -e '/^#[ ]*if[ ]/b' \
2052 -e '/^#[ ]*ifdef[ ]/b' \
2053 -e '/^#[ ]*ifndef[ ]/b' \
2054 -e '/^#[ ]*else/b' \
2055 -e '/^#[ ]*elif[ ]/b' \
2056 -e '/^#[ ]*undef[ ]/b' \
2057 -e '/^#[ ]*endif/b' \
2065 (doextract ? "-e '1,/^#/d\n'" : ""),
2067 scriptname, cpp, sv, CPPMINUS);
2069 #ifdef IAMSUID /* actually, this is caught earlier */
2070 if (euid != uid && !euid) { /* if running suidperl */
2072 (void)seteuid(uid); /* musn't stay setuid root */
2075 (void)setreuid((Uid_t)-1, uid);
2077 #ifdef HAS_SETRESUID
2078 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2084 if (geteuid() != uid)
2085 croak("Can't do seteuid!\n");
2087 #endif /* IAMSUID */
2088 rsfp = my_popen(SvPVX(cmd), "r");
2092 else if (!*scriptname) {
2093 forbid_setid("program input from stdin");
2094 rsfp = PerlIO_stdin();
2097 rsfp = PerlIO_open(scriptname,"r");
2098 #if defined(HAS_FCNTL) && defined(F_SETFD)
2100 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2108 #ifndef IAMSUID /* in case script is not readable before setuid */
2109 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2110 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2112 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2113 croak("Can't do setuid\n");
2117 croak("Can't open perl script \"%s\": %s\n",
2118 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2123 validate_suid(validarg, scriptname)
2129 /* do we need to emulate setuid on scripts? */
2131 /* This code is for those BSD systems that have setuid #! scripts disabled
2132 * in the kernel because of a security problem. Merely defining DOSUID
2133 * in perl will not fix that problem, but if you have disabled setuid
2134 * scripts in the kernel, this will attempt to emulate setuid and setgid
2135 * on scripts that have those now-otherwise-useless bits set. The setuid
2136 * root version must be called suidperl or sperlN.NNN. If regular perl
2137 * discovers that it has opened a setuid script, it calls suidperl with
2138 * the same argv that it had. If suidperl finds that the script it has
2139 * just opened is NOT setuid root, it sets the effective uid back to the
2140 * uid. We don't just make perl setuid root because that loses the
2141 * effective uid we had before invoking perl, if it was different from the
2144 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2145 * be defined in suidperl only. suidperl must be setuid root. The
2146 * Configure script will set this up for you if you want it.
2152 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2153 croak("Can't stat script \"%s\"",origfilename);
2154 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2158 #ifndef HAS_SETREUID
2159 /* On this access check to make sure the directories are readable,
2160 * there is actually a small window that the user could use to make
2161 * filename point to an accessible directory. So there is a faint
2162 * chance that someone could execute a setuid script down in a
2163 * non-accessible directory. I don't know what to do about that.
2164 * But I don't think it's too important. The manual lies when
2165 * it says access() is useful in setuid programs.
2167 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2168 croak("Permission denied");
2170 /* If we can swap euid and uid, then we can determine access rights
2171 * with a simple stat of the file, and then compare device and
2172 * inode to make sure we did stat() on the same file we opened.
2173 * Then we just have to make sure he or she can execute it.
2176 struct stat tmpstatbuf;
2180 setreuid(euid,uid) < 0
2183 setresuid(euid,uid,(Uid_t)-1) < 0
2186 || getuid() != euid || geteuid() != uid)
2187 croak("Can't swap uid and euid"); /* really paranoid */
2188 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2189 croak("Permission denied"); /* testing full pathname here */
2190 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2191 tmpstatbuf.st_ino != statbuf.st_ino) {
2192 (void)PerlIO_close(rsfp);
2193 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2195 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2196 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2197 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2198 (long)statbuf.st_dev, (long)statbuf.st_ino,
2199 SvPVX(GvSV(curcop->cop_filegv)),
2200 (long)statbuf.st_uid, (long)statbuf.st_gid);
2201 (void)my_pclose(rsfp);
2203 croak("Permission denied\n");
2207 setreuid(uid,euid) < 0
2209 # if defined(HAS_SETRESUID)
2210 setresuid(uid,euid,(Uid_t)-1) < 0
2213 || getuid() != uid || geteuid() != euid)
2214 croak("Can't reswap uid and euid");
2215 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2216 croak("Permission denied\n");
2218 #endif /* HAS_SETREUID */
2219 #endif /* IAMSUID */
2221 if (!S_ISREG(statbuf.st_mode))
2222 croak("Permission denied");
2223 if (statbuf.st_mode & S_IWOTH)
2224 croak("Setuid/gid script is writable by world");
2225 doswitches = FALSE; /* -s is insecure in suid */
2227 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2228 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2229 croak("No #! line");
2230 s = SvPV(linestr,na)+2;
2232 while (!isSPACE(*s)) s++;
2233 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2234 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2235 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2236 croak("Not a perl script");
2237 while (*s == ' ' || *s == '\t') s++;
2239 * #! arg must be what we saw above. They can invoke it by
2240 * mentioning suidperl explicitly, but they may not add any strange
2241 * arguments beyond what #! says if they do invoke suidperl that way.
2243 len = strlen(validarg);
2244 if (strEQ(validarg," PHOOEY ") ||
2245 strnNE(s,validarg,len) || !isSPACE(s[len]))
2246 croak("Args must match #! line");
2249 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2250 euid == statbuf.st_uid)
2252 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2253 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2254 #endif /* IAMSUID */
2256 if (euid) { /* oops, we're not the setuid root perl */
2257 (void)PerlIO_close(rsfp);
2260 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2262 croak("Can't do setuid\n");
2265 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2267 (void)setegid(statbuf.st_gid);
2270 (void)setregid((Gid_t)-1,statbuf.st_gid);
2272 #ifdef HAS_SETRESGID
2273 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2275 setgid(statbuf.st_gid);
2279 if (getegid() != statbuf.st_gid)
2280 croak("Can't do setegid!\n");
2282 if (statbuf.st_mode & S_ISUID) {
2283 if (statbuf.st_uid != euid)
2285 (void)seteuid(statbuf.st_uid); /* all that for this */
2288 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2290 #ifdef HAS_SETRESUID
2291 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2293 setuid(statbuf.st_uid);
2297 if (geteuid() != statbuf.st_uid)
2298 croak("Can't do seteuid!\n");
2300 else if (uid) { /* oops, mustn't run as root */
2302 (void)seteuid((Uid_t)uid);
2305 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2307 #ifdef HAS_SETRESUID
2308 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2314 if (geteuid() != uid)
2315 croak("Can't do seteuid!\n");
2318 if (!cando(S_IXUSR,TRUE,&statbuf))
2319 croak("Permission denied\n"); /* they can't do this */
2322 else if (preprocess)
2323 croak("-P not allowed for setuid/setgid script\n");
2324 else if (fdscript >= 0)
2325 croak("fd script not allowed in suidperl\n");
2327 croak("Script is not setuid/setgid in suidperl\n");
2329 /* We absolutely must clear out any saved ids here, so we */
2330 /* exec the real perl, substituting fd script for scriptname. */
2331 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2332 PerlIO_rewind(rsfp);
2333 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2334 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2335 if (!origargv[which])
2336 croak("Permission denied");
2337 origargv[which] = savepv(form("/dev/fd/%d/%s",
2338 PerlIO_fileno(rsfp), origargv[which]));
2339 #if defined(HAS_FCNTL) && defined(F_SETFD)
2340 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2342 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2343 croak("Can't do setuid\n");
2344 #endif /* IAMSUID */
2346 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2347 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2349 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2350 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2352 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2355 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2356 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2357 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2358 /* not set-id, must be wrapped */
2366 register char *s, *s2;
2368 /* skip forward in input to the real script? */
2372 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2373 croak("No Perl script found in input\n");
2374 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2375 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2377 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2379 while (*s == ' ' || *s == '\t') s++;
2381 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2382 if (strnEQ(s2-4,"perl",4))
2384 while (s = moreswitches(s)) ;
2386 if (cddir && chdir(cddir) < 0)
2387 croak("Can't chdir to %s",cddir);
2395 uid = (int)getuid();
2396 euid = (int)geteuid();
2397 gid = (int)getgid();
2398 egid = (int)getegid();
2403 tainting |= (uid && (euid != uid || egid != gid));
2411 croak("No %s allowed while running setuid", s);
2413 croak("No %s allowed while running setgid", s);
2420 curstash = debstash;
2421 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2423 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2424 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2425 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2426 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2427 sv_setiv(DBsingle, 0);
2428 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2429 sv_setiv(DBtrace, 0);
2430 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2431 sv_setiv(DBsignal, 0);
2432 curstash = defstash;
2440 mainstack = curstack; /* remember in case we switch stacks */
2441 AvREAL_off(curstack); /* not a real array */
2442 av_extend(curstack,127);
2444 stack_base = AvARRAY(curstack);
2445 stack_sp = stack_base;
2446 stack_max = stack_base + 127;
2448 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2449 New(50,cxstack,cxstack_max + 1,CONTEXT);
2452 New(50,tmps_stack,128,SV*);
2458 * The following stacks almost certainly should be per-interpreter,
2459 * but for now they're not. XXX
2463 markstack_ptr = markstack;
2465 New(54,markstack,64,I32);
2466 markstack_ptr = markstack;
2467 markstack_max = markstack + 64;
2473 New(54,scopestack,32,I32);
2475 scopestack_max = 32;
2481 New(54,savestack,128,ANY);
2483 savestack_max = 128;
2489 New(54,retstack,16,OP*);
2500 Safefree(tmps_stack);
2507 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2516 subname = newSVpv("main",4);
2520 init_predump_symbols()
2526 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2528 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2529 GvMULTI_on(stdingv);
2530 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2531 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2533 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2535 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2537 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2539 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2541 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2543 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2544 GvMULTI_on(othergv);
2545 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2546 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2548 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2550 statname = NEWSV(66,0); /* last filename we did stat on */
2553 osname = savepv(OSNAME);
2557 init_postdump_symbols(argc,argv,env)
2559 register char **argv;
2560 register char **env;
2566 argc--,argv++; /* skip name of script */
2568 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2571 if (argv[0][1] == '-') {
2575 if (s = strchr(argv[0], '=')) {
2577 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2580 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2583 toptarget = NEWSV(0,0);
2584 sv_upgrade(toptarget, SVt_PVFM);
2585 sv_setpvn(toptarget, "", 0);
2586 bodytarget = NEWSV(0,0);
2587 sv_upgrade(bodytarget, SVt_PVFM);
2588 sv_setpvn(bodytarget, "", 0);
2589 formtarget = bodytarget;
2592 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2593 sv_setpv(GvSV(tmpgv),origfilename);
2594 magicname("0", "0", 1);
2596 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2597 sv_setpv(GvSV(tmpgv),origargv[0]);
2598 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2600 (void)gv_AVadd(argvgv);
2601 av_clear(GvAVn(argvgv));
2602 for (; argc > 0; argc--,argv++) {
2603 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2606 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2610 hv_magic(hv, envgv, 'E');
2611 #ifndef VMS /* VMS doesn't have environ array */
2612 /* Note that if the supplied env parameter is actually a copy
2613 of the global environ then it may now point to free'd memory
2614 if the environment has been modified since. To avoid this
2615 problem we treat env==NULL as meaning 'use the default'
2620 environ[0] = Nullch;
2621 for (; *env; env++) {
2622 if (!(s = strchr(*env,'=')))
2628 sv = newSVpv(s--,0);
2629 (void)hv_store(hv, *env, s - *env, sv, 0);
2631 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2632 /* Sins of the RTL. See note in my_setenv(). */
2633 (void)putenv(savepv(*env));
2637 #ifdef DYNAMIC_ENV_FETCH
2638 HvNAME(hv) = savepv(ENV_HV_NAME);
2642 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2643 sv_setiv(GvSV(tmpgv), (IV)getpid());
2652 s = getenv("PERL5LIB");
2656 incpush(getenv("PERLLIB"), FALSE);
2658 /* Treat PERL5?LIB as a possible search list logical name -- the
2659 * "natural" VMS idiom for a Unix path string. We allow each
2660 * element to be a set of |-separated directories for compatibility.
2664 if (my_trnlnm("PERL5LIB",buf,0))
2665 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2667 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2671 /* Use the ~-expanded versions of APPLLIB (undocumented),
2672 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2675 incpush(APPLLIB_EXP, FALSE);
2679 incpush(ARCHLIB_EXP, FALSE);
2682 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2684 incpush(PRIVLIB_EXP, FALSE);
2687 incpush(SITEARCH_EXP, FALSE);
2690 incpush(SITELIB_EXP, FALSE);
2692 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2693 incpush(OLDARCHLIB_EXP, FALSE);
2697 incpush(".", FALSE);
2701 # define PERLLIB_SEP ';'
2704 # define PERLLIB_SEP '|'
2706 # define PERLLIB_SEP ':'
2709 #ifndef PERLLIB_MANGLE
2710 # define PERLLIB_MANGLE(s,n) (s)
2714 incpush(p, addsubdirs)
2718 SV *subdir = Nullsv;
2719 static char *archpat_auto;
2726 if (!archpat_auto) {
2727 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2728 + sizeof("//auto"));
2729 New(55, archpat_auto, len, char);
2730 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2732 for (len = sizeof(ARCHNAME) + 2;
2733 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2734 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2739 /* Break at all separators */
2741 SV *libdir = newSV(0);
2744 /* skip any consecutive separators */
2745 while ( *p == PERLLIB_SEP ) {
2746 /* Uncomment the next line for PATH semantics */
2747 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2751 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2752 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2757 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2758 p = Nullch; /* break out */
2762 * BEFORE pushing libdir onto @INC we may first push version- and
2763 * archname-specific sub-directories.
2766 struct stat tmpstatbuf;
2771 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2773 while (unix[len-1] == '/') len--; /* Cosmetic */
2774 sv_usepvn(libdir,unix,len);
2777 PerlIO_printf(PerlIO_stderr(),
2778 "Failed to unixify @INC element \"%s\"\n",
2781 /* .../archname/version if -d .../archname/version/auto */
2782 sv_setsv(subdir, libdir);
2783 sv_catpv(subdir, archpat_auto);
2784 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2785 S_ISDIR(tmpstatbuf.st_mode))
2786 av_push(GvAVn(incgv),
2787 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2789 /* .../archname if -d .../archname/auto */
2790 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2791 strlen(patchlevel) + 1, "", 0);
2792 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2793 S_ISDIR(tmpstatbuf.st_mode))
2794 av_push(GvAVn(incgv),
2795 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2798 /* finally push this lib directory on the end of @INC */
2799 av_push(GvAVn(incgv), libdir);
2802 SvREFCNT_dec(subdir);
2806 call_list(oldscope, list)
2811 line_t oldline = curcop->cop_line;
2816 while (AvFILL(list) >= 0) {
2817 CV *cv = (CV*)av_shift(list);
2824 SV* atsv = GvSV(errgv);
2826 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2827 (void)SvPV(atsv, len);
2830 curcop = &compiling;
2831 curcop->cop_line = oldline;
2832 if (list == beginav)
2833 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2835 sv_catpv(atsv, "END failed--cleanup aborted");
2836 while (scopestack_ix > oldscope)
2838 croak("%s", SvPVX(atsv));
2846 /* my_exit() was called */
2847 while (scopestack_ix > oldscope)
2850 curstash = defstash;
2852 call_list(oldscope, endav);
2854 curcop = &compiling;
2855 curcop->cop_line = oldline;
2857 if (list == beginav)
2858 croak("BEGIN failed--compilation aborted");
2860 croak("END failed--cleanup aborted");
2866 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2871 curcop = &compiling;
2872 curcop->cop_line = oldline;
2886 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread 0x%lx, status %lu\n",
2887 (unsigned long) thr, (unsigned long) status));
2888 #endif /* USE_THREADS */
2897 STATUS_NATIVE_SET(status);
2907 if (vaxc$errno & 1) {
2908 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2909 STATUS_NATIVE_SET(44);
2912 if (!vaxc$errno && errno) /* unlikely */
2913 STATUS_NATIVE_SET(44);
2915 STATUS_NATIVE_SET(vaxc$errno);
2919 STATUS_POSIX_SET(errno);
2920 else if (STATUS_POSIX == 0)
2921 STATUS_POSIX_SET(255);
2930 register CONTEXT *cx;
2939 (void)UNLINK(e_tmpname);
2940 Safefree(e_tmpname);
2944 if (cxstack_ix >= 0) {