3 * Copyright (c) 1987-1997 Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
16 #include "patchlevel.h"
18 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
23 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
24 char *getenv _((char *)); /* Usually in <stdlib.h> */
27 dEXTCONST char rcsid[] = "perl.c\nPatch level: ###\n";
35 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
45 curcop = &compiling; \
52 laststype = OP_STAT; \
54 maxsysfd = MAXSYSFD; \
61 laststype = OP_STAT; \
65 static void find_beginning _((void));
66 static void forbid_setid _((char *));
67 static void incpush _((char *, int));
68 static void init_ids _((void));
69 static void init_debugger _((void));
70 static void init_lexer _((void));
71 static void init_main_stash _((void));
73 static struct thread * init_main_thread _((void));
74 #endif /* USE_THREADS */
75 static void init_perllib _((void));
76 static void init_postdump_symbols _((int, char **, char **));
77 static void init_predump_symbols _((void));
78 static void my_exit_jump _((void)) __attribute__((noreturn));
79 static void nuke_stacks _((void));
80 static void open_script _((char *, bool, SV *));
81 static void usage _((char *));
82 static void validate_suid _((char *, char*));
84 static int fdscript = -1;
86 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
87 #include <asm/sigcontext.h>
89 catch_sigsegv(int signo, struct sigcontext_struct sc)
91 signal(SIGSEGV, SIG_DFL);
92 fprintf(stderr, "Segmentation fault dereferencing 0x%lx\n"
93 "return_address = 0x%lx, eip = 0x%lx\n",
94 sc.cr2, __builtin_return_address(0), sc.eip);
95 fprintf(stderr, "thread = 0x%lx\n", (unsigned long)THR);
102 PerlInterpreter *sv_interp;
105 New(53, sv_interp, 1, PerlInterpreter);
110 perl_construct(register PerlInterpreter *sv_interp)
112 #if defined(USE_THREADS) && !defined(FAKE_THREADS)
116 if (!(curinterp = sv_interp))
120 Zero(sv_interp, 1, PerlInterpreter);
123 /* Init the real globals (and main thread)? */
129 Newz(53, thr, 1, struct thread);
130 MUTEX_INIT(&malloc_mutex);
131 MUTEX_INIT(&sv_mutex);
132 /* Safe to use SVs from now on */
133 MUTEX_INIT(&eval_mutex);
134 COND_INIT(&eval_cond);
135 MUTEX_INIT(&threads_mutex);
136 COND_INIT(&nthreads_cond);
138 thr = init_main_thread();
139 #endif /* USE_THREADS */
141 linestr = NEWSV(65,80);
142 sv_upgrade(linestr,SVt_PVIV);
144 if (!SvREADONLY(&sv_undef)) {
145 SvREADONLY_on(&sv_undef);
149 SvREADONLY_on(&sv_no);
151 sv_setpv(&sv_yes,Yes);
153 SvREADONLY_on(&sv_yes);
156 nrs = newSVpv("\n", 1);
157 rs = SvREFCNT_inc(nrs);
159 sighandlerp = sighandler;
164 * There is no way we can refer to them from Perl so close them to save
165 * space. The other alternative would be to provide STDAUX and STDPRN
168 (void)fclose(stdaux);
169 (void)fclose(stdprn);
175 perl_destruct_level = 1;
177 if(perl_destruct_level > 0)
182 lex_state = LEX_NOTPARSING;
184 start_env.je_prev = NULL;
185 start_env.je_ret = -1;
186 start_env.je_mustcatch = TRUE;
187 top_env = &start_env;
190 SET_NUMERIC_STANDARD();
191 #if defined(SUBVERSION) && SUBVERSION > 0
192 sprintf(patchlevel, "%7.5f", (double) 5
193 + ((double) PATCHLEVEL / (double) 1000)
194 + ((double) SUBVERSION / (double) 100000));
196 sprintf(patchlevel, "%5.3f", (double) 5 +
197 ((double) PATCHLEVEL / (double) 1000));
200 #if defined(LOCAL_PATCH_COUNT)
201 localpatches = local_patches; /* For possible -v */
204 PerlIO_init(); /* Hook to IO system */
206 fdpid = newAV(); /* for remembering popen pids by fd */
210 New(51,debname,128,char);
211 New(52,debdelim,128,char);
218 perl_destruct(register PerlInterpreter *sv_interp)
221 int destruct_level; /* 0=none, 1=full, 2=full with checks */
226 #endif /* USE_THREADS */
228 if (!(curinterp = sv_interp))
233 /* Pass 1 on any remaining threads: detach joinables, join zombies */
235 MUTEX_LOCK(&threads_mutex);
236 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
237 "perl_destruct: waiting for %d threads...\n",
239 for (t = thr->next; t != thr; t = t->next) {
240 MUTEX_LOCK(&t->mutex);
241 switch (ThrSTATE(t)) {
244 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
245 "perl_destruct: joining zombie %p\n", t));
246 ThrSETSTATE(t, THRf_DEAD);
247 MUTEX_UNLOCK(&t->mutex);
250 * The SvREFCNT_dec below may take a long time (e.g. av
251 * may contain an object scalar whose destructor gets
252 * called) so we have to unlock threads_mutex and start
255 MUTEX_UNLOCK(&threads_mutex);
257 SvREFCNT_dec((SV*)av);
258 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
259 "perl_destruct: joined zombie %p OK\n", t));
261 case THRf_R_JOINABLE:
262 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
263 "perl_destruct: detaching thread %p\n", t));
264 ThrSETSTATE(t, THRf_R_DETACHED);
266 * We unlock threads_mutex and t->mutex in the opposite order
267 * from which we locked them just so that DETACH won't
268 * deadlock if it panics. It's only a breach of good style
269 * not a bug since they are unlocks not locks.
271 MUTEX_UNLOCK(&threads_mutex);
273 MUTEX_UNLOCK(&t->mutex);
276 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
277 "perl_destruct: ignoring %p (state %u)\n",
279 MUTEX_UNLOCK(&t->mutex);
280 /* fall through and out */
283 /* We leave the above "Pass 1" loop with threads_mutex still locked */
285 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
288 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
289 "perl_destruct: final wait for %d threads\n",
291 COND_WAIT(&nthreads_cond, &threads_mutex);
293 /* At this point, we're the last thread */
294 MUTEX_UNLOCK(&threads_mutex);
295 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
296 MUTEX_DESTROY(&threads_mutex);
297 COND_DESTROY(&nthreads_cond);
298 #endif /* !defined(FAKE_THREADS) */
299 #endif /* USE_THREADS */
301 destruct_level = perl_destruct_level;
305 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
307 if (destruct_level < i)
316 /* We must account for everything. */
318 /* Destroy the main CV and syntax tree */
320 curpad = AvARRAY(comppad);
325 SvREFCNT_dec(main_cv);
330 * Try to destruct global references. We do this first so that the
331 * destructors and destructees still exist. Some sv's might remain.
332 * Non-referenced objects are on their own.
339 /* unhook hooks which will soon be, or use, destroyed data */
340 SvREFCNT_dec(warnhook);
342 SvREFCNT_dec(diehook);
344 SvREFCNT_dec(parsehook);
347 if (destruct_level == 0){
349 DEBUG_P(debprofdump());
351 /* The exit() function will do everything that needs doing. */
355 /* loosen bonds of global variables */
358 (void)PerlIO_close(rsfp);
362 /* Filters for program text */
363 SvREFCNT_dec(rsfp_filters);
364 rsfp_filters = Nullav;
376 sawampersand = FALSE; /* must save all match strings */
377 sawstudy = FALSE; /* do fbm_instr on all strings */
392 /* magical thingies */
394 Safefree(ofs); /* $, */
397 Safefree(ors); /* $\ */
400 SvREFCNT_dec(nrs); /* $\ helper */
403 multiline = 0; /* $* */
405 SvREFCNT_dec(statname);
409 /* defgv, aka *_ should be taken care of elsewhere */
411 #if 0 /* just about all regexp stuff, seems to be ok */
413 /* shortcuts to regexp stuff */
418 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
420 regprecomp = NULL; /* uncompiled string. */
421 regparse = NULL; /* Input-scan pointer. */
422 regxend = NULL; /* End of input for compile */
423 regnpar = 0; /* () count. */
424 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
425 regsize = 0; /* Code size. */
426 regnaughty = 0; /* How bad is this pattern? */
427 regsawback = 0; /* Did we see \1, ...? */
429 reginput = NULL; /* String-input pointer. */
430 regbol = NULL; /* Beginning of input, for ^ check. */
431 regeol = NULL; /* End of input, for $ check. */
432 regstartp = (char **)NULL; /* Pointer to startp array. */
433 regendp = (char **)NULL; /* Ditto for endp. */
434 reglastparen = 0; /* Similarly for lastparen. */
435 regtill = NULL; /* How far we are required to go. */
436 regflags = 0; /* are we folding, multilining? */
437 regprev = (char)NULL; /* char before regbol, \n if none */
441 /* clean up after study() */
442 SvREFCNT_dec(lastscream);
444 Safefree(screamfirst);
446 Safefree(screamnext);
449 /* startup and shutdown function lists */
450 SvREFCNT_dec(beginav);
452 SvREFCNT_dec(initav);
457 /* temp stack during pp_sort() */
458 SvREFCNT_dec(sortstack);
461 /* shortcuts just get cleared */
471 /* reset so print() ends up where we expect */
474 /* Prepare to destruct main symbol table. */
481 if (destruct_level >= 2) {
482 if (scopestack_ix != 0)
483 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
484 (long)scopestack_ix);
485 if (savestack_ix != 0)
486 warn("Unbalanced saves: %ld more saves than restores\n",
488 if (tmps_floor != -1)
489 warn("Unbalanced tmps: %ld more allocs than frees\n",
490 (long)tmps_floor + 1);
491 if (cxstack_ix != -1)
492 warn("Unbalanced context: %ld more PUSHes than POPs\n",
493 (long)cxstack_ix + 1);
496 /* Now absolutely destruct everything, somehow or other, loops or no. */
498 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
499 while (sv_count != 0 && sv_count != last_sv_count) {
500 last_sv_count = sv_count;
503 SvFLAGS(strtab) &= ~SVTYPEMASK;
504 SvFLAGS(strtab) |= SVt_PVHV;
506 /* Destruct the global string table. */
508 /* Yell and reset the HeVAL() slots that are still holding refcounts,
509 * so that sv_free() won't fail on them.
518 array = HvARRAY(strtab);
522 warn("Unbalanced string table refcount: (%d) for \"%s\"",
523 HeVAL(hent) - Nullsv, HeKEY(hent));
524 HeVAL(hent) = Nullsv;
534 SvREFCNT_dec(strtab);
537 warn("Scalars leaked: %ld\n", (long)sv_count);
541 /* No SVs have survived, need to clean out */
545 Safefree(origfilename);
547 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
549 DEBUG_P(debprofdump());
551 MUTEX_DESTROY(&sv_mutex);
552 MUTEX_DESTROY(&malloc_mutex);
553 MUTEX_DESTROY(&eval_mutex);
554 COND_DESTROY(&eval_cond);
556 /* As the penultimate thing, free the non-arena SV for thrsv */
557 Safefree(SvPVX(thrsv));
558 Safefree(SvANY(thrsv));
561 #endif /* USE_THREADS */
563 /* As the absolutely last thing, free the non-arena SV for mess() */
566 /* we know that type >= SVt_PV */
568 Safefree(SvPVX(mess_sv));
569 Safefree(SvANY(mess_sv));
576 perl_free(PerlInterpreter *sv_interp)
578 if (!(curinterp = sv_interp))
584 perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
589 char *scriptname = NULL;
590 VOL bool dosearch = FALSE;
597 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
600 croak("suidperl is no longer needed since the kernel can now execute\n\
601 setuid perl scripts securely.\n");
605 if (!(curinterp = sv_interp))
608 #if defined(NeXT) && defined(__DYNAMIC__)
609 _dyld_lookup_and_bind
610 ("__environ", (unsigned long *) &environ_pointer, NULL);
615 #ifndef VMS /* VMS doesn't have environ array */
616 origenviron = environ;
622 /* Come here if running an undumped a.out. */
624 origfilename = savepv(argv[0]);
626 cxstack_ix = -1; /* start label stack again */
628 init_postdump_symbols(argc,argv,env);
633 curpad = AvARRAY(comppad);
638 SvREFCNT_dec(main_cv);
642 oldscope = scopestack_ix;
650 /* my_exit() was called */
651 while (scopestack_ix > oldscope)
656 call_list(oldscope, endav);
658 return STATUS_NATIVE_EXPORT;
661 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
665 sv_setpvn(linestr,"",0);
666 sv = newSVpv("",0); /* first used for -I flags */
670 for (argc--,argv++; argc > 0; argc--,argv++) {
671 if (argv[0][0] != '-' || !argv[0][1])
675 validarg = " PHOOEY ";
700 if (s = moreswitches(s))
710 if (euid != uid || egid != gid)
711 croak("No -e allowed in setuid scripts");
713 e_tmpname = savepv(TMPPATH);
714 (void)mktemp(e_tmpname);
716 croak("Can't mktemp()");
717 e_fp = PerlIO_open(e_tmpname,"w");
719 croak("Cannot open temporary file");
724 PerlIO_puts(e_fp,argv[1]);
728 croak("No code specified for -e");
729 (void)PerlIO_putc(e_fp,'\n');
731 case 'I': /* -I handled both here and in moreswitches() */
733 if (!*++s && (s=argv[1]) != Nullch) {
736 while (s && isSPACE(*s))
740 for (e = s; *e && !isSPACE(*e); e++) ;
747 } /* XXX else croak? */
761 preambleav = newAV();
762 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
764 Sv = newSVpv("print myconfig();",0);
766 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
768 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
770 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
771 sv_catpv(Sv,"\" Compile-time options:");
773 sv_catpv(Sv," DEBUGGING");
776 sv_catpv(Sv," NO_EMBED");
779 sv_catpv(Sv," MULTIPLICITY");
781 sv_catpv(Sv,"\\n\",");
783 #if defined(LOCAL_PATCH_COUNT)
784 if (LOCAL_PATCH_COUNT > 0) {
786 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
787 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
789 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
793 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
796 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
798 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
803 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
804 print \" \\%ENV:\\n @env\\n\" if @env; \
805 print \" \\@INC:\\n @INC\\n\";");
808 Sv = newSVpv("config_vars(qw(",0);
813 av_push(preambleav, Sv);
814 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
825 if (!*++s || isSPACE(*s)) {
829 /* catch use of gnu style long options */
830 if (strEQ(s, "version")) {
834 if (strEQ(s, "help")) {
841 croak("Unrecognized switch: -%s (-h will show valid options)",s);
846 if (!tainting && (s = getenv("PERL5OPT"))) {
857 if (!strchr("DIMUdmw", *s))
858 croak("Illegal switch in PERL5OPT: -%c", *s);
864 scriptname = argv[0];
866 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
868 warn("Did you forget to compile with -DMULTIPLICITY?");
870 croak("Can't write to temp file for -e: %s", Strerror(errno));
874 scriptname = e_tmpname;
876 else if (scriptname == Nullch) {
878 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
886 open_script(scriptname,dosearch,sv);
888 validate_suid(validarg, scriptname);
893 main_cv = compcv = (CV*)NEWSV(1104,0);
894 sv_upgrade((SV *)compcv, SVt_PVCV);
898 av_push(comppad, Nullsv);
899 curpad = AvARRAY(comppad);
900 comppad_name = newAV();
901 comppad_name_fill = 0;
902 min_intro_pending = 0;
905 av_store(comppad_name, 0, newSVpv("@_", 2));
906 curpad[0] = (SV*)newAV();
907 SvPADMY_on(curpad[0]); /* XXX Needed? */
909 New(666, CvMUTEXP(compcv), 1, perl_mutex);
910 MUTEX_INIT(CvMUTEXP(compcv));
911 #endif /* USE_THREADS */
913 comppadlist = newAV();
914 AvREAL_off(comppadlist);
915 av_store(comppadlist, 0, (SV*)comppad_name);
916 av_store(comppadlist, 1, (SV*)comppad);
917 CvPADLIST(compcv) = comppadlist;
919 boot_core_UNIVERSAL();
921 (*xsinit)(); /* in case linked C routines want magical variables */
922 #if defined(VMS) || defined(WIN32)
926 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
927 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
930 init_predump_symbols();
932 init_postdump_symbols(argc,argv,env);
936 /* now parse the script */
939 if (yyparse() || error_count) {
941 croak("%s had compilation errors.\n", origfilename);
943 croak("Execution of %s aborted due to compilation errors.\n",
947 curcop->cop_line = 0;
951 (void)UNLINK(e_tmpname);
956 /* now that script is parsed, we can modify record separator */
958 rs = SvREFCNT_inc(nrs);
960 sv_setsv(*av_fetch(thr->magicals, find_thread_magical("/"), FALSE), rs);
962 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
974 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
975 dump_mstats("after compilation:");
985 perl_run(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(char *name, I32 create)
1072 GV* gv = gv_fetchpv(name, create, SVt_PV);
1079 perl_get_av(char *name, I32 create)
1081 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1090 perl_get_hv(char *name, I32 create)
1092 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1101 perl_get_cv(char *name, I32 create)
1103 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1104 if (create && !GvCVu(gv))
1105 return newSUB(start_subparse(FALSE, 0),
1106 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1114 /* Be sure to refetch the stack pointer after calling these routines. */
1117 perl_call_argv(char *subname, I32 flags, register char **argv)
1119 /* See G_* flags in cop.h */
1120 /* null terminated arg list */
1127 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1132 return perl_call_pv(subname, flags);
1136 perl_call_pv(char *subname, I32 flags)
1137 /* name of the subroutine */
1138 /* See G_* flags in cop.h */
1140 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1144 perl_call_method(char *methname, I32 flags)
1145 /* name of the subroutine */
1146 /* See G_* flags in cop.h */
1152 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1155 return perl_call_sv(*stack_sp--, flags);
1158 /* May be called with any of a CV, a GV, or an SV containing the name. */
1160 perl_call_sv(SV *sv, I32 flags)
1162 /* See G_* flags in cop.h */
1165 LOGOP myop; /* fake syntax tree node */
1171 bool oldcatch = CATCH_GET;
1176 if (flags & G_DISCARD) {
1181 Zero(&myop, 1, LOGOP);
1182 myop.op_next = Nullop;
1183 if (!(flags & G_NOARGS))
1184 myop.op_flags |= OPf_STACKED;
1185 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1186 (flags & G_ARRAY) ? OPf_WANT_LIST :
1191 EXTEND(stack_sp, 1);
1194 oldscope = scopestack_ix;
1196 if (PERLDB_SUB && curstash != debstash
1197 /* Handle first BEGIN of -d. */
1198 && (DBcv || (DBcv = GvCV(DBsub)))
1199 /* Try harder, since this may have been a sighandler, thus
1200 * curstash may be meaningless. */
1201 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1202 op->op_private |= OPpENTERSUB_DB;
1204 if (flags & G_EVAL) {
1205 cLOGOP->op_other = op;
1207 /* we're trying to emulate pp_entertry() here */
1209 register CONTEXT *cx;
1210 I32 gimme = GIMME_V;
1215 push_return(op->op_next);
1216 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1218 eval_root = op; /* Only needed so that goto works right. */
1221 if (flags & G_KEEPERR)
1224 sv_setpv(GvSV(errgv),"");
1236 /* my_exit() was called */
1237 curstash = defstash;
1241 croak("Callback called exit");
1250 stack_sp = stack_base + oldmark;
1251 if (flags & G_ARRAY)
1255 *++stack_sp = &sv_undef;
1263 if (op == (OP*)&myop)
1264 op = pp_entersub(ARGS);
1267 retval = stack_sp - (stack_base + oldmark);
1268 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1269 sv_setpv(GvSV(errgv),"");
1272 if (flags & G_EVAL) {
1273 if (scopestack_ix > oldscope) {
1277 register CONTEXT *cx;
1289 CATCH_SET(oldcatch);
1291 if (flags & G_DISCARD) {
1292 stack_sp = stack_base + oldmark;
1301 /* Eval a string. The G_EVAL flag is always assumed. */
1304 perl_eval_sv(SV *sv, I32 flags)
1306 /* See G_* flags in cop.h */
1309 UNOP myop; /* fake syntax tree node */
1311 I32 oldmark = sp - stack_base;
1318 if (flags & G_DISCARD) {
1326 EXTEND(stack_sp, 1);
1328 oldscope = scopestack_ix;
1330 if (!(flags & G_NOARGS))
1331 myop.op_flags = OPf_STACKED;
1332 myop.op_next = Nullop;
1333 myop.op_type = OP_ENTEREVAL;
1334 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1335 (flags & G_ARRAY) ? OPf_WANT_LIST :
1337 if (flags & G_KEEPERR)
1338 myop.op_flags |= OPf_SPECIAL;
1348 /* my_exit() was called */
1349 curstash = defstash;
1353 croak("Callback called exit");
1362 stack_sp = stack_base + oldmark;
1363 if (flags & G_ARRAY)
1367 *++stack_sp = &sv_undef;
1372 if (op == (OP*)&myop)
1373 op = pp_entereval(ARGS);
1376 retval = stack_sp - (stack_base + oldmark);
1377 if (!(flags & G_KEEPERR))
1378 sv_setpv(GvSV(errgv),"");
1382 if (flags & G_DISCARD) {
1383 stack_sp = stack_base + oldmark;
1393 perl_eval_pv(char *p, I32 croak_on_error)
1396 SV* sv = newSVpv(p, 0);
1399 perl_eval_sv(sv, G_SCALAR);
1406 if (croak_on_error && SvTRUE(GvSV(errgv)))
1407 croak(SvPVx(GvSV(errgv), na));
1412 /* Require a module. */
1415 perl_require_pv(char *pv)
1417 SV* sv = sv_newmortal();
1418 sv_setpv(sv, "require '");
1421 perl_eval_sv(sv, G_DISCARD);
1425 magicname(char *sym, char *name, I32 namlen)
1429 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1430 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1434 usage(char *name) /* XXX move this out into a module ? */
1437 /* This message really ought to be max 23 lines.
1438 * Removed -h because the user already knows that opton. Others? */
1440 static char *usage[] = {
1441 "-0[octal] specify record separator (\\0, if no argument)",
1442 "-a autosplit mode with -n or -p (splits $_ into @F)",
1443 "-c check syntax only (runs BEGIN and END blocks)",
1444 "-d[:debugger] run scripts under debugger",
1445 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1446 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1447 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1448 "-i[extension] edit <> files in place (make backup if extension supplied)",
1449 "-Idirectory specify @INC/#include directory (may be used more than once)",
1450 "-l[octal] enable line ending processing, specifies line terminator",
1451 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1452 "-n assume 'while (<>) { ... }' loop around your script",
1453 "-p assume loop like -n but print line also like sed",
1454 "-P run script through C preprocessor before compilation",
1455 "-s enable some switch parsing for switches after script name",
1456 "-S look for the script using PATH environment variable",
1457 "-T turn on tainting checks",
1458 "-u dump core after parsing script",
1459 "-U allow unsafe operations",
1460 "-v print version number and patchlevel of perl",
1461 "-V[:variable] print perl configuration information",
1462 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1463 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1469 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1471 printf("\n %s", *p++);
1474 /* This routine handles any switches that can be given during run */
1477 moreswitches(char *s)
1484 rschar = scan_oct(s, 4, &numlen);
1486 if (rschar & ~((U8)~0))
1488 else if (!rschar && numlen >= 2)
1489 nrs = newSVpv("", 0);
1492 nrs = newSVpv(&ch, 1);
1497 splitstr = savepv(s + 1);
1511 if (*s == ':' || *s == '=') {
1512 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1516 perldb = PERLDB_ALL;
1523 if (isALPHA(s[1])) {
1524 static char debopts[] = "psltocPmfrxuLHXD";
1527 for (s++; *s && (d = strchr(debopts,*s)); s++)
1528 debug |= 1 << (d - debopts);
1532 for (s++; isDIGIT(*s); s++) ;
1534 debug |= 0x80000000;
1536 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1537 for (s++; isALNUM(*s); s++) ;
1547 inplace = savepv(s+1);
1549 for (s = inplace; *s && !isSPACE(*s); s++) ;
1553 case 'I': /* -I handled both here and in parse_perl() */
1556 while (*s && isSPACE(*s))
1560 for (e = s; *e && !isSPACE(*e); e++) ;
1561 p = savepvn(s, e-s);
1567 croak("No space allowed after -I");
1577 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1586 ors = SvPV(nrs, orslen);
1587 ors = savepvn(ors, orslen);
1591 forbid_setid("-M"); /* XXX ? */
1594 forbid_setid("-m"); /* XXX ? */
1599 /* -M-foo == 'no foo' */
1600 if (*s == '-') { use = "no "; ++s; }
1601 sv = newSVpv(use,0);
1603 /* We allow -M'Module qw(Foo Bar)' */
1604 while(isALNUM(*s) || *s==':') ++s;
1606 sv_catpv(sv, start);
1607 if (*(start-1) == 'm') {
1609 croak("Can't use '%c' after -mname", *s);
1610 sv_catpv( sv, " ()");
1613 sv_catpvn(sv, start, s-start);
1614 sv_catpv(sv, " split(/,/,q{");
1619 if (preambleav == NULL)
1620 preambleav = newAV();
1621 av_push(preambleav, sv);
1624 croak("No space allowed after -%c", *(s-1));
1641 croak("Too late for \"-T\" option");
1653 #if defined(SUBVERSION) && SUBVERSION > 0
1654 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1655 PATCHLEVEL, SUBVERSION, ARCHNAME);
1657 printf("\nThis is perl, version %s built for %s",
1658 patchlevel, ARCHNAME);
1660 #if defined(LOCAL_PATCH_COUNT)
1661 if (LOCAL_PATCH_COUNT > 0)
1662 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1663 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1666 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1668 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1671 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1674 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1675 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1678 printf("atariST series port, ++jrb bammi@cadence.com\n");
1681 Perl may be copied only under the terms of either the Artistic License or the\n\
1682 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1690 if (s[1] == '-') /* Additional switches on #! line. */
1698 #ifdef ALTERNATE_SHEBANG
1699 case 'S': /* OS/2 needs -S on "extproc" line. */
1707 croak("Can't emulate -%.1s on #! line",s);
1712 /* compliments of Tom Christiansen */
1714 /* unexec() can be found in the Gnu emacs distribution */
1725 prog = newSVpv(BIN_EXP);
1726 sv_catpv(prog, "/perl");
1727 file = newSVpv(origfilename);
1728 sv_catpv(file, ".perldump");
1730 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1732 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1733 SvPVX(prog), SvPVX(file));
1737 # include <lib$routines.h>
1738 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1740 ABORT(); /* for use with undump */
1746 init_main_stash(void)
1751 /* Note that strtab is a rather special HV. Assumptions are made
1752 about not iterating on it, and not adding tie magic to it.
1753 It is properly deallocated in perl_destruct() */
1755 HvSHAREKEYS_off(strtab); /* mandatory */
1756 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1757 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1759 curstash = defstash = newHV();
1760 curstname = newSVpv("main",4);
1761 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1762 SvREFCNT_dec(GvHV(gv));
1763 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1765 HvNAME(defstash) = savepv("main");
1766 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1768 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1769 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1771 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1772 sv_grow(GvSV(errgv), 240); /* Preallocate - for immediate signals. */
1773 sv_setpvn(GvSV(errgv), "", 0);
1774 curstash = defstash;
1775 compiling.cop_stash = defstash;
1776 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1777 /* We must init $/ before switches are processed. */
1778 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1781 #ifdef CAN_PROTOTYPE
1783 open_script(char *scriptname, bool dosearch, SV *sv)
1786 open_script(scriptname,dosearch,sv)
1793 char *xfound = Nullch;
1794 char *xfailed = Nullch;
1798 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1799 # define SEARCH_EXTS ".bat", ".cmd", NULL
1800 # define MAX_EXT_LEN 4
1803 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1804 # define MAX_EXT_LEN 4
1807 # define SEARCH_EXTS ".pl", ".com", NULL
1808 # define MAX_EXT_LEN 4
1810 /* additional extensions to try in each dir if scriptname not found */
1812 char *ext[] = { SEARCH_EXTS };
1813 int extidx = 0, i = 0;
1814 char *curext = Nullch;
1816 # define MAX_EXT_LEN 0
1820 * If dosearch is true and if scriptname does not contain path
1821 * delimiters, search the PATH for scriptname.
1823 * If SEARCH_EXTS is also defined, will look for each
1824 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1825 * while searching the PATH.
1827 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1828 * proceeds as follows:
1830 * + look for ./scriptname{,.foo,.bar}
1831 * + search the PATH for scriptname{,.foo,.bar}
1834 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1835 * this will not look in '.' if it's not in the PATH)
1840 int hasdir, idx = 0, deftypes = 1;
1843 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1844 /* The first time through, just add SEARCH_EXTS to whatever we
1845 * already have, so we can check for default file types. */
1847 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1853 if ((strlen(tokenbuf) + strlen(scriptname)
1854 + MAX_EXT_LEN) >= sizeof tokenbuf)
1855 continue; /* don't search dir with too-long name */
1856 strcat(tokenbuf, scriptname);
1860 if (strEQ(scriptname, "-"))
1862 if (dosearch) { /* Look in '.' first. */
1863 char *cur = scriptname;
1865 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1867 if (strEQ(ext[i++],curext)) {
1868 extidx = -1; /* already has an ext */
1873 DEBUG_p(PerlIO_printf(Perl_debug_log,
1874 "Looking for %s\n",cur));
1875 if (Stat(cur,&statbuf) >= 0) {
1883 if (cur == scriptname) {
1884 len = strlen(scriptname);
1885 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1887 cur = strcpy(tokenbuf, scriptname);
1889 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1890 && strcpy(tokenbuf+len, ext[extidx++]));
1895 if (dosearch && !strchr(scriptname, '/')
1897 && !strchr(scriptname, '\\')
1899 && (s = getenv("PATH"))) {
1902 bufend = s + strlen(s);
1903 while (s < bufend) {
1904 #if defined(atarist) || defined(DOSISH)
1909 && *s != ';'; len++, s++) {
1910 if (len < sizeof tokenbuf)
1913 if (len < sizeof tokenbuf)
1914 tokenbuf[len] = '\0';
1915 #else /* ! (atarist || DOSISH) */
1916 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1919 #endif /* ! (atarist || DOSISH) */
1922 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1923 continue; /* don't search dir with too-long name */
1925 #if defined(atarist) || defined(DOSISH)
1926 && tokenbuf[len - 1] != '/'
1927 && tokenbuf[len - 1] != '\\'
1930 tokenbuf[len++] = '/';
1931 if (len == 2 && tokenbuf[0] == '.')
1933 (void)strcpy(tokenbuf + len, scriptname);
1937 len = strlen(tokenbuf);
1938 if (extidx > 0) /* reset after previous loop */
1942 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1943 retval = Stat(tokenbuf,&statbuf);
1945 } while ( retval < 0 /* not there */
1946 && extidx>=0 && ext[extidx] /* try an extension? */
1947 && strcpy(tokenbuf+len, ext[extidx++])
1952 if (S_ISREG(statbuf.st_mode)
1953 && cando(S_IRUSR,TRUE,&statbuf)
1955 && cando(S_IXUSR,TRUE,&statbuf)
1959 xfound = tokenbuf; /* bingo! */
1963 xfailed = savepv(tokenbuf);
1966 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1968 seen_dot = 1; /* Disable message. */
1970 croak("Can't %s %s%s%s",
1971 (xfailed ? "execute" : "find"),
1972 (xfailed ? xfailed : scriptname),
1973 (xfailed ? "" : " on PATH"),
1974 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1977 scriptname = xfound;
1980 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1981 char *s = scriptname + 8;
1990 origfilename = savepv(e_tmpname ? "-e" : scriptname);
1991 curcop->cop_filegv = gv_fetchfile(origfilename);
1992 if (strEQ(origfilename,"-"))
1994 if (fdscript >= 0) {
1995 rsfp = PerlIO_fdopen(fdscript,"r");
1996 #if defined(HAS_FCNTL) && defined(F_SETFD)
1998 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2001 else if (preprocess) {
2002 char *cpp_cfg = CPPSTDIN;
2003 SV *cpp = NEWSV(0,0);
2004 SV *cmd = NEWSV(0,0);
2006 if (strEQ(cpp_cfg, "cppstdin"))
2007 sv_catpvf(cpp, "%s/", BIN_EXP);
2008 sv_catpv(cpp, cpp_cfg);
2011 sv_catpv(sv,PRIVLIB_EXP);
2015 sed %s -e \"/^[^#]/b\" \
2016 -e \"/^#[ ]*include[ ]/b\" \
2017 -e \"/^#[ ]*define[ ]/b\" \
2018 -e \"/^#[ ]*if[ ]/b\" \
2019 -e \"/^#[ ]*ifdef[ ]/b\" \
2020 -e \"/^#[ ]*ifndef[ ]/b\" \
2021 -e \"/^#[ ]*else/b\" \
2022 -e \"/^#[ ]*elif[ ]/b\" \
2023 -e \"/^#[ ]*undef[ ]/b\" \
2024 -e \"/^#[ ]*endif/b\" \
2027 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2030 %s %s -e '/^[^#]/b' \
2031 -e '/^#[ ]*include[ ]/b' \
2032 -e '/^#[ ]*define[ ]/b' \
2033 -e '/^#[ ]*if[ ]/b' \
2034 -e '/^#[ ]*ifdef[ ]/b' \
2035 -e '/^#[ ]*ifndef[ ]/b' \
2036 -e '/^#[ ]*else/b' \
2037 -e '/^#[ ]*elif[ ]/b' \
2038 -e '/^#[ ]*undef[ ]/b' \
2039 -e '/^#[ ]*endif/b' \
2047 (doextract ? "-e '1,/^#/d\n'" : ""),
2049 scriptname, cpp, sv, CPPMINUS);
2051 #ifdef IAMSUID /* actually, this is caught earlier */
2052 if (euid != uid && !euid) { /* if running suidperl */
2054 (void)seteuid(uid); /* musn't stay setuid root */
2057 (void)setreuid((Uid_t)-1, uid);
2059 #ifdef HAS_SETRESUID
2060 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2066 if (geteuid() != uid)
2067 croak("Can't do seteuid!\n");
2069 #endif /* IAMSUID */
2070 rsfp = my_popen(SvPVX(cmd), "r");
2074 else if (!*scriptname) {
2075 forbid_setid("program input from stdin");
2076 rsfp = PerlIO_stdin();
2079 rsfp = PerlIO_open(scriptname,"r");
2080 #if defined(HAS_FCNTL) && defined(F_SETFD)
2082 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2090 #ifndef IAMSUID /* in case script is not readable before setuid */
2091 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2092 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2094 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2095 croak("Can't do setuid\n");
2099 croak("Can't open perl script \"%s\": %s\n",
2100 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2105 validate_suid(char *validarg, char *scriptname)
2109 /* do we need to emulate setuid on scripts? */
2111 /* This code is for those BSD systems that have setuid #! scripts disabled
2112 * in the kernel because of a security problem. Merely defining DOSUID
2113 * in perl will not fix that problem, but if you have disabled setuid
2114 * scripts in the kernel, this will attempt to emulate setuid and setgid
2115 * on scripts that have those now-otherwise-useless bits set. The setuid
2116 * root version must be called suidperl or sperlN.NNN. If regular perl
2117 * discovers that it has opened a setuid script, it calls suidperl with
2118 * the same argv that it had. If suidperl finds that the script it has
2119 * just opened is NOT setuid root, it sets the effective uid back to the
2120 * uid. We don't just make perl setuid root because that loses the
2121 * effective uid we had before invoking perl, if it was different from the
2124 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2125 * be defined in suidperl only. suidperl must be setuid root. The
2126 * Configure script will set this up for you if you want it.
2133 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2134 croak("Can't stat script \"%s\"",origfilename);
2135 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2139 #ifndef HAS_SETREUID
2140 /* On this access check to make sure the directories are readable,
2141 * there is actually a small window that the user could use to make
2142 * filename point to an accessible directory. So there is a faint
2143 * chance that someone could execute a setuid script down in a
2144 * non-accessible directory. I don't know what to do about that.
2145 * But I don't think it's too important. The manual lies when
2146 * it says access() is useful in setuid programs.
2148 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2149 croak("Permission denied");
2151 /* If we can swap euid and uid, then we can determine access rights
2152 * with a simple stat of the file, and then compare device and
2153 * inode to make sure we did stat() on the same file we opened.
2154 * Then we just have to make sure he or she can execute it.
2157 struct stat tmpstatbuf;
2161 setreuid(euid,uid) < 0
2164 setresuid(euid,uid,(Uid_t)-1) < 0
2167 || getuid() != euid || geteuid() != uid)
2168 croak("Can't swap uid and euid"); /* really paranoid */
2169 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2170 croak("Permission denied"); /* testing full pathname here */
2171 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2172 tmpstatbuf.st_ino != statbuf.st_ino) {
2173 (void)PerlIO_close(rsfp);
2174 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2176 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2177 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2178 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2179 (long)statbuf.st_dev, (long)statbuf.st_ino,
2180 SvPVX(GvSV(curcop->cop_filegv)),
2181 (long)statbuf.st_uid, (long)statbuf.st_gid);
2182 (void)my_pclose(rsfp);
2184 croak("Permission denied\n");
2188 setreuid(uid,euid) < 0
2190 # if defined(HAS_SETRESUID)
2191 setresuid(uid,euid,(Uid_t)-1) < 0
2194 || getuid() != uid || geteuid() != euid)
2195 croak("Can't reswap uid and euid");
2196 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2197 croak("Permission denied\n");
2199 #endif /* HAS_SETREUID */
2200 #endif /* IAMSUID */
2202 if (!S_ISREG(statbuf.st_mode))
2203 croak("Permission denied");
2204 if (statbuf.st_mode & S_IWOTH)
2205 croak("Setuid/gid script is writable by world");
2206 doswitches = FALSE; /* -s is insecure in suid */
2208 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2209 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2210 croak("No #! line");
2211 s = SvPV(linestr,na)+2;
2213 while (!isSPACE(*s)) s++;
2214 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2215 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2216 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2217 croak("Not a perl script");
2218 while (*s == ' ' || *s == '\t') s++;
2220 * #! arg must be what we saw above. They can invoke it by
2221 * mentioning suidperl explicitly, but they may not add any strange
2222 * arguments beyond what #! says if they do invoke suidperl that way.
2224 len = strlen(validarg);
2225 if (strEQ(validarg," PHOOEY ") ||
2226 strnNE(s,validarg,len) || !isSPACE(s[len]))
2227 croak("Args must match #! line");
2230 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2231 euid == statbuf.st_uid)
2233 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2234 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2235 #endif /* IAMSUID */
2237 if (euid) { /* oops, we're not the setuid root perl */
2238 (void)PerlIO_close(rsfp);
2241 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2243 croak("Can't do setuid\n");
2246 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2248 (void)setegid(statbuf.st_gid);
2251 (void)setregid((Gid_t)-1,statbuf.st_gid);
2253 #ifdef HAS_SETRESGID
2254 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2256 setgid(statbuf.st_gid);
2260 if (getegid() != statbuf.st_gid)
2261 croak("Can't do setegid!\n");
2263 if (statbuf.st_mode & S_ISUID) {
2264 if (statbuf.st_uid != euid)
2266 (void)seteuid(statbuf.st_uid); /* all that for this */
2269 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2271 #ifdef HAS_SETRESUID
2272 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2274 setuid(statbuf.st_uid);
2278 if (geteuid() != statbuf.st_uid)
2279 croak("Can't do seteuid!\n");
2281 else if (uid) { /* oops, mustn't run as root */
2283 (void)seteuid((Uid_t)uid);
2286 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2288 #ifdef HAS_SETRESUID
2289 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2295 if (geteuid() != uid)
2296 croak("Can't do seteuid!\n");
2299 if (!cando(S_IXUSR,TRUE,&statbuf))
2300 croak("Permission denied\n"); /* they can't do this */
2303 else if (preprocess)
2304 croak("-P not allowed for setuid/setgid script\n");
2305 else if (fdscript >= 0)
2306 croak("fd script not allowed in suidperl\n");
2308 croak("Script is not setuid/setgid in suidperl\n");
2310 /* We absolutely must clear out any saved ids here, so we */
2311 /* exec the real perl, substituting fd script for scriptname. */
2312 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2313 PerlIO_rewind(rsfp);
2314 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2315 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2316 if (!origargv[which])
2317 croak("Permission denied");
2318 origargv[which] = savepv(form("/dev/fd/%d/%s",
2319 PerlIO_fileno(rsfp), origargv[which]));
2320 #if defined(HAS_FCNTL) && defined(F_SETFD)
2321 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2323 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2324 croak("Can't do setuid\n");
2325 #endif /* IAMSUID */
2327 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2328 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2330 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2331 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2333 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2336 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2337 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2338 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2339 /* not set-id, must be wrapped */
2345 find_beginning(void)
2347 register char *s, *s2;
2349 /* skip forward in input to the real script? */
2353 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2354 croak("No Perl script found in input\n");
2355 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2356 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2358 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2360 while (*s == ' ' || *s == '\t') s++;
2362 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2363 if (strnEQ(s2-4,"perl",4))
2365 while (s = moreswitches(s)) ;
2367 if (cddir && chdir(cddir) < 0)
2368 croak("Can't chdir to %s",cddir);
2376 uid = (int)getuid();
2377 euid = (int)geteuid();
2378 gid = (int)getgid();
2379 egid = (int)getegid();
2384 tainting |= (uid && (euid != uid || egid != gid));
2388 forbid_setid(char *s)
2391 croak("No %s allowed while running setuid", s);
2393 croak("No %s allowed while running setgid", s);
2400 curstash = debstash;
2401 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2403 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2404 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2405 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2406 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2407 sv_setiv(DBsingle, 0);
2408 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2409 sv_setiv(DBtrace, 0);
2410 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2411 sv_setiv(DBsignal, 0);
2412 curstash = defstash;
2416 init_stacks(ARGSproto)
2419 mainstack = curstack; /* remember in case we switch stacks */
2420 AvREAL_off(curstack); /* not a real array */
2421 av_extend(curstack,127);
2423 stack_base = AvARRAY(curstack);
2424 stack_sp = stack_base;
2425 stack_max = stack_base + 127;
2427 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2428 New(50,cxstack,cxstack_max + 1,CONTEXT);
2431 New(50,tmps_stack,128,SV*);
2437 * The following stacks almost certainly should be per-interpreter,
2438 * but for now they're not. XXX
2442 markstack_ptr = markstack;
2444 New(54,markstack,64,I32);
2445 markstack_ptr = markstack;
2446 markstack_max = markstack + 64;
2452 New(54,scopestack,32,I32);
2454 scopestack_max = 32;
2460 New(54,savestack,128,ANY);
2462 savestack_max = 128;
2468 New(54,retstack,16,OP*);
2479 Safefree(tmps_stack);
2486 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2495 subname = newSVpv("main",4);
2499 init_predump_symbols(void)
2506 sv_setpvn(*av_fetch(thr->magicals,find_thread_magical("\""),FALSE)," ", 1);
2508 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2510 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2511 GvMULTI_on(stdingv);
2512 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2513 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2515 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2517 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2519 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2521 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2523 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2525 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2526 GvMULTI_on(othergv);
2527 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2528 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2530 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2532 statname = NEWSV(66,0); /* last filename we did stat on */
2535 osname = savepv(OSNAME);
2539 init_postdump_symbols(register int argc, register char **argv, register char **env)
2545 argc--,argv++; /* skip name of script */
2547 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2550 if (argv[0][1] == '-') {
2554 if (s = strchr(argv[0], '=')) {
2556 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2559 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2562 toptarget = NEWSV(0,0);
2563 sv_upgrade(toptarget, SVt_PVFM);
2564 sv_setpvn(toptarget, "", 0);
2565 bodytarget = NEWSV(0,0);
2566 sv_upgrade(bodytarget, SVt_PVFM);
2567 sv_setpvn(bodytarget, "", 0);
2568 formtarget = bodytarget;
2571 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2572 sv_setpv(GvSV(tmpgv),origfilename);
2573 magicname("0", "0", 1);
2575 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2576 sv_setpv(GvSV(tmpgv),origargv[0]);
2577 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2579 (void)gv_AVadd(argvgv);
2580 av_clear(GvAVn(argvgv));
2581 for (; argc > 0; argc--,argv++) {
2582 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2585 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2589 hv_magic(hv, envgv, 'E');
2590 #ifndef VMS /* VMS doesn't have environ array */
2591 /* Note that if the supplied env parameter is actually a copy
2592 of the global environ then it may now point to free'd memory
2593 if the environment has been modified since. To avoid this
2594 problem we treat env==NULL as meaning 'use the default'
2599 environ[0] = Nullch;
2600 for (; *env; env++) {
2601 if (!(s = strchr(*env,'=')))
2607 sv = newSVpv(s--,0);
2608 (void)hv_store(hv, *env, s - *env, sv, 0);
2610 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2611 /* Sins of the RTL. See note in my_setenv(). */
2612 (void)putenv(savepv(*env));
2616 #ifdef DYNAMIC_ENV_FETCH
2617 HvNAME(hv) = savepv(ENV_HV_NAME);
2621 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2622 sv_setiv(GvSV(tmpgv), (IV)getpid());
2631 s = getenv("PERL5LIB");
2635 incpush(getenv("PERLLIB"), FALSE);
2637 /* Treat PERL5?LIB as a possible search list logical name -- the
2638 * "natural" VMS idiom for a Unix path string. We allow each
2639 * element to be a set of |-separated directories for compatibility.
2643 if (my_trnlnm("PERL5LIB",buf,0))
2644 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2646 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2650 /* Use the ~-expanded versions of APPLLIB (undocumented),
2651 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2654 incpush(APPLLIB_EXP, FALSE);
2658 incpush(ARCHLIB_EXP, FALSE);
2661 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2663 incpush(PRIVLIB_EXP, FALSE);
2666 incpush(SITEARCH_EXP, FALSE);
2669 incpush(SITELIB_EXP, FALSE);
2671 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2672 incpush(OLDARCHLIB_EXP, FALSE);
2676 incpush(".", FALSE);
2680 # define PERLLIB_SEP ';'
2683 # define PERLLIB_SEP '|'
2685 # define PERLLIB_SEP ':'
2688 #ifndef PERLLIB_MANGLE
2689 # define PERLLIB_MANGLE(s,n) (s)
2693 incpush(char *p, int addsubdirs)
2695 SV *subdir = Nullsv;
2696 static char *archpat_auto;
2703 if (!archpat_auto) {
2704 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2705 + sizeof("//auto"));
2706 New(55, archpat_auto, len, char);
2707 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2709 for (len = sizeof(ARCHNAME) + 2;
2710 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2711 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2716 /* Break at all separators */
2718 SV *libdir = newSV(0);
2721 /* skip any consecutive separators */
2722 while ( *p == PERLLIB_SEP ) {
2723 /* Uncomment the next line for PATH semantics */
2724 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2728 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2729 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2734 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2735 p = Nullch; /* break out */
2739 * BEFORE pushing libdir onto @INC we may first push version- and
2740 * archname-specific sub-directories.
2743 struct stat tmpstatbuf;
2748 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2750 while (unix[len-1] == '/') len--; /* Cosmetic */
2751 sv_usepvn(libdir,unix,len);
2754 PerlIO_printf(PerlIO_stderr(),
2755 "Failed to unixify @INC element \"%s\"\n",
2758 /* .../archname/version if -d .../archname/version/auto */
2759 sv_setsv(subdir, libdir);
2760 sv_catpv(subdir, archpat_auto);
2761 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2762 S_ISDIR(tmpstatbuf.st_mode))
2763 av_push(GvAVn(incgv),
2764 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2766 /* .../archname if -d .../archname/auto */
2767 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2768 strlen(patchlevel) + 1, "", 0);
2769 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2770 S_ISDIR(tmpstatbuf.st_mode))
2771 av_push(GvAVn(incgv),
2772 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2775 /* finally push this lib directory on the end of @INC */
2776 av_push(GvAVn(incgv), libdir);
2779 SvREFCNT_dec(subdir);
2783 static struct thread *
2789 Newz(53, thr, 1, struct thread);
2790 curcop = &compiling;
2791 thr->cvcache = newHV();
2792 thr->magicals = newAV();
2793 thr->specific = newAV();
2794 thr->flags = THRf_R_JOINABLE;
2795 MUTEX_INIT(&thr->mutex);
2796 /* Handcraft thrsv similarly to mess_sv */
2797 New(53, thrsv, 1, SV);
2798 Newz(53, xpv, 1, XPV);
2799 SvFLAGS(thrsv) = SVt_PV;
2800 SvANY(thrsv) = (void*)xpv;
2801 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2802 SvPVX(thrsv) = (char*)thr;
2803 SvCUR_set(thrsv, sizeof(thr));
2804 SvLEN_set(thrsv, sizeof(thr));
2805 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2807 curcop = &compiling;
2810 MUTEX_LOCK(&threads_mutex);
2815 MUTEX_UNLOCK(&threads_mutex);
2817 #ifdef HAVE_THREAD_INTERN
2818 init_thread_intern(thr);
2820 thr->self = pthread_self();
2821 #endif /* HAVE_THREAD_INTERN */
2825 * These must come after the SET_THR because sv_setpvn does
2826 * SvTAINT and the taint fields require dTHR.
2828 toptarget = NEWSV(0,0);
2829 sv_upgrade(toptarget, SVt_PVFM);
2830 sv_setpvn(toptarget, "", 0);
2831 bodytarget = NEWSV(0,0);
2832 sv_upgrade(bodytarget, SVt_PVFM);
2833 sv_setpvn(bodytarget, "", 0);
2834 formtarget = bodytarget;
2837 #endif /* USE_THREADS */
2840 call_list(I32 oldscope, AV *list)
2843 line_t oldline = curcop->cop_line;
2848 while (AvFILL(list) >= 0) {
2849 CV *cv = (CV*)av_shift(list);
2857 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2858 (void)SvPV(errsv, len);
2861 curcop = &compiling;
2862 curcop->cop_line = oldline;
2863 if (list == beginav)
2864 sv_catpv(errsv, "BEGIN failed--compilation aborted");
2866 sv_catpv(errsv, "END failed--cleanup aborted");
2867 while (scopestack_ix > oldscope)
2869 croak("%s", SvPVX(errsv));
2877 /* my_exit() was called */
2878 while (scopestack_ix > oldscope)
2881 curstash = defstash;
2883 call_list(oldscope, endav);
2885 curcop = &compiling;
2886 curcop->cop_line = oldline;
2888 if (list == beginav)
2889 croak("BEGIN failed--compilation aborted");
2891 croak("END failed--cleanup aborted");
2897 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2902 curcop = &compiling;
2903 curcop->cop_line = oldline;
2916 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread 0x%lx, status %lu\n",
2917 (unsigned long) thr, (unsigned long) status));
2918 #endif /* USE_THREADS */
2927 STATUS_NATIVE_SET(status);
2934 my_failure_exit(void)
2937 if (vaxc$errno & 1) {
2938 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2939 STATUS_NATIVE_SET(44);
2942 if (!vaxc$errno && errno) /* unlikely */
2943 STATUS_NATIVE_SET(44);
2945 STATUS_NATIVE_SET(vaxc$errno);
2949 STATUS_POSIX_SET(errno);
2950 else if (STATUS_POSIX == 0)
2951 STATUS_POSIX_SET(255);
2960 register CONTEXT *cx;
2969 (void)UNLINK(e_tmpname);
2970 Safefree(e_tmpname);
2974 if (cxstack_ix >= 0) {