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)
116 #endif /* FAKE_THREADS */
117 #endif /* USE_THREADS */
119 if (!(curinterp = sv_interp))
123 Zero(sv_interp, 1, PerlInterpreter);
126 /* Init the real globals (and main thread)? */
131 #ifdef ALLOC_THREAD_KEY
134 if (pthread_key_create(&thr_key, 0))
135 croak("panic: pthread_key_create");
137 MUTEX_INIT(&malloc_mutex);
138 MUTEX_INIT(&sv_mutex);
140 * Safe to use basic SV functions from now on (though
141 * not things like mortals or tainting yet).
143 MUTEX_INIT(&eval_mutex);
144 COND_INIT(&eval_cond);
145 MUTEX_INIT(&threads_mutex);
146 COND_INIT(&nthreads_cond);
148 thr = init_main_thread();
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(register PerlInterpreter *sv_interp)
231 int destruct_level; /* 0=none, 1=full, 2=full with checks */
236 #endif /* USE_THREADS */
238 if (!(curinterp = sv_interp))
243 /* Pass 1 on any remaining threads: detach joinables, join zombies */
245 MUTEX_LOCK(&threads_mutex);
246 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
247 "perl_destruct: waiting for %d threads...\n",
249 for (t = thr->next; t != thr; t = t->next) {
250 MUTEX_LOCK(&t->mutex);
251 switch (ThrSTATE(t)) {
254 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
255 "perl_destruct: joining zombie %p\n", t));
256 ThrSETSTATE(t, THRf_DEAD);
257 MUTEX_UNLOCK(&t->mutex);
260 * The SvREFCNT_dec below may take a long time (e.g. av
261 * may contain an object scalar whose destructor gets
262 * called) so we have to unlock threads_mutex and start
265 MUTEX_UNLOCK(&threads_mutex);
267 SvREFCNT_dec((SV*)av);
268 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
269 "perl_destruct: joined zombie %p OK\n", t));
271 case THRf_R_JOINABLE:
272 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
273 "perl_destruct: detaching thread %p\n", t));
274 ThrSETSTATE(t, THRf_R_DETACHED);
276 * We unlock threads_mutex and t->mutex in the opposite order
277 * from which we locked them just so that DETACH won't
278 * deadlock if it panics. It's only a breach of good style
279 * not a bug since they are unlocks not locks.
281 MUTEX_UNLOCK(&threads_mutex);
283 MUTEX_UNLOCK(&t->mutex);
286 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
287 "perl_destruct: ignoring %p (state %u)\n",
289 MUTEX_UNLOCK(&t->mutex);
290 /* fall through and out */
293 /* We leave the above "Pass 1" loop with threads_mutex still locked */
295 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
298 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
299 "perl_destruct: final wait for %d threads\n",
301 COND_WAIT(&nthreads_cond, &threads_mutex);
303 /* At this point, we're the last thread */
304 MUTEX_UNLOCK(&threads_mutex);
305 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
306 MUTEX_DESTROY(&threads_mutex);
307 COND_DESTROY(&nthreads_cond);
308 #endif /* !defined(FAKE_THREADS) */
309 #endif /* USE_THREADS */
311 destruct_level = perl_destruct_level;
315 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
317 if (destruct_level < i)
326 /* We must account for everything. */
328 /* Destroy the main CV and syntax tree */
330 curpad = AvARRAY(comppad);
335 SvREFCNT_dec(main_cv);
340 * Try to destruct global references. We do this first so that the
341 * destructors and destructees still exist. Some sv's might remain.
342 * Non-referenced objects are on their own.
349 /* unhook hooks which will soon be, or use, destroyed data */
350 SvREFCNT_dec(warnhook);
352 SvREFCNT_dec(diehook);
354 SvREFCNT_dec(parsehook);
357 if (destruct_level == 0){
359 DEBUG_P(debprofdump());
361 /* The exit() function will do everything that needs doing. */
365 /* loosen bonds of global variables */
368 (void)PerlIO_close(rsfp);
372 /* Filters for program text */
373 SvREFCNT_dec(rsfp_filters);
374 rsfp_filters = Nullav;
386 sawampersand = FALSE; /* must save all match strings */
387 sawstudy = FALSE; /* do fbm_instr on all strings */
402 /* magical thingies */
404 Safefree(ofs); /* $, */
407 Safefree(ors); /* $\ */
410 SvREFCNT_dec(nrs); /* $\ helper */
413 multiline = 0; /* $* */
415 SvREFCNT_dec(statname);
419 /* defgv, aka *_ should be taken care of elsewhere */
421 #if 0 /* just about all regexp stuff, seems to be ok */
423 /* shortcuts to regexp stuff */
428 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
430 regprecomp = NULL; /* uncompiled string. */
431 regparse = NULL; /* Input-scan pointer. */
432 regxend = NULL; /* End of input for compile */
433 regnpar = 0; /* () count. */
434 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
435 regsize = 0; /* Code size. */
436 regnaughty = 0; /* How bad is this pattern? */
437 regsawback = 0; /* Did we see \1, ...? */
439 reginput = NULL; /* String-input pointer. */
440 regbol = NULL; /* Beginning of input, for ^ check. */
441 regeol = NULL; /* End of input, for $ check. */
442 regstartp = (char **)NULL; /* Pointer to startp array. */
443 regendp = (char **)NULL; /* Ditto for endp. */
444 reglastparen = 0; /* Similarly for lastparen. */
445 regtill = NULL; /* How far we are required to go. */
446 regflags = 0; /* are we folding, multilining? */
447 regprev = (char)NULL; /* char before regbol, \n if none */
451 /* clean up after study() */
452 SvREFCNT_dec(lastscream);
454 Safefree(screamfirst);
456 Safefree(screamnext);
459 /* startup and shutdown function lists */
460 SvREFCNT_dec(beginav);
462 SvREFCNT_dec(initav);
467 /* temp stack during pp_sort() */
468 SvREFCNT_dec(sortstack);
471 /* shortcuts just get cleared */
482 /* reset so print() ends up where we expect */
485 /* Prepare to destruct main symbol table. */
492 if (destruct_level >= 2) {
493 if (scopestack_ix != 0)
494 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
495 (long)scopestack_ix);
496 if (savestack_ix != 0)
497 warn("Unbalanced saves: %ld more saves than restores\n",
499 if (tmps_floor != -1)
500 warn("Unbalanced tmps: %ld more allocs than frees\n",
501 (long)tmps_floor + 1);
502 if (cxstack_ix != -1)
503 warn("Unbalanced context: %ld more PUSHes than POPs\n",
504 (long)cxstack_ix + 1);
507 /* Now absolutely destruct everything, somehow or other, loops or no. */
509 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
510 while (sv_count != 0 && sv_count != last_sv_count) {
511 last_sv_count = sv_count;
514 SvFLAGS(strtab) &= ~SVTYPEMASK;
515 SvFLAGS(strtab) |= SVt_PVHV;
517 /* Destruct the global string table. */
519 /* Yell and reset the HeVAL() slots that are still holding refcounts,
520 * so that sv_free() won't fail on them.
529 array = HvARRAY(strtab);
533 warn("Unbalanced string table refcount: (%d) for \"%s\"",
534 HeVAL(hent) - Nullsv, HeKEY(hent));
535 HeVAL(hent) = Nullsv;
545 SvREFCNT_dec(strtab);
548 warn("Scalars leaked: %ld\n", (long)sv_count);
552 /* No SVs have survived, need to clean out */
556 Safefree(origfilename);
558 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
560 DEBUG_P(debprofdump());
562 MUTEX_DESTROY(&sv_mutex);
563 MUTEX_DESTROY(&malloc_mutex);
564 MUTEX_DESTROY(&eval_mutex);
565 COND_DESTROY(&eval_cond);
567 /* As the penultimate thing, free the non-arena SV for thrsv */
568 Safefree(SvPVX(thrsv));
569 Safefree(SvANY(thrsv));
572 #endif /* USE_THREADS */
574 /* As the absolutely last thing, free the non-arena SV for mess() */
577 /* we know that type >= SVt_PV */
579 Safefree(SvPVX(mess_sv));
580 Safefree(SvANY(mess_sv));
587 perl_free(PerlInterpreter *sv_interp)
589 if (!(curinterp = sv_interp))
595 perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
600 char *scriptname = NULL;
601 VOL bool dosearch = FALSE;
608 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
611 croak("suidperl is no longer needed since the kernel can now execute\n\
612 setuid perl scripts securely.\n");
616 if (!(curinterp = sv_interp))
619 #if defined(NeXT) && defined(__DYNAMIC__)
620 _dyld_lookup_and_bind
621 ("__environ", (unsigned long *) &environ_pointer, NULL);
626 #ifndef VMS /* VMS doesn't have environ array */
627 origenviron = environ;
633 /* Come here if running an undumped a.out. */
635 origfilename = savepv(argv[0]);
637 cxstack_ix = -1; /* start label stack again */
639 init_postdump_symbols(argc,argv,env);
644 curpad = AvARRAY(comppad);
649 SvREFCNT_dec(main_cv);
653 oldscope = scopestack_ix;
661 /* my_exit() was called */
662 while (scopestack_ix > oldscope)
667 call_list(oldscope, endav);
669 return STATUS_NATIVE_EXPORT;
672 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
676 sv_setpvn(linestr,"",0);
677 sv = newSVpv("",0); /* first used for -I flags */
681 for (argc--,argv++; argc > 0; argc--,argv++) {
682 if (argv[0][0] != '-' || !argv[0][1])
686 validarg = " PHOOEY ";
711 if (s = moreswitches(s))
721 if (euid != uid || egid != gid)
722 croak("No -e allowed in setuid scripts");
724 e_tmpname = savepv(TMPPATH);
725 (void)mktemp(e_tmpname);
727 croak("Can't mktemp()");
728 e_fp = PerlIO_open(e_tmpname,"w");
730 croak("Cannot open temporary file");
735 PerlIO_puts(e_fp,argv[1]);
739 croak("No code specified for -e");
740 (void)PerlIO_putc(e_fp,'\n');
742 case 'I': /* -I handled both here and in moreswitches() */
744 if (!*++s && (s=argv[1]) != Nullch) {
747 while (s && isSPACE(*s))
751 for (e = s; *e && !isSPACE(*e); e++) ;
758 } /* XXX else croak? */
772 preambleav = newAV();
773 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
775 Sv = newSVpv("print myconfig();",0);
777 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
779 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
781 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
782 sv_catpv(Sv,"\" Compile-time options:");
784 sv_catpv(Sv," DEBUGGING");
787 sv_catpv(Sv," NO_EMBED");
790 sv_catpv(Sv," MULTIPLICITY");
792 sv_catpv(Sv,"\\n\",");
794 #if defined(LOCAL_PATCH_COUNT)
795 if (LOCAL_PATCH_COUNT > 0) {
797 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
798 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
800 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
804 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
807 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
809 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
814 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
815 print \" \\%ENV:\\n @env\\n\" if @env; \
816 print \" \\@INC:\\n @INC\\n\";");
819 Sv = newSVpv("config_vars(qw(",0);
824 av_push(preambleav, Sv);
825 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
836 if (!*++s || isSPACE(*s)) {
840 /* catch use of gnu style long options */
841 if (strEQ(s, "version")) {
845 if (strEQ(s, "help")) {
852 croak("Unrecognized switch: -%s (-h will show valid options)",s);
857 if (!tainting && (s = getenv("PERL5OPT"))) {
868 if (!strchr("DIMUdmw", *s))
869 croak("Illegal switch in PERL5OPT: -%c", *s);
875 scriptname = argv[0];
877 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
879 warn("Did you forget to compile with -DMULTIPLICITY?");
881 croak("Can't write to temp file for -e: %s", Strerror(errno));
885 scriptname = e_tmpname;
887 else if (scriptname == Nullch) {
889 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
897 open_script(scriptname,dosearch,sv);
899 validate_suid(validarg, scriptname);
904 main_cv = compcv = (CV*)NEWSV(1104,0);
905 sv_upgrade((SV *)compcv, SVt_PVCV);
909 av_push(comppad, Nullsv);
910 curpad = AvARRAY(comppad);
911 comppad_name = newAV();
912 comppad_name_fill = 0;
913 min_intro_pending = 0;
916 av_store(comppad_name, 0, newSVpv("@_", 2));
917 curpad[0] = (SV*)newAV();
918 SvPADMY_on(curpad[0]); /* XXX Needed? */
920 New(666, CvMUTEXP(compcv), 1, perl_mutex);
921 MUTEX_INIT(CvMUTEXP(compcv));
922 #endif /* USE_THREADS */
924 comppadlist = newAV();
925 AvREAL_off(comppadlist);
926 av_store(comppadlist, 0, (SV*)comppad_name);
927 av_store(comppadlist, 1, (SV*)comppad);
928 CvPADLIST(compcv) = comppadlist;
930 boot_core_UNIVERSAL();
932 (*xsinit)(); /* in case linked C routines want magical variables */
933 #if defined(VMS) || defined(WIN32)
937 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
938 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
941 init_predump_symbols();
943 init_postdump_symbols(argc,argv,env);
947 /* now parse the script */
950 if (yyparse() || error_count) {
952 croak("%s had compilation errors.\n", origfilename);
954 croak("Execution of %s aborted due to compilation errors.\n",
958 curcop->cop_line = 0;
962 (void)UNLINK(e_tmpname);
967 /* now that script is parsed, we can modify record separator */
969 rs = SvREFCNT_inc(nrs);
971 sv_setsv(*av_fetch(thr->magicals, find_thread_magical("/"), FALSE), rs);
973 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
974 #endif /* USE_THREADS */
985 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
986 dump_mstats("after compilation:");
996 perl_run(PerlInterpreter *sv_interp)
1003 if (!(curinterp = sv_interp))
1006 oldscope = scopestack_ix;
1011 cxstack_ix = -1; /* start context stack again */
1014 /* my_exit() was called */
1015 while (scopestack_ix > oldscope)
1018 curstash = defstash;
1020 call_list(oldscope, endav);
1022 if (getenv("PERL_DEBUG_MSTATS"))
1023 dump_mstats("after execution: ");
1026 return STATUS_NATIVE_EXPORT;
1029 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1034 if (curstack != mainstack) {
1036 SWITCHSTACK(curstack, mainstack);
1041 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1042 sawampersand ? "Enabling" : "Omitting"));
1045 DEBUG_x(dump_all());
1046 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1048 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1049 (unsigned long) thr));
1050 #endif /* USE_THREADS */
1053 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1056 if (PERLDB_SINGLE && DBsingle)
1057 sv_setiv(DBsingle, 1);
1059 call_list(oldscope, initav);
1069 else if (main_start) {
1070 CvDEPTH(main_cv) = 1;
1081 perl_get_sv(char *name, I32 create)
1085 if (name[1] == '\0' && !isALPHA(name[0])) {
1086 PADOFFSET tmp = find_thread_magical(name);
1087 if (tmp != NOT_IN_PAD) {
1089 return *av_fetch(thr->magicals, tmp, FALSE);
1092 #endif /* USE_THREADS */
1093 gv = gv_fetchpv(name, create, SVt_PV);
1100 perl_get_av(char *name, I32 create)
1102 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1111 perl_get_hv(char *name, I32 create)
1113 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1122 perl_get_cv(char *name, I32 create)
1124 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1125 if (create && !GvCVu(gv))
1126 return newSUB(start_subparse(FALSE, 0),
1127 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1135 /* Be sure to refetch the stack pointer after calling these routines. */
1138 perl_call_argv(char *subname, I32 flags, register char **argv)
1140 /* See G_* flags in cop.h */
1141 /* null terminated arg list */
1148 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1153 return perl_call_pv(subname, flags);
1157 perl_call_pv(char *subname, I32 flags)
1158 /* name of the subroutine */
1159 /* See G_* flags in cop.h */
1161 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1165 perl_call_method(char *methname, I32 flags)
1166 /* name of the subroutine */
1167 /* See G_* flags in cop.h */
1173 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1176 return perl_call_sv(*stack_sp--, flags);
1179 /* May be called with any of a CV, a GV, or an SV containing the name. */
1181 perl_call_sv(SV *sv, I32 flags)
1183 /* See G_* flags in cop.h */
1186 LOGOP myop; /* fake syntax tree node */
1192 bool oldcatch = CATCH_GET;
1197 if (flags & G_DISCARD) {
1202 Zero(&myop, 1, LOGOP);
1203 myop.op_next = Nullop;
1204 if (!(flags & G_NOARGS))
1205 myop.op_flags |= OPf_STACKED;
1206 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1207 (flags & G_ARRAY) ? OPf_WANT_LIST :
1212 EXTEND(stack_sp, 1);
1215 oldscope = scopestack_ix;
1217 if (PERLDB_SUB && curstash != debstash
1218 /* Handle first BEGIN of -d. */
1219 && (DBcv || (DBcv = GvCV(DBsub)))
1220 /* Try harder, since this may have been a sighandler, thus
1221 * curstash may be meaningless. */
1222 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1223 op->op_private |= OPpENTERSUB_DB;
1225 if (flags & G_EVAL) {
1226 cLOGOP->op_other = op;
1228 /* we're trying to emulate pp_entertry() here */
1230 register CONTEXT *cx;
1231 I32 gimme = GIMME_V;
1236 push_return(op->op_next);
1237 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1239 eval_root = op; /* Only needed so that goto works right. */
1242 if (flags & G_KEEPERR)
1257 /* my_exit() was called */
1258 curstash = defstash;
1262 croak("Callback called exit");
1271 stack_sp = stack_base + oldmark;
1272 if (flags & G_ARRAY)
1276 *++stack_sp = &sv_undef;
1284 if (op == (OP*)&myop)
1285 op = pp_entersub(ARGS);
1288 retval = stack_sp - (stack_base + oldmark);
1289 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1293 if (flags & G_EVAL) {
1294 if (scopestack_ix > oldscope) {
1298 register CONTEXT *cx;
1310 CATCH_SET(oldcatch);
1312 if (flags & G_DISCARD) {
1313 stack_sp = stack_base + oldmark;
1322 /* Eval a string. The G_EVAL flag is always assumed. */
1325 perl_eval_sv(SV *sv, I32 flags)
1327 /* See G_* flags in cop.h */
1330 UNOP myop; /* fake syntax tree node */
1332 I32 oldmark = sp - stack_base;
1339 if (flags & G_DISCARD) {
1347 EXTEND(stack_sp, 1);
1349 oldscope = scopestack_ix;
1351 if (!(flags & G_NOARGS))
1352 myop.op_flags = OPf_STACKED;
1353 myop.op_next = Nullop;
1354 myop.op_type = OP_ENTEREVAL;
1355 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1356 (flags & G_ARRAY) ? OPf_WANT_LIST :
1358 if (flags & G_KEEPERR)
1359 myop.op_flags |= OPf_SPECIAL;
1369 /* my_exit() was called */
1370 curstash = defstash;
1374 croak("Callback called exit");
1383 stack_sp = stack_base + oldmark;
1384 if (flags & G_ARRAY)
1388 *++stack_sp = &sv_undef;
1393 if (op == (OP*)&myop)
1394 op = pp_entereval(ARGS);
1397 retval = stack_sp - (stack_base + oldmark);
1398 if (!(flags & G_KEEPERR))
1403 if (flags & G_DISCARD) {
1404 stack_sp = stack_base + oldmark;
1414 perl_eval_pv(char *p, I32 croak_on_error)
1417 SV* sv = newSVpv(p, 0);
1420 perl_eval_sv(sv, G_SCALAR);
1427 if (croak_on_error && SvTRUE(ERRSV))
1428 croak(SvPVx(ERRSV, na));
1433 /* Require a module. */
1436 perl_require_pv(char *pv)
1438 SV* sv = sv_newmortal();
1439 sv_setpv(sv, "require '");
1442 perl_eval_sv(sv, G_DISCARD);
1446 magicname(char *sym, char *name, I32 namlen)
1450 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1451 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1455 usage(char *name) /* XXX move this out into a module ? */
1458 /* This message really ought to be max 23 lines.
1459 * Removed -h because the user already knows that opton. Others? */
1461 static char *usage[] = {
1462 "-0[octal] specify record separator (\\0, if no argument)",
1463 "-a autosplit mode with -n or -p (splits $_ into @F)",
1464 "-c check syntax only (runs BEGIN and END blocks)",
1465 "-d[:debugger] run scripts under debugger",
1466 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1467 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1468 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1469 "-i[extension] edit <> files in place (make backup if extension supplied)",
1470 "-Idirectory specify @INC/#include directory (may be used more than once)",
1471 "-l[octal] enable line ending processing, specifies line terminator",
1472 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1473 "-n assume 'while (<>) { ... }' loop around your script",
1474 "-p assume loop like -n but print line also like sed",
1475 "-P run script through C preprocessor before compilation",
1476 "-s enable some switch parsing for switches after script name",
1477 "-S look for the script using PATH environment variable",
1478 "-T turn on tainting checks",
1479 "-u dump core after parsing script",
1480 "-U allow unsafe operations",
1481 "-v print version number and patchlevel of perl",
1482 "-V[:variable] print perl configuration information",
1483 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1484 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1490 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1492 printf("\n %s", *p++);
1495 /* This routine handles any switches that can be given during run */
1498 moreswitches(char *s)
1507 rschar = scan_oct(s, 4, &numlen);
1509 if (rschar & ~((U8)~0))
1511 else if (!rschar && numlen >= 2)
1512 nrs = newSVpv("", 0);
1515 nrs = newSVpv(&ch, 1);
1521 splitstr = savepv(s + 1);
1535 if (*s == ':' || *s == '=') {
1536 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1540 perldb = PERLDB_ALL;
1547 if (isALPHA(s[1])) {
1548 static char debopts[] = "psltocPmfrxuLHXD";
1551 for (s++; *s && (d = strchr(debopts,*s)); s++)
1552 debug |= 1 << (d - debopts);
1556 for (s++; isDIGIT(*s); s++) ;
1558 debug |= 0x80000000;
1560 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1561 for (s++; isALNUM(*s); s++) ;
1571 inplace = savepv(s+1);
1573 for (s = inplace; *s && !isSPACE(*s); s++) ;
1577 case 'I': /* -I handled both here and in parse_perl() */
1580 while (*s && isSPACE(*s))
1584 for (e = s; *e && !isSPACE(*e); e++) ;
1585 p = savepvn(s, e-s);
1591 croak("No space allowed after -I");
1601 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1611 ors = SvPV(nrs, orslen);
1612 ors = savepvn(ors, orslen);
1616 forbid_setid("-M"); /* XXX ? */
1619 forbid_setid("-m"); /* XXX ? */
1624 /* -M-foo == 'no foo' */
1625 if (*s == '-') { use = "no "; ++s; }
1626 sv = newSVpv(use,0);
1628 /* We allow -M'Module qw(Foo Bar)' */
1629 while(isALNUM(*s) || *s==':') ++s;
1631 sv_catpv(sv, start);
1632 if (*(start-1) == 'm') {
1634 croak("Can't use '%c' after -mname", *s);
1635 sv_catpv( sv, " ()");
1638 sv_catpvn(sv, start, s-start);
1639 sv_catpv(sv, " split(/,/,q{");
1644 if (preambleav == NULL)
1645 preambleav = newAV();
1646 av_push(preambleav, sv);
1649 croak("No space allowed after -%c", *(s-1));
1666 croak("Too late for \"-T\" option");
1678 #if defined(SUBVERSION) && SUBVERSION > 0
1679 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1680 PATCHLEVEL, SUBVERSION, ARCHNAME);
1682 printf("\nThis is perl, version %s built for %s",
1683 patchlevel, ARCHNAME);
1685 #if defined(LOCAL_PATCH_COUNT)
1686 if (LOCAL_PATCH_COUNT > 0)
1687 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1688 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1691 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1693 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1696 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1699 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1700 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1703 printf("atariST series port, ++jrb bammi@cadence.com\n");
1706 Perl may be copied only under the terms of either the Artistic License or the\n\
1707 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1715 if (s[1] == '-') /* Additional switches on #! line. */
1723 #ifdef ALTERNATE_SHEBANG
1724 case 'S': /* OS/2 needs -S on "extproc" line. */
1732 croak("Can't emulate -%.1s on #! line",s);
1737 /* compliments of Tom Christiansen */
1739 /* unexec() can be found in the Gnu emacs distribution */
1750 prog = newSVpv(BIN_EXP);
1751 sv_catpv(prog, "/perl");
1752 file = newSVpv(origfilename);
1753 sv_catpv(file, ".perldump");
1755 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1757 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1758 SvPVX(prog), SvPVX(file));
1762 # include <lib$routines.h>
1763 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1765 ABORT(); /* for use with undump */
1771 init_main_stash(void)
1776 /* Note that strtab is a rather special HV. Assumptions are made
1777 about not iterating on it, and not adding tie magic to it.
1778 It is properly deallocated in perl_destruct() */
1780 HvSHAREKEYS_off(strtab); /* mandatory */
1781 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1782 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1784 curstash = defstash = newHV();
1785 curstname = newSVpv("main",4);
1786 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1787 SvREFCNT_dec(GvHV(gv));
1788 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1790 HvNAME(defstash) = savepv("main");
1791 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1793 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1794 errsv = newSVpv("", 0);
1796 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1797 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1798 sv_setpvn(ERRSV, "", 0);
1799 curstash = defstash;
1800 compiling.cop_stash = defstash;
1801 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1802 /* We must init $/ before switches are processed. */
1803 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1806 #ifdef CAN_PROTOTYPE
1808 open_script(char *scriptname, bool dosearch, SV *sv)
1811 open_script(scriptname,dosearch,sv)
1818 char *xfound = Nullch;
1819 char *xfailed = Nullch;
1823 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1824 # define SEARCH_EXTS ".bat", ".cmd", NULL
1825 # define MAX_EXT_LEN 4
1828 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1829 # define MAX_EXT_LEN 4
1832 # define SEARCH_EXTS ".pl", ".com", NULL
1833 # define MAX_EXT_LEN 4
1835 /* additional extensions to try in each dir if scriptname not found */
1837 char *ext[] = { SEARCH_EXTS };
1838 int extidx = 0, i = 0;
1839 char *curext = Nullch;
1841 # define MAX_EXT_LEN 0
1845 * If dosearch is true and if scriptname does not contain path
1846 * delimiters, search the PATH for scriptname.
1848 * If SEARCH_EXTS is also defined, will look for each
1849 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1850 * while searching the PATH.
1852 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1853 * proceeds as follows:
1855 * + look for ./scriptname{,.foo,.bar}
1856 * + search the PATH for scriptname{,.foo,.bar}
1859 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1860 * this will not look in '.' if it's not in the PATH)
1865 int hasdir, idx = 0, deftypes = 1;
1868 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1869 /* The first time through, just add SEARCH_EXTS to whatever we
1870 * already have, so we can check for default file types. */
1872 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1878 if ((strlen(tokenbuf) + strlen(scriptname)
1879 + MAX_EXT_LEN) >= sizeof tokenbuf)
1880 continue; /* don't search dir with too-long name */
1881 strcat(tokenbuf, scriptname);
1885 if (strEQ(scriptname, "-"))
1887 if (dosearch) { /* Look in '.' first. */
1888 char *cur = scriptname;
1890 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1892 if (strEQ(ext[i++],curext)) {
1893 extidx = -1; /* already has an ext */
1898 DEBUG_p(PerlIO_printf(Perl_debug_log,
1899 "Looking for %s\n",cur));
1900 if (Stat(cur,&statbuf) >= 0) {
1908 if (cur == scriptname) {
1909 len = strlen(scriptname);
1910 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1912 cur = strcpy(tokenbuf, scriptname);
1914 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1915 && strcpy(tokenbuf+len, ext[extidx++]));
1920 if (dosearch && !strchr(scriptname, '/')
1922 && !strchr(scriptname, '\\')
1924 && (s = getenv("PATH"))) {
1927 bufend = s + strlen(s);
1928 while (s < bufend) {
1929 #if defined(atarist) || defined(DOSISH)
1934 && *s != ';'; len++, s++) {
1935 if (len < sizeof tokenbuf)
1938 if (len < sizeof tokenbuf)
1939 tokenbuf[len] = '\0';
1940 #else /* ! (atarist || DOSISH) */
1941 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1944 #endif /* ! (atarist || DOSISH) */
1947 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1948 continue; /* don't search dir with too-long name */
1950 #if defined(atarist) || defined(DOSISH)
1951 && tokenbuf[len - 1] != '/'
1952 && tokenbuf[len - 1] != '\\'
1955 tokenbuf[len++] = '/';
1956 if (len == 2 && tokenbuf[0] == '.')
1958 (void)strcpy(tokenbuf + len, scriptname);
1962 len = strlen(tokenbuf);
1963 if (extidx > 0) /* reset after previous loop */
1967 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1968 retval = Stat(tokenbuf,&statbuf);
1970 } while ( retval < 0 /* not there */
1971 && extidx>=0 && ext[extidx] /* try an extension? */
1972 && strcpy(tokenbuf+len, ext[extidx++])
1977 if (S_ISREG(statbuf.st_mode)
1978 && cando(S_IRUSR,TRUE,&statbuf)
1980 && cando(S_IXUSR,TRUE,&statbuf)
1984 xfound = tokenbuf; /* bingo! */
1988 xfailed = savepv(tokenbuf);
1991 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1993 seen_dot = 1; /* Disable message. */
1995 croak("Can't %s %s%s%s",
1996 (xfailed ? "execute" : "find"),
1997 (xfailed ? xfailed : scriptname),
1998 (xfailed ? "" : " on PATH"),
1999 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
2002 scriptname = xfound;
2005 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2006 char *s = scriptname + 8;
2015 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2016 curcop->cop_filegv = gv_fetchfile(origfilename);
2017 if (strEQ(origfilename,"-"))
2019 if (fdscript >= 0) {
2020 rsfp = PerlIO_fdopen(fdscript,"r");
2021 #if defined(HAS_FCNTL) && defined(F_SETFD)
2023 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2026 else if (preprocess) {
2027 char *cpp_cfg = CPPSTDIN;
2028 SV *cpp = NEWSV(0,0);
2029 SV *cmd = NEWSV(0,0);
2031 if (strEQ(cpp_cfg, "cppstdin"))
2032 sv_catpvf(cpp, "%s/", BIN_EXP);
2033 sv_catpv(cpp, cpp_cfg);
2036 sv_catpv(sv,PRIVLIB_EXP);
2040 sed %s -e \"/^[^#]/b\" \
2041 -e \"/^#[ ]*include[ ]/b\" \
2042 -e \"/^#[ ]*define[ ]/b\" \
2043 -e \"/^#[ ]*if[ ]/b\" \
2044 -e \"/^#[ ]*ifdef[ ]/b\" \
2045 -e \"/^#[ ]*ifndef[ ]/b\" \
2046 -e \"/^#[ ]*else/b\" \
2047 -e \"/^#[ ]*elif[ ]/b\" \
2048 -e \"/^#[ ]*undef[ ]/b\" \
2049 -e \"/^#[ ]*endif/b\" \
2052 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2055 %s %s -e '/^[^#]/b' \
2056 -e '/^#[ ]*include[ ]/b' \
2057 -e '/^#[ ]*define[ ]/b' \
2058 -e '/^#[ ]*if[ ]/b' \
2059 -e '/^#[ ]*ifdef[ ]/b' \
2060 -e '/^#[ ]*ifndef[ ]/b' \
2061 -e '/^#[ ]*else/b' \
2062 -e '/^#[ ]*elif[ ]/b' \
2063 -e '/^#[ ]*undef[ ]/b' \
2064 -e '/^#[ ]*endif/b' \
2072 (doextract ? "-e '1,/^#/d\n'" : ""),
2074 scriptname, cpp, sv, CPPMINUS);
2076 #ifdef IAMSUID /* actually, this is caught earlier */
2077 if (euid != uid && !euid) { /* if running suidperl */
2079 (void)seteuid(uid); /* musn't stay setuid root */
2082 (void)setreuid((Uid_t)-1, uid);
2084 #ifdef HAS_SETRESUID
2085 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2091 if (geteuid() != uid)
2092 croak("Can't do seteuid!\n");
2094 #endif /* IAMSUID */
2095 rsfp = my_popen(SvPVX(cmd), "r");
2099 else if (!*scriptname) {
2100 forbid_setid("program input from stdin");
2101 rsfp = PerlIO_stdin();
2104 rsfp = PerlIO_open(scriptname,"r");
2105 #if defined(HAS_FCNTL) && defined(F_SETFD)
2107 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2115 #ifndef IAMSUID /* in case script is not readable before setuid */
2116 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2117 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2119 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2120 croak("Can't do setuid\n");
2124 croak("Can't open perl script \"%s\": %s\n",
2125 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2130 validate_suid(char *validarg, char *scriptname)
2134 /* do we need to emulate setuid on scripts? */
2136 /* This code is for those BSD systems that have setuid #! scripts disabled
2137 * in the kernel because of a security problem. Merely defining DOSUID
2138 * in perl will not fix that problem, but if you have disabled setuid
2139 * scripts in the kernel, this will attempt to emulate setuid and setgid
2140 * on scripts that have those now-otherwise-useless bits set. The setuid
2141 * root version must be called suidperl or sperlN.NNN. If regular perl
2142 * discovers that it has opened a setuid script, it calls suidperl with
2143 * the same argv that it had. If suidperl finds that the script it has
2144 * just opened is NOT setuid root, it sets the effective uid back to the
2145 * uid. We don't just make perl setuid root because that loses the
2146 * effective uid we had before invoking perl, if it was different from the
2149 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2150 * be defined in suidperl only. suidperl must be setuid root. The
2151 * Configure script will set this up for you if you want it.
2158 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2159 croak("Can't stat script \"%s\"",origfilename);
2160 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2164 #ifndef HAS_SETREUID
2165 /* On this access check to make sure the directories are readable,
2166 * there is actually a small window that the user could use to make
2167 * filename point to an accessible directory. So there is a faint
2168 * chance that someone could execute a setuid script down in a
2169 * non-accessible directory. I don't know what to do about that.
2170 * But I don't think it's too important. The manual lies when
2171 * it says access() is useful in setuid programs.
2173 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2174 croak("Permission denied");
2176 /* If we can swap euid and uid, then we can determine access rights
2177 * with a simple stat of the file, and then compare device and
2178 * inode to make sure we did stat() on the same file we opened.
2179 * Then we just have to make sure he or she can execute it.
2182 struct stat tmpstatbuf;
2186 setreuid(euid,uid) < 0
2189 setresuid(euid,uid,(Uid_t)-1) < 0
2192 || getuid() != euid || geteuid() != uid)
2193 croak("Can't swap uid and euid"); /* really paranoid */
2194 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2195 croak("Permission denied"); /* testing full pathname here */
2196 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2197 tmpstatbuf.st_ino != statbuf.st_ino) {
2198 (void)PerlIO_close(rsfp);
2199 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2201 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2202 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2203 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2204 (long)statbuf.st_dev, (long)statbuf.st_ino,
2205 SvPVX(GvSV(curcop->cop_filegv)),
2206 (long)statbuf.st_uid, (long)statbuf.st_gid);
2207 (void)my_pclose(rsfp);
2209 croak("Permission denied\n");
2213 setreuid(uid,euid) < 0
2215 # if defined(HAS_SETRESUID)
2216 setresuid(uid,euid,(Uid_t)-1) < 0
2219 || getuid() != uid || geteuid() != euid)
2220 croak("Can't reswap uid and euid");
2221 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2222 croak("Permission denied\n");
2224 #endif /* HAS_SETREUID */
2225 #endif /* IAMSUID */
2227 if (!S_ISREG(statbuf.st_mode))
2228 croak("Permission denied");
2229 if (statbuf.st_mode & S_IWOTH)
2230 croak("Setuid/gid script is writable by world");
2231 doswitches = FALSE; /* -s is insecure in suid */
2233 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2234 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2235 croak("No #! line");
2236 s = SvPV(linestr,na)+2;
2238 while (!isSPACE(*s)) s++;
2239 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2240 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2241 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2242 croak("Not a perl script");
2243 while (*s == ' ' || *s == '\t') s++;
2245 * #! arg must be what we saw above. They can invoke it by
2246 * mentioning suidperl explicitly, but they may not add any strange
2247 * arguments beyond what #! says if they do invoke suidperl that way.
2249 len = strlen(validarg);
2250 if (strEQ(validarg," PHOOEY ") ||
2251 strnNE(s,validarg,len) || !isSPACE(s[len]))
2252 croak("Args must match #! line");
2255 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2256 euid == statbuf.st_uid)
2258 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2259 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2260 #endif /* IAMSUID */
2262 if (euid) { /* oops, we're not the setuid root perl */
2263 (void)PerlIO_close(rsfp);
2266 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2268 croak("Can't do setuid\n");
2271 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2273 (void)setegid(statbuf.st_gid);
2276 (void)setregid((Gid_t)-1,statbuf.st_gid);
2278 #ifdef HAS_SETRESGID
2279 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2281 setgid(statbuf.st_gid);
2285 if (getegid() != statbuf.st_gid)
2286 croak("Can't do setegid!\n");
2288 if (statbuf.st_mode & S_ISUID) {
2289 if (statbuf.st_uid != euid)
2291 (void)seteuid(statbuf.st_uid); /* all that for this */
2294 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2296 #ifdef HAS_SETRESUID
2297 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2299 setuid(statbuf.st_uid);
2303 if (geteuid() != statbuf.st_uid)
2304 croak("Can't do seteuid!\n");
2306 else if (uid) { /* oops, mustn't run as root */
2308 (void)seteuid((Uid_t)uid);
2311 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2313 #ifdef HAS_SETRESUID
2314 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2320 if (geteuid() != uid)
2321 croak("Can't do seteuid!\n");
2324 if (!cando(S_IXUSR,TRUE,&statbuf))
2325 croak("Permission denied\n"); /* they can't do this */
2328 else if (preprocess)
2329 croak("-P not allowed for setuid/setgid script\n");
2330 else if (fdscript >= 0)
2331 croak("fd script not allowed in suidperl\n");
2333 croak("Script is not setuid/setgid in suidperl\n");
2335 /* We absolutely must clear out any saved ids here, so we */
2336 /* exec the real perl, substituting fd script for scriptname. */
2337 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2338 PerlIO_rewind(rsfp);
2339 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2340 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2341 if (!origargv[which])
2342 croak("Permission denied");
2343 origargv[which] = savepv(form("/dev/fd/%d/%s",
2344 PerlIO_fileno(rsfp), origargv[which]));
2345 #if defined(HAS_FCNTL) && defined(F_SETFD)
2346 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2348 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2349 croak("Can't do setuid\n");
2350 #endif /* IAMSUID */
2352 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2353 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2355 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2356 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2358 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2361 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2362 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2363 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2364 /* not set-id, must be wrapped */
2370 find_beginning(void)
2372 register char *s, *s2;
2374 /* skip forward in input to the real script? */
2378 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2379 croak("No Perl script found in input\n");
2380 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2381 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2383 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2385 while (*s == ' ' || *s == '\t') s++;
2387 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2388 if (strnEQ(s2-4,"perl",4))
2390 while (s = moreswitches(s)) ;
2392 if (cddir && chdir(cddir) < 0)
2393 croak("Can't chdir to %s",cddir);
2401 uid = (int)getuid();
2402 euid = (int)geteuid();
2403 gid = (int)getgid();
2404 egid = (int)getegid();
2409 tainting |= (uid && (euid != uid || egid != gid));
2413 forbid_setid(char *s)
2416 croak("No %s allowed while running setuid", s);
2418 croak("No %s allowed while running setgid", s);
2425 curstash = debstash;
2426 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2428 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2429 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2430 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2431 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2432 sv_setiv(DBsingle, 0);
2433 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2434 sv_setiv(DBtrace, 0);
2435 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2436 sv_setiv(DBsignal, 0);
2437 curstash = defstash;
2441 init_stacks(ARGSproto)
2444 mainstack = curstack; /* remember in case we switch stacks */
2445 AvREAL_off(curstack); /* not a real array */
2446 av_extend(curstack,127);
2448 stack_base = AvARRAY(curstack);
2449 stack_sp = stack_base;
2450 stack_max = stack_base + 127;
2452 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2453 New(50,cxstack,cxstack_max + 1,CONTEXT);
2456 New(50,tmps_stack,128,SV*);
2462 * The following stacks almost certainly should be per-interpreter,
2463 * but for now they're not. XXX
2467 markstack_ptr = markstack;
2469 New(54,markstack,64,I32);
2470 markstack_ptr = markstack;
2471 markstack_max = markstack + 64;
2477 New(54,scopestack,32,I32);
2479 scopestack_max = 32;
2485 New(54,savestack,128,ANY);
2487 savestack_max = 128;
2493 New(54,retstack,16,OP*);
2504 Safefree(tmps_stack);
2511 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2520 subname = newSVpv("main",4);
2524 init_predump_symbols(void)
2531 sv_setpvn(*av_fetch(thr->magicals,find_thread_magical("\""),FALSE)," ", 1);
2533 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2534 #endif /* USE_THREADS */
2536 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2537 GvMULTI_on(stdingv);
2538 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2539 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2541 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2543 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2545 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2547 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2549 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2551 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2552 GvMULTI_on(othergv);
2553 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2554 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2556 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2558 statname = NEWSV(66,0); /* last filename we did stat on */
2561 osname = savepv(OSNAME);
2565 init_postdump_symbols(register int argc, register char **argv, register char **env)
2572 argc--,argv++; /* skip name of script */
2574 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2577 if (argv[0][1] == '-') {
2581 if (s = strchr(argv[0], '=')) {
2583 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2586 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2589 toptarget = NEWSV(0,0);
2590 sv_upgrade(toptarget, SVt_PVFM);
2591 sv_setpvn(toptarget, "", 0);
2592 bodytarget = NEWSV(0,0);
2593 sv_upgrade(bodytarget, SVt_PVFM);
2594 sv_setpvn(bodytarget, "", 0);
2595 formtarget = bodytarget;
2598 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2599 sv_setpv(GvSV(tmpgv),origfilename);
2600 magicname("0", "0", 1);
2602 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2603 sv_setpv(GvSV(tmpgv),origargv[0]);
2604 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2606 (void)gv_AVadd(argvgv);
2607 av_clear(GvAVn(argvgv));
2608 for (; argc > 0; argc--,argv++) {
2609 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2612 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2616 hv_magic(hv, envgv, 'E');
2617 #ifndef VMS /* VMS doesn't have environ array */
2618 /* Note that if the supplied env parameter is actually a copy
2619 of the global environ then it may now point to free'd memory
2620 if the environment has been modified since. To avoid this
2621 problem we treat env==NULL as meaning 'use the default'
2626 environ[0] = Nullch;
2627 for (; *env; env++) {
2628 if (!(s = strchr(*env,'=')))
2634 sv = newSVpv(s--,0);
2635 (void)hv_store(hv, *env, s - *env, sv, 0);
2637 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2638 /* Sins of the RTL. See note in my_setenv(). */
2639 (void)putenv(savepv(*env));
2643 #ifdef DYNAMIC_ENV_FETCH
2644 HvNAME(hv) = savepv(ENV_HV_NAME);
2648 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2649 sv_setiv(GvSV(tmpgv), (IV)getpid());
2658 s = getenv("PERL5LIB");
2662 incpush(getenv("PERLLIB"), FALSE);
2664 /* Treat PERL5?LIB as a possible search list logical name -- the
2665 * "natural" VMS idiom for a Unix path string. We allow each
2666 * element to be a set of |-separated directories for compatibility.
2670 if (my_trnlnm("PERL5LIB",buf,0))
2671 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2673 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2677 /* Use the ~-expanded versions of APPLLIB (undocumented),
2678 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2681 incpush(APPLLIB_EXP, FALSE);
2685 incpush(ARCHLIB_EXP, FALSE);
2688 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2690 incpush(PRIVLIB_EXP, FALSE);
2693 incpush(SITEARCH_EXP, FALSE);
2696 incpush(SITELIB_EXP, FALSE);
2698 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2699 incpush(OLDARCHLIB_EXP, FALSE);
2703 incpush(".", FALSE);
2707 # define PERLLIB_SEP ';'
2710 # define PERLLIB_SEP '|'
2712 # define PERLLIB_SEP ':'
2715 #ifndef PERLLIB_MANGLE
2716 # define PERLLIB_MANGLE(s,n) (s)
2720 incpush(char *p, int addsubdirs)
2722 SV *subdir = Nullsv;
2723 static char *archpat_auto;
2730 if (!archpat_auto) {
2731 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2732 + sizeof("//auto"));
2733 New(55, archpat_auto, len, char);
2734 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2736 for (len = sizeof(ARCHNAME) + 2;
2737 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2738 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2743 /* Break at all separators */
2745 SV *libdir = newSV(0);
2748 /* skip any consecutive separators */
2749 while ( *p == PERLLIB_SEP ) {
2750 /* Uncomment the next line for PATH semantics */
2751 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2755 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2756 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2761 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2762 p = Nullch; /* break out */
2766 * BEFORE pushing libdir onto @INC we may first push version- and
2767 * archname-specific sub-directories.
2770 struct stat tmpstatbuf;
2775 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2777 while (unix[len-1] == '/') len--; /* Cosmetic */
2778 sv_usepvn(libdir,unix,len);
2781 PerlIO_printf(PerlIO_stderr(),
2782 "Failed to unixify @INC element \"%s\"\n",
2785 /* .../archname/version if -d .../archname/version/auto */
2786 sv_setsv(subdir, libdir);
2787 sv_catpv(subdir, archpat_auto);
2788 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2789 S_ISDIR(tmpstatbuf.st_mode))
2790 av_push(GvAVn(incgv),
2791 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2793 /* .../archname if -d .../archname/auto */
2794 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2795 strlen(patchlevel) + 1, "", 0);
2796 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2797 S_ISDIR(tmpstatbuf.st_mode))
2798 av_push(GvAVn(incgv),
2799 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2802 /* finally push this lib directory on the end of @INC */
2803 av_push(GvAVn(incgv), libdir);
2806 SvREFCNT_dec(subdir);
2810 static struct thread *
2816 Newz(53, thr, 1, struct thread);
2817 curcop = &compiling;
2818 thr->cvcache = newHV();
2819 thr->magicals = newAV();
2820 thr->specific = newAV();
2821 thr->errhv = newHV();
2822 thr->flags = THRf_R_JOINABLE;
2823 MUTEX_INIT(&thr->mutex);
2824 /* Handcraft thrsv similarly to mess_sv */
2825 New(53, thrsv, 1, SV);
2826 Newz(53, xpv, 1, XPV);
2827 SvFLAGS(thrsv) = SVt_PV;
2828 SvANY(thrsv) = (void*)xpv;
2829 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2830 SvPVX(thrsv) = (char*)thr;
2831 SvCUR_set(thrsv, sizeof(thr));
2832 SvLEN_set(thrsv, sizeof(thr));
2833 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2835 curcop = &compiling;
2838 MUTEX_LOCK(&threads_mutex);
2843 MUTEX_UNLOCK(&threads_mutex);
2845 #ifdef HAVE_THREAD_INTERN
2846 init_thread_intern(thr);
2848 thr->self = pthread_self();
2849 #endif /* HAVE_THREAD_INTERN */
2853 * These must come after the SET_THR because sv_setpvn does
2854 * SvTAINT and the taint fields require dTHR.
2856 toptarget = NEWSV(0,0);
2857 sv_upgrade(toptarget, SVt_PVFM);
2858 sv_setpvn(toptarget, "", 0);
2859 bodytarget = NEWSV(0,0);
2860 sv_upgrade(bodytarget, SVt_PVFM);
2861 sv_setpvn(bodytarget, "", 0);
2862 formtarget = bodytarget;
2863 thr->errsv = newSVpv("", 0);
2866 #endif /* USE_THREADS */
2869 call_list(I32 oldscope, AV *list)
2872 line_t oldline = curcop->cop_line;
2877 while (AvFILL(list) >= 0) {
2878 CV *cv = (CV*)av_shift(list);
2887 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2888 (void)SvPV(errsv, len);
2891 curcop = &compiling;
2892 curcop->cop_line = oldline;
2893 if (list == beginav)
2894 sv_catpv(errsv, "BEGIN failed--compilation aborted");
2896 sv_catpv(errsv, "END failed--cleanup aborted");
2897 while (scopestack_ix > oldscope)
2899 croak("%s", SvPVX(errsv));
2907 /* my_exit() was called */
2908 while (scopestack_ix > oldscope)
2911 curstash = defstash;
2913 call_list(oldscope, endav);
2915 curcop = &compiling;
2916 curcop->cop_line = oldline;
2918 if (list == beginav)
2919 croak("BEGIN failed--compilation aborted");
2921 croak("END failed--cleanup aborted");
2927 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2932 curcop = &compiling;
2933 curcop->cop_line = oldline;
2946 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2947 thr, (unsigned long) status));
2948 #endif /* USE_THREADS */
2957 STATUS_NATIVE_SET(status);
2964 my_failure_exit(void)
2967 if (vaxc$errno & 1) {
2968 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2969 STATUS_NATIVE_SET(44);
2972 if (!vaxc$errno && errno) /* unlikely */
2973 STATUS_NATIVE_SET(44);
2975 STATUS_NATIVE_SET(vaxc$errno);
2979 STATUS_POSIX_SET(errno);
2980 else if (STATUS_POSIX == 0)
2981 STATUS_POSIX_SET(255);
2990 register CONTEXT *cx;
2999 (void)UNLINK(e_tmpname);
3000 Safefree(e_tmpname);
3004 if (cxstack_ix >= 0) {