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 */
481 /* reset so print() ends up where we expect */
484 /* Prepare to destruct main symbol table. */
491 if (destruct_level >= 2) {
492 if (scopestack_ix != 0)
493 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
494 (long)scopestack_ix);
495 if (savestack_ix != 0)
496 warn("Unbalanced saves: %ld more saves than restores\n",
498 if (tmps_floor != -1)
499 warn("Unbalanced tmps: %ld more allocs than frees\n",
500 (long)tmps_floor + 1);
501 if (cxstack_ix != -1)
502 warn("Unbalanced context: %ld more PUSHes than POPs\n",
503 (long)cxstack_ix + 1);
506 /* Now absolutely destruct everything, somehow or other, loops or no. */
508 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
509 while (sv_count != 0 && sv_count != last_sv_count) {
510 last_sv_count = sv_count;
513 SvFLAGS(strtab) &= ~SVTYPEMASK;
514 SvFLAGS(strtab) |= SVt_PVHV;
516 /* Destruct the global string table. */
518 /* Yell and reset the HeVAL() slots that are still holding refcounts,
519 * so that sv_free() won't fail on them.
528 array = HvARRAY(strtab);
532 warn("Unbalanced string table refcount: (%d) for \"%s\"",
533 HeVAL(hent) - Nullsv, HeKEY(hent));
534 HeVAL(hent) = Nullsv;
544 SvREFCNT_dec(strtab);
547 warn("Scalars leaked: %ld\n", (long)sv_count);
551 /* No SVs have survived, need to clean out */
555 Safefree(origfilename);
557 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
559 DEBUG_P(debprofdump());
561 MUTEX_DESTROY(&sv_mutex);
562 MUTEX_DESTROY(&malloc_mutex);
563 MUTEX_DESTROY(&eval_mutex);
564 COND_DESTROY(&eval_cond);
566 /* As the penultimate thing, free the non-arena SV for thrsv */
567 Safefree(SvPVX(thrsv));
568 Safefree(SvANY(thrsv));
571 #endif /* USE_THREADS */
573 /* As the absolutely last thing, free the non-arena SV for mess() */
576 /* we know that type >= SVt_PV */
578 Safefree(SvPVX(mess_sv));
579 Safefree(SvANY(mess_sv));
586 perl_free(PerlInterpreter *sv_interp)
588 if (!(curinterp = sv_interp))
594 perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
599 char *scriptname = NULL;
600 VOL bool dosearch = FALSE;
607 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
610 croak("suidperl is no longer needed since the kernel can now execute\n\
611 setuid perl scripts securely.\n");
615 if (!(curinterp = sv_interp))
618 #if defined(NeXT) && defined(__DYNAMIC__)
619 _dyld_lookup_and_bind
620 ("__environ", (unsigned long *) &environ_pointer, NULL);
625 #ifndef VMS /* VMS doesn't have environ array */
626 origenviron = environ;
632 /* Come here if running an undumped a.out. */
634 origfilename = savepv(argv[0]);
636 cxstack_ix = -1; /* start label stack again */
638 init_postdump_symbols(argc,argv,env);
643 curpad = AvARRAY(comppad);
648 SvREFCNT_dec(main_cv);
652 oldscope = scopestack_ix;
660 /* my_exit() was called */
661 while (scopestack_ix > oldscope)
666 call_list(oldscope, endav);
668 return STATUS_NATIVE_EXPORT;
671 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
675 sv_setpvn(linestr,"",0);
676 sv = newSVpv("",0); /* first used for -I flags */
680 for (argc--,argv++; argc > 0; argc--,argv++) {
681 if (argv[0][0] != '-' || !argv[0][1])
685 validarg = " PHOOEY ";
710 if (s = moreswitches(s))
720 if (euid != uid || egid != gid)
721 croak("No -e allowed in setuid scripts");
723 e_tmpname = savepv(TMPPATH);
724 (void)mktemp(e_tmpname);
726 croak("Can't mktemp()");
727 e_fp = PerlIO_open(e_tmpname,"w");
729 croak("Cannot open temporary file");
734 PerlIO_puts(e_fp,argv[1]);
738 croak("No code specified for -e");
739 (void)PerlIO_putc(e_fp,'\n');
741 case 'I': /* -I handled both here and in moreswitches() */
743 if (!*++s && (s=argv[1]) != Nullch) {
746 while (s && isSPACE(*s))
750 for (e = s; *e && !isSPACE(*e); e++) ;
757 } /* XXX else croak? */
771 preambleav = newAV();
772 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
774 Sv = newSVpv("print myconfig();",0);
776 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
778 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
780 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
781 sv_catpv(Sv,"\" Compile-time options:");
783 sv_catpv(Sv," DEBUGGING");
786 sv_catpv(Sv," NO_EMBED");
789 sv_catpv(Sv," MULTIPLICITY");
791 sv_catpv(Sv,"\\n\",");
793 #if defined(LOCAL_PATCH_COUNT)
794 if (LOCAL_PATCH_COUNT > 0) {
796 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
797 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
799 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
803 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
806 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
808 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
813 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
814 print \" \\%ENV:\\n @env\\n\" if @env; \
815 print \" \\@INC:\\n @INC\\n\";");
818 Sv = newSVpv("config_vars(qw(",0);
823 av_push(preambleav, Sv);
824 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
835 if (!*++s || isSPACE(*s)) {
839 /* catch use of gnu style long options */
840 if (strEQ(s, "version")) {
844 if (strEQ(s, "help")) {
851 croak("Unrecognized switch: -%s (-h will show valid options)",s);
856 if (!tainting && (s = getenv("PERL5OPT"))) {
867 if (!strchr("DIMUdmw", *s))
868 croak("Illegal switch in PERL5OPT: -%c", *s);
874 scriptname = argv[0];
876 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
878 warn("Did you forget to compile with -DMULTIPLICITY?");
880 croak("Can't write to temp file for -e: %s", Strerror(errno));
884 scriptname = e_tmpname;
886 else if (scriptname == Nullch) {
888 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
896 open_script(scriptname,dosearch,sv);
898 validate_suid(validarg, scriptname);
903 main_cv = compcv = (CV*)NEWSV(1104,0);
904 sv_upgrade((SV *)compcv, SVt_PVCV);
908 av_push(comppad, Nullsv);
909 curpad = AvARRAY(comppad);
910 comppad_name = newAV();
911 comppad_name_fill = 0;
912 min_intro_pending = 0;
915 av_store(comppad_name, 0, newSVpv("@_", 2));
916 curpad[0] = (SV*)newAV();
917 SvPADMY_on(curpad[0]); /* XXX Needed? */
919 New(666, CvMUTEXP(compcv), 1, perl_mutex);
920 MUTEX_INIT(CvMUTEXP(compcv));
921 #endif /* USE_THREADS */
923 comppadlist = newAV();
924 AvREAL_off(comppadlist);
925 av_store(comppadlist, 0, (SV*)comppad_name);
926 av_store(comppadlist, 1, (SV*)comppad);
927 CvPADLIST(compcv) = comppadlist;
929 boot_core_UNIVERSAL();
931 (*xsinit)(); /* in case linked C routines want magical variables */
932 #if defined(VMS) || defined(WIN32)
936 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
937 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
940 init_predump_symbols();
942 init_postdump_symbols(argc,argv,env);
946 /* now parse the script */
949 if (yyparse() || error_count) {
951 croak("%s had compilation errors.\n", origfilename);
953 croak("Execution of %s aborted due to compilation errors.\n",
957 curcop->cop_line = 0;
961 (void)UNLINK(e_tmpname);
966 /* now that script is parsed, we can modify record separator */
968 rs = SvREFCNT_inc(nrs);
970 sv_setsv(*av_fetch(thr->magicals, find_thread_magical("/"), FALSE), rs);
972 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
973 #endif /* USE_THREADS */
984 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
985 dump_mstats("after compilation:");
995 perl_run(PerlInterpreter *sv_interp)
1002 if (!(curinterp = sv_interp))
1005 oldscope = scopestack_ix;
1010 cxstack_ix = -1; /* start context stack again */
1013 /* my_exit() was called */
1014 while (scopestack_ix > oldscope)
1017 curstash = defstash;
1019 call_list(oldscope, endav);
1021 if (getenv("PERL_DEBUG_MSTATS"))
1022 dump_mstats("after execution: ");
1025 return STATUS_NATIVE_EXPORT;
1028 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1033 if (curstack != mainstack) {
1035 SWITCHSTACK(curstack, mainstack);
1040 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1041 sawampersand ? "Enabling" : "Omitting"));
1044 DEBUG_x(dump_all());
1045 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1047 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1048 (unsigned long) thr));
1049 #endif /* USE_THREADS */
1052 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1055 if (PERLDB_SINGLE && DBsingle)
1056 sv_setiv(DBsingle, 1);
1058 call_list(oldscope, initav);
1068 else if (main_start) {
1069 CvDEPTH(main_cv) = 1;
1080 perl_get_sv(char *name, I32 create)
1084 if (name[1] == '\0' && !isALPHA(name[0])) {
1085 PADOFFSET tmp = find_thread_magical(name);
1086 if (tmp != NOT_IN_PAD) {
1088 return *av_fetch(thr->magicals, tmp, FALSE);
1091 #endif /* USE_THREADS */
1092 gv = gv_fetchpv(name, create, SVt_PV);
1099 perl_get_av(char *name, I32 create)
1101 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1110 perl_get_hv(char *name, I32 create)
1112 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1121 perl_get_cv(char *name, I32 create)
1123 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1124 if (create && !GvCVu(gv))
1125 return newSUB(start_subparse(FALSE, 0),
1126 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1134 /* Be sure to refetch the stack pointer after calling these routines. */
1137 perl_call_argv(char *subname, I32 flags, register char **argv)
1139 /* See G_* flags in cop.h */
1140 /* null terminated arg list */
1147 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1152 return perl_call_pv(subname, flags);
1156 perl_call_pv(char *subname, I32 flags)
1157 /* name of the subroutine */
1158 /* See G_* flags in cop.h */
1160 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1164 perl_call_method(char *methname, I32 flags)
1165 /* name of the subroutine */
1166 /* See G_* flags in cop.h */
1172 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1175 return perl_call_sv(*stack_sp--, flags);
1178 /* May be called with any of a CV, a GV, or an SV containing the name. */
1180 perl_call_sv(SV *sv, I32 flags)
1182 /* See G_* flags in cop.h */
1185 LOGOP myop; /* fake syntax tree node */
1191 bool oldcatch = CATCH_GET;
1196 if (flags & G_DISCARD) {
1201 Zero(&myop, 1, LOGOP);
1202 myop.op_next = Nullop;
1203 if (!(flags & G_NOARGS))
1204 myop.op_flags |= OPf_STACKED;
1205 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1206 (flags & G_ARRAY) ? OPf_WANT_LIST :
1211 EXTEND(stack_sp, 1);
1214 oldscope = scopestack_ix;
1216 if (PERLDB_SUB && curstash != debstash
1217 /* Handle first BEGIN of -d. */
1218 && (DBcv || (DBcv = GvCV(DBsub)))
1219 /* Try harder, since this may have been a sighandler, thus
1220 * curstash may be meaningless. */
1221 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1222 op->op_private |= OPpENTERSUB_DB;
1224 if (flags & G_EVAL) {
1225 cLOGOP->op_other = op;
1227 /* we're trying to emulate pp_entertry() here */
1229 register CONTEXT *cx;
1230 I32 gimme = GIMME_V;
1235 push_return(op->op_next);
1236 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1238 eval_root = op; /* Only needed so that goto works right. */
1241 if (flags & G_KEEPERR)
1256 /* my_exit() was called */
1257 curstash = defstash;
1261 croak("Callback called exit");
1270 stack_sp = stack_base + oldmark;
1271 if (flags & G_ARRAY)
1275 *++stack_sp = &sv_undef;
1283 if (op == (OP*)&myop)
1284 op = pp_entersub(ARGS);
1287 retval = stack_sp - (stack_base + oldmark);
1288 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1292 if (flags & G_EVAL) {
1293 if (scopestack_ix > oldscope) {
1297 register CONTEXT *cx;
1309 CATCH_SET(oldcatch);
1311 if (flags & G_DISCARD) {
1312 stack_sp = stack_base + oldmark;
1321 /* Eval a string. The G_EVAL flag is always assumed. */
1324 perl_eval_sv(SV *sv, I32 flags)
1326 /* See G_* flags in cop.h */
1329 UNOP myop; /* fake syntax tree node */
1331 I32 oldmark = sp - stack_base;
1338 if (flags & G_DISCARD) {
1346 EXTEND(stack_sp, 1);
1348 oldscope = scopestack_ix;
1350 if (!(flags & G_NOARGS))
1351 myop.op_flags = OPf_STACKED;
1352 myop.op_next = Nullop;
1353 myop.op_type = OP_ENTEREVAL;
1354 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1355 (flags & G_ARRAY) ? OPf_WANT_LIST :
1357 if (flags & G_KEEPERR)
1358 myop.op_flags |= OPf_SPECIAL;
1368 /* my_exit() was called */
1369 curstash = defstash;
1373 croak("Callback called exit");
1382 stack_sp = stack_base + oldmark;
1383 if (flags & G_ARRAY)
1387 *++stack_sp = &sv_undef;
1392 if (op == (OP*)&myop)
1393 op = pp_entereval(ARGS);
1396 retval = stack_sp - (stack_base + oldmark);
1397 if (!(flags & G_KEEPERR))
1402 if (flags & G_DISCARD) {
1403 stack_sp = stack_base + oldmark;
1413 perl_eval_pv(char *p, I32 croak_on_error)
1416 SV* sv = newSVpv(p, 0);
1419 perl_eval_sv(sv, G_SCALAR);
1426 if (croak_on_error && SvTRUE(ERRSV))
1427 croak(SvPVx(ERRSV, na));
1432 /* Require a module. */
1435 perl_require_pv(char *pv)
1437 SV* sv = sv_newmortal();
1438 sv_setpv(sv, "require '");
1441 perl_eval_sv(sv, G_DISCARD);
1445 magicname(char *sym, char *name, I32 namlen)
1449 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1450 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1454 usage(char *name) /* XXX move this out into a module ? */
1457 /* This message really ought to be max 23 lines.
1458 * Removed -h because the user already knows that opton. Others? */
1460 static char *usage[] = {
1461 "-0[octal] specify record separator (\\0, if no argument)",
1462 "-a autosplit mode with -n or -p (splits $_ into @F)",
1463 "-c check syntax only (runs BEGIN and END blocks)",
1464 "-d[:debugger] run scripts under debugger",
1465 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1466 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1467 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1468 "-i[extension] edit <> files in place (make backup if extension supplied)",
1469 "-Idirectory specify @INC/#include directory (may be used more than once)",
1470 "-l[octal] enable line ending processing, specifies line terminator",
1471 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1472 "-n assume 'while (<>) { ... }' loop around your script",
1473 "-p assume loop like -n but print line also like sed",
1474 "-P run script through C preprocessor before compilation",
1475 "-s enable some switch parsing for switches after script name",
1476 "-S look for the script using PATH environment variable",
1477 "-T turn on tainting checks",
1478 "-u dump core after parsing script",
1479 "-U allow unsafe operations",
1480 "-v print version number and patchlevel of perl",
1481 "-V[:variable] print perl configuration information",
1482 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1483 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1489 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1491 printf("\n %s", *p++);
1494 /* This routine handles any switches that can be given during run */
1497 moreswitches(char *s)
1506 rschar = scan_oct(s, 4, &numlen);
1508 if (rschar & ~((U8)~0))
1510 else if (!rschar && numlen >= 2)
1511 nrs = newSVpv("", 0);
1514 nrs = newSVpv(&ch, 1);
1520 splitstr = savepv(s + 1);
1534 if (*s == ':' || *s == '=') {
1535 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1539 perldb = PERLDB_ALL;
1546 if (isALPHA(s[1])) {
1547 static char debopts[] = "psltocPmfrxuLHXD";
1550 for (s++; *s && (d = strchr(debopts,*s)); s++)
1551 debug |= 1 << (d - debopts);
1555 for (s++; isDIGIT(*s); s++) ;
1557 debug |= 0x80000000;
1559 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1560 for (s++; isALNUM(*s); s++) ;
1570 inplace = savepv(s+1);
1572 for (s = inplace; *s && !isSPACE(*s); s++) ;
1576 case 'I': /* -I handled both here and in parse_perl() */
1579 while (*s && isSPACE(*s))
1583 for (e = s; *e && !isSPACE(*e); e++) ;
1584 p = savepvn(s, e-s);
1590 croak("No space allowed after -I");
1600 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1610 ors = SvPV(nrs, orslen);
1611 ors = savepvn(ors, orslen);
1615 forbid_setid("-M"); /* XXX ? */
1618 forbid_setid("-m"); /* XXX ? */
1623 /* -M-foo == 'no foo' */
1624 if (*s == '-') { use = "no "; ++s; }
1625 sv = newSVpv(use,0);
1627 /* We allow -M'Module qw(Foo Bar)' */
1628 while(isALNUM(*s) || *s==':') ++s;
1630 sv_catpv(sv, start);
1631 if (*(start-1) == 'm') {
1633 croak("Can't use '%c' after -mname", *s);
1634 sv_catpv( sv, " ()");
1637 sv_catpvn(sv, start, s-start);
1638 sv_catpv(sv, " split(/,/,q{");
1643 if (preambleav == NULL)
1644 preambleav = newAV();
1645 av_push(preambleav, sv);
1648 croak("No space allowed after -%c", *(s-1));
1665 croak("Too late for \"-T\" option");
1677 #if defined(SUBVERSION) && SUBVERSION > 0
1678 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1679 PATCHLEVEL, SUBVERSION, ARCHNAME);
1681 printf("\nThis is perl, version %s built for %s",
1682 patchlevel, ARCHNAME);
1684 #if defined(LOCAL_PATCH_COUNT)
1685 if (LOCAL_PATCH_COUNT > 0)
1686 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1687 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1690 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1692 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1695 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1698 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1699 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1702 printf("atariST series port, ++jrb bammi@cadence.com\n");
1705 Perl may be copied only under the terms of either the Artistic License or the\n\
1706 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1714 if (s[1] == '-') /* Additional switches on #! line. */
1722 #ifdef ALTERNATE_SHEBANG
1723 case 'S': /* OS/2 needs -S on "extproc" line. */
1731 croak("Can't emulate -%.1s on #! line",s);
1736 /* compliments of Tom Christiansen */
1738 /* unexec() can be found in the Gnu emacs distribution */
1749 prog = newSVpv(BIN_EXP);
1750 sv_catpv(prog, "/perl");
1751 file = newSVpv(origfilename);
1752 sv_catpv(file, ".perldump");
1754 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1756 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1757 SvPVX(prog), SvPVX(file));
1761 # include <lib$routines.h>
1762 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1764 ABORT(); /* for use with undump */
1770 init_main_stash(void)
1775 /* Note that strtab is a rather special HV. Assumptions are made
1776 about not iterating on it, and not adding tie magic to it.
1777 It is properly deallocated in perl_destruct() */
1779 HvSHAREKEYS_off(strtab); /* mandatory */
1780 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1781 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1783 curstash = defstash = newHV();
1784 curstname = newSVpv("main",4);
1785 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1786 SvREFCNT_dec(GvHV(gv));
1787 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1789 HvNAME(defstash) = savepv("main");
1790 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1792 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1793 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1795 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1796 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1797 sv_setpvn(ERRSV, "", 0);
1798 curstash = defstash;
1799 compiling.cop_stash = defstash;
1800 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1801 globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", 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);
2849 #ifdef SET_THREAD_SELF
2850 SET_THREAD_SELF(thr);
2852 thr->self = pthread_self();
2853 #endif /* SET_THREAD_SELF */
2857 * These must come after the SET_THR because sv_setpvn does
2858 * SvTAINT and the taint fields require dTHR.
2860 toptarget = NEWSV(0,0);
2861 sv_upgrade(toptarget, SVt_PVFM);
2862 sv_setpvn(toptarget, "", 0);
2863 bodytarget = NEWSV(0,0);
2864 sv_upgrade(bodytarget, SVt_PVFM);
2865 sv_setpvn(bodytarget, "", 0);
2866 formtarget = bodytarget;
2867 thr->errsv = newSVpv("", 0);
2870 #endif /* USE_THREADS */
2873 call_list(I32 oldscope, AV *list)
2876 line_t oldline = curcop->cop_line;
2881 while (AvFILL(list) >= 0) {
2882 CV *cv = (CV*)av_shift(list);
2891 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2892 (void)SvPV(atsv, len);
2895 curcop = &compiling;
2896 curcop->cop_line = oldline;
2897 if (list == beginav)
2898 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2900 sv_catpv(atsv, "END failed--cleanup aborted");
2901 while (scopestack_ix > oldscope)
2903 croak("%s", SvPVX(atsv));
2911 /* my_exit() was called */
2912 while (scopestack_ix > oldscope)
2915 curstash = defstash;
2917 call_list(oldscope, endav);
2919 curcop = &compiling;
2920 curcop->cop_line = oldline;
2922 if (list == beginav)
2923 croak("BEGIN failed--compilation aborted");
2925 croak("END failed--cleanup aborted");
2931 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2936 curcop = &compiling;
2937 curcop->cop_line = oldline;
2950 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2951 thr, (unsigned long) status));
2952 #endif /* USE_THREADS */
2961 STATUS_NATIVE_SET(status);
2968 my_failure_exit(void)
2971 if (vaxc$errno & 1) {
2972 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2973 STATUS_NATIVE_SET(44);
2976 if (!vaxc$errno && errno) /* unlikely */
2977 STATUS_NATIVE_SET(44);
2979 STATUS_NATIVE_SET(vaxc$errno);
2983 STATUS_POSIX_SET(errno);
2984 else if (STATUS_POSIX == 0)
2985 STATUS_POSIX_SET(255);
2994 register CONTEXT *cx;
3003 (void)UNLINK(e_tmpname);
3004 Safefree(e_tmpname);
3008 if (cxstack_ix >= 0) {