3 * Copyright (c) 1987-1997 Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
16 #include "patchlevel.h"
18 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
23 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
24 char *getenv _((char *)); /* Usually in <stdlib.h> */
27 dEXTCONST char rcsid[] = "perl.c\nPatch level: ###\n";
35 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
45 curcop = &compiling; \
52 laststype = OP_STAT; \
54 maxsysfd = MAXSYSFD; \
61 laststype = OP_STAT; \
65 static void find_beginning _((void));
66 static void forbid_setid _((char *));
67 static void incpush _((char *, int));
68 static void init_ids _((void));
69 static void init_debugger _((void));
70 static void init_lexer _((void));
71 static void init_main_stash _((void));
72 static void init_perllib _((void));
73 static void init_postdump_symbols _((int, char **, char **));
74 static void init_predump_symbols _((void));
75 static void my_exit_jump _((void)) __attribute__((noreturn));
76 static void nuke_stacks _((void));
77 static void open_script _((char *, bool, SV *));
78 static void usage _((char *));
79 static void validate_suid _((char *, char*));
81 static int fdscript = -1;
83 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
84 #include <asm/sigcontext.h>
86 catch_sigsegv(int signo, struct sigcontext_struct sc)
88 signal(SIGSEGV, SIG_DFL);
89 fprintf(stderr, "Segmentation fault dereferencing 0x%lx\n"
90 "return_address = 0x%lx, eip = 0x%lx\n",
91 sc.cr2, __builtin_return_address(0), sc.eip);
92 fprintf(stderr, "thread = 0x%lx\n", (unsigned long)THR);
99 PerlInterpreter *sv_interp;
102 New(53, sv_interp, 1, PerlInterpreter);
107 perl_construct(register PerlInterpreter *sv_interp)
113 #endif /* FAKE_THREADS */
114 #endif /* USE_THREADS */
116 if (!(curinterp = sv_interp))
120 Zero(sv_interp, 1, PerlInterpreter);
123 /* Init the real globals (and main thread)? */
129 if (pthread_key_create(&thr_key, 0))
130 croak("panic: pthread_key_create");
132 MUTEX_INIT(&malloc_mutex);
133 MUTEX_INIT(&sv_mutex);
135 * Safe to use basic SV functions from now on (though
136 * not things like mortals or tainting yet).
138 MUTEX_INIT(&eval_mutex);
139 COND_INIT(&eval_cond);
140 MUTEX_INIT(&threads_mutex);
141 COND_INIT(&nthreads_cond);
142 MUTEX_INIT(&keys_mutex);
144 thr = new_struct_thread(0);
145 #endif /* USE_THREADS */
147 linestr = NEWSV(65,80);
148 sv_upgrade(linestr,SVt_PVIV);
150 if (!SvREADONLY(&sv_undef)) {
151 SvREADONLY_on(&sv_undef);
155 SvREADONLY_on(&sv_no);
157 sv_setpv(&sv_yes,Yes);
159 SvREADONLY_on(&sv_yes);
162 nrs = newSVpv("\n", 1);
163 rs = SvREFCNT_inc(nrs);
165 sighandlerp = sighandler;
170 * There is no way we can refer to them from Perl so close them to save
171 * space. The other alternative would be to provide STDAUX and STDPRN
174 (void)fclose(stdaux);
175 (void)fclose(stdprn);
181 perl_destruct_level = 1;
183 if(perl_destruct_level > 0)
188 lex_state = LEX_NOTPARSING;
190 start_env.je_prev = NULL;
191 start_env.je_ret = -1;
192 start_env.je_mustcatch = TRUE;
193 top_env = &start_env;
196 SET_NUMERIC_STANDARD();
197 #if defined(SUBVERSION) && SUBVERSION > 0
198 sprintf(patchlevel, "%7.5f", (double) 5
199 + ((double) PATCHLEVEL / (double) 1000)
200 + ((double) SUBVERSION / (double) 100000));
202 sprintf(patchlevel, "%5.3f", (double) 5 +
203 ((double) PATCHLEVEL / (double) 1000));
206 #if defined(LOCAL_PATCH_COUNT)
207 localpatches = local_patches; /* For possible -v */
210 PerlIO_init(); /* Hook to IO system */
212 fdpid = newAV(); /* for remembering popen pids by fd */
214 for (i = 0; i < N_PER_THREAD_MAGICALS; i++)
215 magical_keys[i] = NOT_IN_PAD;
216 keys = newSVpv("", 0);
219 New(51,debname,128,char);
220 New(52,debdelim,128,char);
227 perl_destruct(register PerlInterpreter *sv_interp)
230 int destruct_level; /* 0=none, 1=full, 2=full with checks */
235 #endif /* USE_THREADS */
237 if (!(curinterp = sv_interp))
242 /* Pass 1 on any remaining threads: detach joinables, join zombies */
244 MUTEX_LOCK(&threads_mutex);
245 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
246 "perl_destruct: waiting for %d threads...\n",
248 for (t = thr->next; t != thr; t = t->next) {
249 MUTEX_LOCK(&t->mutex);
250 switch (ThrSTATE(t)) {
253 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
254 "perl_destruct: joining zombie %p\n", t));
255 ThrSETSTATE(t, THRf_DEAD);
256 MUTEX_UNLOCK(&t->mutex);
259 * The SvREFCNT_dec below may take a long time (e.g. av
260 * may contain an object scalar whose destructor gets
261 * called) so we have to unlock threads_mutex and start
264 MUTEX_UNLOCK(&threads_mutex);
266 SvREFCNT_dec((SV*)av);
267 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
268 "perl_destruct: joined zombie %p OK\n", t));
270 case THRf_R_JOINABLE:
271 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
272 "perl_destruct: detaching thread %p\n", t));
273 ThrSETSTATE(t, THRf_R_DETACHED);
275 * We unlock threads_mutex and t->mutex in the opposite order
276 * from which we locked them just so that DETACH won't
277 * deadlock if it panics. It's only a breach of good style
278 * not a bug since they are unlocks not locks.
280 MUTEX_UNLOCK(&threads_mutex);
282 MUTEX_UNLOCK(&t->mutex);
285 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
286 "perl_destruct: ignoring %p (state %u)\n",
288 MUTEX_UNLOCK(&t->mutex);
289 /* fall through and out */
292 /* We leave the above "Pass 1" loop with threads_mutex still locked */
294 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
297 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
298 "perl_destruct: final wait for %d threads\n",
300 COND_WAIT(&nthreads_cond, &threads_mutex);
302 /* At this point, we're the last thread */
303 MUTEX_UNLOCK(&threads_mutex);
304 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
305 MUTEX_DESTROY(&threads_mutex);
306 COND_DESTROY(&nthreads_cond);
307 #endif /* !defined(FAKE_THREADS) */
308 #endif /* USE_THREADS */
310 destruct_level = perl_destruct_level;
314 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
316 if (destruct_level < i)
325 /* We must account for everything. */
327 /* Destroy the main CV and syntax tree */
329 curpad = AvARRAY(comppad);
334 SvREFCNT_dec(main_cv);
339 * Try to destruct global references. We do this first so that the
340 * destructors and destructees still exist. Some sv's might remain.
341 * Non-referenced objects are on their own.
348 /* unhook hooks which will soon be, or use, destroyed data */
349 SvREFCNT_dec(warnhook);
351 SvREFCNT_dec(diehook);
353 SvREFCNT_dec(parsehook);
356 if (destruct_level == 0){
358 DEBUG_P(debprofdump());
360 /* The exit() function will do everything that needs doing. */
364 /* loosen bonds of global variables */
367 (void)PerlIO_close(rsfp);
371 /* Filters for program text */
372 SvREFCNT_dec(rsfp_filters);
373 rsfp_filters = Nullav;
385 sawampersand = FALSE; /* must save all match strings */
386 sawstudy = FALSE; /* do fbm_instr on all strings */
401 /* magical thingies */
403 Safefree(ofs); /* $, */
406 Safefree(ors); /* $\ */
409 SvREFCNT_dec(nrs); /* $\ helper */
412 multiline = 0; /* $* */
414 SvREFCNT_dec(statname);
418 /* defgv, aka *_ should be taken care of elsewhere */
420 #if 0 /* just about all regexp stuff, seems to be ok */
422 /* shortcuts to regexp stuff */
427 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
429 regprecomp = NULL; /* uncompiled string. */
430 regparse = NULL; /* Input-scan pointer. */
431 regxend = NULL; /* End of input for compile */
432 regnpar = 0; /* () count. */
433 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
434 regsize = 0; /* Code size. */
435 regnaughty = 0; /* How bad is this pattern? */
436 regsawback = 0; /* Did we see \1, ...? */
438 reginput = NULL; /* String-input pointer. */
439 regbol = NULL; /* Beginning of input, for ^ check. */
440 regeol = NULL; /* End of input, for $ check. */
441 regstartp = (char **)NULL; /* Pointer to startp array. */
442 regendp = (char **)NULL; /* Ditto for endp. */
443 reglastparen = 0; /* Similarly for lastparen. */
444 regtill = NULL; /* How far we are required to go. */
445 regflags = 0; /* are we folding, multilining? */
446 regprev = (char)NULL; /* char before regbol, \n if none */
450 /* clean up after study() */
451 SvREFCNT_dec(lastscream);
453 Safefree(screamfirst);
455 Safefree(screamnext);
458 /* startup and shutdown function lists */
459 SvREFCNT_dec(beginav);
461 SvREFCNT_dec(initav);
466 /* temp stack during pp_sort() */
467 SvREFCNT_dec(sortstack);
470 /* 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->specific, find_thread_magical("/"), TRUE), 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)
1082 GV* gv = gv_fetchpv(name, create, SVt_PV);
1089 perl_get_av(char *name, I32 create)
1091 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1100 perl_get_hv(char *name, I32 create)
1102 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1111 perl_get_cv(char *name, I32 create)
1113 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1114 if (create && !GvCVu(gv))
1115 return newSUB(start_subparse(FALSE, 0),
1116 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1124 /* Be sure to refetch the stack pointer after calling these routines. */
1127 perl_call_argv(char *subname, I32 flags, register char **argv)
1129 /* See G_* flags in cop.h */
1130 /* null terminated arg list */
1138 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1143 return perl_call_pv(subname, flags);
1147 perl_call_pv(char *subname, I32 flags)
1148 /* name of the subroutine */
1149 /* See G_* flags in cop.h */
1151 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1155 perl_call_method(char *methname, I32 flags)
1156 /* name of the subroutine */
1157 /* See G_* flags in cop.h */
1164 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1167 return perl_call_sv(*stack_sp--, flags);
1170 /* May be called with any of a CV, a GV, or an SV containing the name. */
1172 perl_call_sv(SV *sv, I32 flags)
1174 /* See G_* flags in cop.h */
1177 LOGOP myop; /* fake syntax tree node */
1183 bool oldcatch = CATCH_GET;
1188 if (flags & G_DISCARD) {
1193 Zero(&myop, 1, LOGOP);
1194 myop.op_next = Nullop;
1195 if (!(flags & G_NOARGS))
1196 myop.op_flags |= OPf_STACKED;
1197 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1198 (flags & G_ARRAY) ? OPf_WANT_LIST :
1203 EXTEND(stack_sp, 1);
1206 oldscope = scopestack_ix;
1208 if (PERLDB_SUB && curstash != debstash
1209 /* Handle first BEGIN of -d. */
1210 && (DBcv || (DBcv = GvCV(DBsub)))
1211 /* Try harder, since this may have been a sighandler, thus
1212 * curstash may be meaningless. */
1213 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1214 op->op_private |= OPpENTERSUB_DB;
1216 if (flags & G_EVAL) {
1217 cLOGOP->op_other = op;
1219 /* we're trying to emulate pp_entertry() here */
1221 register CONTEXT *cx;
1222 I32 gimme = GIMME_V;
1227 push_return(op->op_next);
1228 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1230 eval_root = op; /* Only needed so that goto works right. */
1233 if (flags & G_KEEPERR)
1248 /* my_exit() was called */
1249 curstash = defstash;
1253 croak("Callback called exit");
1262 stack_sp = stack_base + oldmark;
1263 if (flags & G_ARRAY)
1267 *++stack_sp = &sv_undef;
1275 if (op == (OP*)&myop)
1276 op = pp_entersub(ARGS);
1279 retval = stack_sp - (stack_base + oldmark);
1280 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1284 if (flags & G_EVAL) {
1285 if (scopestack_ix > oldscope) {
1289 register CONTEXT *cx;
1301 CATCH_SET(oldcatch);
1303 if (flags & G_DISCARD) {
1304 stack_sp = stack_base + oldmark;
1313 /* Eval a string. The G_EVAL flag is always assumed. */
1316 perl_eval_sv(SV *sv, I32 flags)
1318 /* See G_* flags in cop.h */
1321 UNOP myop; /* fake syntax tree node */
1323 I32 oldmark = sp - stack_base;
1330 if (flags & G_DISCARD) {
1338 EXTEND(stack_sp, 1);
1340 oldscope = scopestack_ix;
1342 if (!(flags & G_NOARGS))
1343 myop.op_flags = OPf_STACKED;
1344 myop.op_next = Nullop;
1345 myop.op_type = OP_ENTEREVAL;
1346 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1347 (flags & G_ARRAY) ? OPf_WANT_LIST :
1349 if (flags & G_KEEPERR)
1350 myop.op_flags |= OPf_SPECIAL;
1360 /* my_exit() was called */
1361 curstash = defstash;
1365 croak("Callback called exit");
1374 stack_sp = stack_base + oldmark;
1375 if (flags & G_ARRAY)
1379 *++stack_sp = &sv_undef;
1384 if (op == (OP*)&myop)
1385 op = pp_entereval(ARGS);
1388 retval = stack_sp - (stack_base + oldmark);
1389 if (!(flags & G_KEEPERR))
1394 if (flags & G_DISCARD) {
1395 stack_sp = stack_base + oldmark;
1405 perl_eval_pv(char *p, I32 croak_on_error)
1409 SV* sv = newSVpv(p, 0);
1412 perl_eval_sv(sv, G_SCALAR);
1419 if (croak_on_error && SvTRUE(errsv))
1420 croak(SvPV(errsv, na));
1425 /* Require a module. */
1428 perl_require_pv(char *pv)
1430 SV* sv = sv_newmortal();
1431 sv_setpv(sv, "require '");
1434 perl_eval_sv(sv, G_DISCARD);
1438 magicname(char *sym, char *name, I32 namlen)
1442 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1443 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1447 usage(char *name) /* XXX move this out into a module ? */
1450 /* This message really ought to be max 23 lines.
1451 * Removed -h because the user already knows that opton. Others? */
1453 static char *usage[] = {
1454 "-0[octal] specify record separator (\\0, if no argument)",
1455 "-a autosplit mode with -n or -p (splits $_ into @F)",
1456 "-c check syntax only (runs BEGIN and END blocks)",
1457 "-d[:debugger] run scripts under debugger",
1458 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1459 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1460 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1461 "-i[extension] edit <> files in place (make backup if extension supplied)",
1462 "-Idirectory specify @INC/#include directory (may be used more than once)",
1463 "-l[octal] enable line ending processing, specifies line terminator",
1464 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1465 "-n assume 'while (<>) { ... }' loop around your script",
1466 "-p assume loop like -n but print line also like sed",
1467 "-P run script through C preprocessor before compilation",
1468 "-s enable some switch parsing for switches after script name",
1469 "-S look for the script using PATH environment variable",
1470 "-T turn on tainting checks",
1471 "-u dump core after parsing script",
1472 "-U allow unsafe operations",
1473 "-v print version number and patchlevel of perl",
1474 "-V[:variable] print perl configuration information",
1475 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1476 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1482 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1484 printf("\n %s", *p++);
1487 /* This routine handles any switches that can be given during run */
1490 moreswitches(char *s)
1499 rschar = scan_oct(s, 4, &numlen);
1501 if (rschar & ~((U8)~0))
1503 else if (!rschar && numlen >= 2)
1504 nrs = newSVpv("", 0);
1507 nrs = newSVpv(&ch, 1);
1513 splitstr = savepv(s + 1);
1527 if (*s == ':' || *s == '=') {
1528 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1532 perldb = PERLDB_ALL;
1539 if (isALPHA(s[1])) {
1540 static char debopts[] = "psltocPmfrxuLHXD";
1543 for (s++; *s && (d = strchr(debopts,*s)); s++)
1544 debug |= 1 << (d - debopts);
1548 for (s++; isDIGIT(*s); s++) ;
1550 debug |= 0x80000000;
1552 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1553 for (s++; isALNUM(*s); s++) ;
1563 inplace = savepv(s+1);
1565 for (s = inplace; *s && !isSPACE(*s); s++) ;
1569 case 'I': /* -I handled both here and in parse_perl() */
1572 while (*s && isSPACE(*s))
1576 for (e = s; *e && !isSPACE(*e); e++) ;
1577 p = savepvn(s, e-s);
1583 croak("No space allowed after -I");
1593 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1603 ors = SvPV(nrs, orslen);
1604 ors = savepvn(ors, orslen);
1608 forbid_setid("-M"); /* XXX ? */
1611 forbid_setid("-m"); /* XXX ? */
1616 /* -M-foo == 'no foo' */
1617 if (*s == '-') { use = "no "; ++s; }
1618 sv = newSVpv(use,0);
1620 /* We allow -M'Module qw(Foo Bar)' */
1621 while(isALNUM(*s) || *s==':') ++s;
1623 sv_catpv(sv, start);
1624 if (*(start-1) == 'm') {
1626 croak("Can't use '%c' after -mname", *s);
1627 sv_catpv( sv, " ()");
1630 sv_catpvn(sv, start, s-start);
1631 sv_catpv(sv, " split(/,/,q{");
1636 if (preambleav == NULL)
1637 preambleav = newAV();
1638 av_push(preambleav, sv);
1641 croak("No space allowed after -%c", *(s-1));
1658 croak("Too late for \"-T\" option");
1670 #if defined(SUBVERSION) && SUBVERSION > 0
1671 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1672 PATCHLEVEL, SUBVERSION, ARCHNAME);
1674 printf("\nThis is perl, version %s built for %s",
1675 patchlevel, ARCHNAME);
1677 #if defined(LOCAL_PATCH_COUNT)
1678 if (LOCAL_PATCH_COUNT > 0)
1679 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1680 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1683 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1685 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1688 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1691 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1692 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1695 printf("atariST series port, ++jrb bammi@cadence.com\n");
1698 Perl may be copied only under the terms of either the Artistic License or the\n\
1699 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1707 if (s[1] == '-') /* Additional switches on #! line. */
1715 #ifdef ALTERNATE_SHEBANG
1716 case 'S': /* OS/2 needs -S on "extproc" line. */
1724 croak("Can't emulate -%.1s on #! line",s);
1729 /* compliments of Tom Christiansen */
1731 /* unexec() can be found in the Gnu emacs distribution */
1742 prog = newSVpv(BIN_EXP);
1743 sv_catpv(prog, "/perl");
1744 file = newSVpv(origfilename);
1745 sv_catpv(file, ".perldump");
1747 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1749 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1750 SvPVX(prog), SvPVX(file));
1754 # include <lib$routines.h>
1755 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1757 ABORT(); /* for use with undump */
1763 init_main_stash(void)
1768 /* Note that strtab is a rather special HV. Assumptions are made
1769 about not iterating on it, and not adding tie magic to it.
1770 It is properly deallocated in perl_destruct() */
1772 HvSHAREKEYS_off(strtab); /* mandatory */
1773 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1774 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1776 curstash = defstash = newHV();
1777 curstname = newSVpv("main",4);
1778 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1779 SvREFCNT_dec(GvHV(gv));
1780 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1782 HvNAME(defstash) = savepv("main");
1783 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1785 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1786 errsv = newSVpv("", 0);
1788 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1789 sv_grow(errsv, 240); /* Preallocate - for immediate signals. */
1790 sv_setpvn(errsv, "", 0);
1791 curstash = defstash;
1792 compiling.cop_stash = defstash;
1793 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1794 /* We must init $/ before switches are processed. */
1795 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1798 #ifdef CAN_PROTOTYPE
1800 open_script(char *scriptname, bool dosearch, SV *sv)
1803 open_script(scriptname,dosearch,sv)
1810 char *xfound = Nullch;
1811 char *xfailed = Nullch;
1815 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1816 # define SEARCH_EXTS ".bat", ".cmd", NULL
1817 # define MAX_EXT_LEN 4
1820 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1821 # define MAX_EXT_LEN 4
1824 # define SEARCH_EXTS ".pl", ".com", NULL
1825 # define MAX_EXT_LEN 4
1827 /* additional extensions to try in each dir if scriptname not found */
1829 char *ext[] = { SEARCH_EXTS };
1830 int extidx = 0, i = 0;
1831 char *curext = Nullch;
1833 # define MAX_EXT_LEN 0
1837 * If dosearch is true and if scriptname does not contain path
1838 * delimiters, search the PATH for scriptname.
1840 * If SEARCH_EXTS is also defined, will look for each
1841 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1842 * while searching the PATH.
1844 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1845 * proceeds as follows:
1847 * + look for ./scriptname{,.foo,.bar}
1848 * + search the PATH for scriptname{,.foo,.bar}
1851 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1852 * this will not look in '.' if it's not in the PATH)
1857 int hasdir, idx = 0, deftypes = 1;
1860 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1861 /* The first time through, just add SEARCH_EXTS to whatever we
1862 * already have, so we can check for default file types. */
1864 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1870 if ((strlen(tokenbuf) + strlen(scriptname)
1871 + MAX_EXT_LEN) >= sizeof tokenbuf)
1872 continue; /* don't search dir with too-long name */
1873 strcat(tokenbuf, scriptname);
1877 if (strEQ(scriptname, "-"))
1879 if (dosearch) { /* Look in '.' first. */
1880 char *cur = scriptname;
1882 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1884 if (strEQ(ext[i++],curext)) {
1885 extidx = -1; /* already has an ext */
1890 DEBUG_p(PerlIO_printf(Perl_debug_log,
1891 "Looking for %s\n",cur));
1892 if (Stat(cur,&statbuf) >= 0) {
1900 if (cur == scriptname) {
1901 len = strlen(scriptname);
1902 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1904 cur = strcpy(tokenbuf, scriptname);
1906 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1907 && strcpy(tokenbuf+len, ext[extidx++]));
1912 if (dosearch && !strchr(scriptname, '/')
1914 && !strchr(scriptname, '\\')
1916 && (s = getenv("PATH"))) {
1919 bufend = s + strlen(s);
1920 while (s < bufend) {
1921 #if defined(atarist) || defined(DOSISH)
1926 && *s != ';'; len++, s++) {
1927 if (len < sizeof tokenbuf)
1930 if (len < sizeof tokenbuf)
1931 tokenbuf[len] = '\0';
1932 #else /* ! (atarist || DOSISH) */
1933 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1936 #endif /* ! (atarist || DOSISH) */
1939 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1940 continue; /* don't search dir with too-long name */
1942 #if defined(atarist) || defined(DOSISH)
1943 && tokenbuf[len - 1] != '/'
1944 && tokenbuf[len - 1] != '\\'
1947 tokenbuf[len++] = '/';
1948 if (len == 2 && tokenbuf[0] == '.')
1950 (void)strcpy(tokenbuf + len, scriptname);
1954 len = strlen(tokenbuf);
1955 if (extidx > 0) /* reset after previous loop */
1959 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1960 retval = Stat(tokenbuf,&statbuf);
1962 } while ( retval < 0 /* not there */
1963 && extidx>=0 && ext[extidx] /* try an extension? */
1964 && strcpy(tokenbuf+len, ext[extidx++])
1969 if (S_ISREG(statbuf.st_mode)
1970 && cando(S_IRUSR,TRUE,&statbuf)
1972 && cando(S_IXUSR,TRUE,&statbuf)
1976 xfound = tokenbuf; /* bingo! */
1980 xfailed = savepv(tokenbuf);
1983 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1985 seen_dot = 1; /* Disable message. */
1987 croak("Can't %s %s%s%s",
1988 (xfailed ? "execute" : "find"),
1989 (xfailed ? xfailed : scriptname),
1990 (xfailed ? "" : " on PATH"),
1991 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1994 scriptname = xfound;
1997 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1998 char *s = scriptname + 8;
2007 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2008 curcop->cop_filegv = gv_fetchfile(origfilename);
2009 if (strEQ(origfilename,"-"))
2011 if (fdscript >= 0) {
2012 rsfp = PerlIO_fdopen(fdscript,"r");
2013 #if defined(HAS_FCNTL) && defined(F_SETFD)
2015 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2018 else if (preprocess) {
2019 char *cpp_cfg = CPPSTDIN;
2020 SV *cpp = NEWSV(0,0);
2021 SV *cmd = NEWSV(0,0);
2023 if (strEQ(cpp_cfg, "cppstdin"))
2024 sv_catpvf(cpp, "%s/", BIN_EXP);
2025 sv_catpv(cpp, cpp_cfg);
2028 sv_catpv(sv,PRIVLIB_EXP);
2032 sed %s -e \"/^[^#]/b\" \
2033 -e \"/^#[ ]*include[ ]/b\" \
2034 -e \"/^#[ ]*define[ ]/b\" \
2035 -e \"/^#[ ]*if[ ]/b\" \
2036 -e \"/^#[ ]*ifdef[ ]/b\" \
2037 -e \"/^#[ ]*ifndef[ ]/b\" \
2038 -e \"/^#[ ]*else/b\" \
2039 -e \"/^#[ ]*elif[ ]/b\" \
2040 -e \"/^#[ ]*undef[ ]/b\" \
2041 -e \"/^#[ ]*endif/b\" \
2044 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2047 %s %s -e '/^[^#]/b' \
2048 -e '/^#[ ]*include[ ]/b' \
2049 -e '/^#[ ]*define[ ]/b' \
2050 -e '/^#[ ]*if[ ]/b' \
2051 -e '/^#[ ]*ifdef[ ]/b' \
2052 -e '/^#[ ]*ifndef[ ]/b' \
2053 -e '/^#[ ]*else/b' \
2054 -e '/^#[ ]*elif[ ]/b' \
2055 -e '/^#[ ]*undef[ ]/b' \
2056 -e '/^#[ ]*endif/b' \
2064 (doextract ? "-e '1,/^#/d\n'" : ""),
2066 scriptname, cpp, sv, CPPMINUS);
2068 #ifdef IAMSUID /* actually, this is caught earlier */
2069 if (euid != uid && !euid) { /* if running suidperl */
2071 (void)seteuid(uid); /* musn't stay setuid root */
2074 (void)setreuid((Uid_t)-1, uid);
2076 #ifdef HAS_SETRESUID
2077 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2083 if (geteuid() != uid)
2084 croak("Can't do seteuid!\n");
2086 #endif /* IAMSUID */
2087 rsfp = my_popen(SvPVX(cmd), "r");
2091 else if (!*scriptname) {
2092 forbid_setid("program input from stdin");
2093 rsfp = PerlIO_stdin();
2096 rsfp = PerlIO_open(scriptname,"r");
2097 #if defined(HAS_FCNTL) && defined(F_SETFD)
2099 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2107 #ifndef IAMSUID /* in case script is not readable before setuid */
2108 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2109 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2111 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2112 croak("Can't do setuid\n");
2116 croak("Can't open perl script \"%s\": %s\n",
2117 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2122 validate_suid(char *validarg, char *scriptname)
2126 /* do we need to emulate setuid on scripts? */
2128 /* This code is for those BSD systems that have setuid #! scripts disabled
2129 * in the kernel because of a security problem. Merely defining DOSUID
2130 * in perl will not fix that problem, but if you have disabled setuid
2131 * scripts in the kernel, this will attempt to emulate setuid and setgid
2132 * on scripts that have those now-otherwise-useless bits set. The setuid
2133 * root version must be called suidperl or sperlN.NNN. If regular perl
2134 * discovers that it has opened a setuid script, it calls suidperl with
2135 * the same argv that it had. If suidperl finds that the script it has
2136 * just opened is NOT setuid root, it sets the effective uid back to the
2137 * uid. We don't just make perl setuid root because that loses the
2138 * effective uid we had before invoking perl, if it was different from the
2141 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2142 * be defined in suidperl only. suidperl must be setuid root. The
2143 * Configure script will set this up for you if you want it.
2150 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2151 croak("Can't stat script \"%s\"",origfilename);
2152 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2156 #ifndef HAS_SETREUID
2157 /* On this access check to make sure the directories are readable,
2158 * there is actually a small window that the user could use to make
2159 * filename point to an accessible directory. So there is a faint
2160 * chance that someone could execute a setuid script down in a
2161 * non-accessible directory. I don't know what to do about that.
2162 * But I don't think it's too important. The manual lies when
2163 * it says access() is useful in setuid programs.
2165 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2166 croak("Permission denied");
2168 /* If we can swap euid and uid, then we can determine access rights
2169 * with a simple stat of the file, and then compare device and
2170 * inode to make sure we did stat() on the same file we opened.
2171 * Then we just have to make sure he or she can execute it.
2174 struct stat tmpstatbuf;
2178 setreuid(euid,uid) < 0
2181 setresuid(euid,uid,(Uid_t)-1) < 0
2184 || getuid() != euid || geteuid() != uid)
2185 croak("Can't swap uid and euid"); /* really paranoid */
2186 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2187 croak("Permission denied"); /* testing full pathname here */
2188 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2189 tmpstatbuf.st_ino != statbuf.st_ino) {
2190 (void)PerlIO_close(rsfp);
2191 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2193 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2194 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2195 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2196 (long)statbuf.st_dev, (long)statbuf.st_ino,
2197 SvPVX(GvSV(curcop->cop_filegv)),
2198 (long)statbuf.st_uid, (long)statbuf.st_gid);
2199 (void)my_pclose(rsfp);
2201 croak("Permission denied\n");
2205 setreuid(uid,euid) < 0
2207 # if defined(HAS_SETRESUID)
2208 setresuid(uid,euid,(Uid_t)-1) < 0
2211 || getuid() != uid || geteuid() != euid)
2212 croak("Can't reswap uid and euid");
2213 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2214 croak("Permission denied\n");
2216 #endif /* HAS_SETREUID */
2217 #endif /* IAMSUID */
2219 if (!S_ISREG(statbuf.st_mode))
2220 croak("Permission denied");
2221 if (statbuf.st_mode & S_IWOTH)
2222 croak("Setuid/gid script is writable by world");
2223 doswitches = FALSE; /* -s is insecure in suid */
2225 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2226 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2227 croak("No #! line");
2228 s = SvPV(linestr,na)+2;
2230 while (!isSPACE(*s)) s++;
2231 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2232 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2233 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2234 croak("Not a perl script");
2235 while (*s == ' ' || *s == '\t') s++;
2237 * #! arg must be what we saw above. They can invoke it by
2238 * mentioning suidperl explicitly, but they may not add any strange
2239 * arguments beyond what #! says if they do invoke suidperl that way.
2241 len = strlen(validarg);
2242 if (strEQ(validarg," PHOOEY ") ||
2243 strnNE(s,validarg,len) || !isSPACE(s[len]))
2244 croak("Args must match #! line");
2247 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2248 euid == statbuf.st_uid)
2250 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2251 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2252 #endif /* IAMSUID */
2254 if (euid) { /* oops, we're not the setuid root perl */
2255 (void)PerlIO_close(rsfp);
2258 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2260 croak("Can't do setuid\n");
2263 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2265 (void)setegid(statbuf.st_gid);
2268 (void)setregid((Gid_t)-1,statbuf.st_gid);
2270 #ifdef HAS_SETRESGID
2271 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2273 setgid(statbuf.st_gid);
2277 if (getegid() != statbuf.st_gid)
2278 croak("Can't do setegid!\n");
2280 if (statbuf.st_mode & S_ISUID) {
2281 if (statbuf.st_uid != euid)
2283 (void)seteuid(statbuf.st_uid); /* all that for this */
2286 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2288 #ifdef HAS_SETRESUID
2289 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2291 setuid(statbuf.st_uid);
2295 if (geteuid() != statbuf.st_uid)
2296 croak("Can't do seteuid!\n");
2298 else if (uid) { /* oops, mustn't run as root */
2300 (void)seteuid((Uid_t)uid);
2303 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2305 #ifdef HAS_SETRESUID
2306 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2312 if (geteuid() != uid)
2313 croak("Can't do seteuid!\n");
2316 if (!cando(S_IXUSR,TRUE,&statbuf))
2317 croak("Permission denied\n"); /* they can't do this */
2320 else if (preprocess)
2321 croak("-P not allowed for setuid/setgid script\n");
2322 else if (fdscript >= 0)
2323 croak("fd script not allowed in suidperl\n");
2325 croak("Script is not setuid/setgid in suidperl\n");
2327 /* We absolutely must clear out any saved ids here, so we */
2328 /* exec the real perl, substituting fd script for scriptname. */
2329 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2330 PerlIO_rewind(rsfp);
2331 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2332 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2333 if (!origargv[which])
2334 croak("Permission denied");
2335 origargv[which] = savepv(form("/dev/fd/%d/%s",
2336 PerlIO_fileno(rsfp), origargv[which]));
2337 #if defined(HAS_FCNTL) && defined(F_SETFD)
2338 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2340 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2341 croak("Can't do setuid\n");
2342 #endif /* IAMSUID */
2344 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2345 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2347 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2348 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2350 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2353 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2354 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2355 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2356 /* not set-id, must be wrapped */
2362 find_beginning(void)
2364 register char *s, *s2;
2366 /* skip forward in input to the real script? */
2370 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2371 croak("No Perl script found in input\n");
2372 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2373 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2375 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2377 while (*s == ' ' || *s == '\t') s++;
2379 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2380 if (strnEQ(s2-4,"perl",4))
2382 while (s = moreswitches(s)) ;
2384 if (cddir && chdir(cddir) < 0)
2385 croak("Can't chdir to %s",cddir);
2393 uid = (int)getuid();
2394 euid = (int)geteuid();
2395 gid = (int)getgid();
2396 egid = (int)getegid();
2401 tainting |= (uid && (euid != uid || egid != gid));
2405 forbid_setid(char *s)
2408 croak("No %s allowed while running setuid", s);
2410 croak("No %s allowed while running setgid", s);
2417 curstash = debstash;
2418 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2420 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2421 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2422 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2423 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2424 sv_setiv(DBsingle, 0);
2425 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2426 sv_setiv(DBtrace, 0);
2427 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2428 sv_setiv(DBsignal, 0);
2429 curstash = defstash;
2433 init_stacks(ARGSproto)
2436 mainstack = curstack; /* remember in case we switch stacks */
2437 AvREAL_off(curstack); /* not a real array */
2438 av_extend(curstack,127);
2440 stack_base = AvARRAY(curstack);
2441 stack_sp = stack_base;
2442 stack_max = stack_base + 127;
2444 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2445 New(50,cxstack,cxstack_max + 1,CONTEXT);
2448 New(50,tmps_stack,128,SV*);
2454 * The following stacks almost certainly should be per-interpreter,
2455 * but for now they're not. XXX
2459 markstack_ptr = markstack;
2461 New(54,markstack,64,I32);
2462 markstack_ptr = markstack;
2463 markstack_max = markstack + 64;
2469 New(54,scopestack,32,I32);
2471 scopestack_max = 32;
2477 New(54,savestack,128,ANY);
2479 savestack_max = 128;
2485 New(54,retstack,16,OP*);
2496 Safefree(tmps_stack);
2503 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2512 subname = newSVpv("main",4);
2516 init_predump_symbols(void)
2523 sv_setpvn(*av_fetch(thr->specific,find_thread_magical("\""),TRUE), " ", 1);
2525 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2526 #endif /* USE_THREADS */
2528 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2529 GvMULTI_on(stdingv);
2530 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2531 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2533 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2535 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2537 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2539 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2541 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2543 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2544 GvMULTI_on(othergv);
2545 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2546 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2548 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2550 statname = NEWSV(66,0); /* last filename we did stat on */
2553 osname = savepv(OSNAME);
2557 init_postdump_symbols(register int argc, register char **argv, register char **env)
2564 argc--,argv++; /* skip name of script */
2566 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2569 if (argv[0][1] == '-') {
2573 if (s = strchr(argv[0], '=')) {
2575 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2578 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2581 toptarget = NEWSV(0,0);
2582 sv_upgrade(toptarget, SVt_PVFM);
2583 sv_setpvn(toptarget, "", 0);
2584 bodytarget = NEWSV(0,0);
2585 sv_upgrade(bodytarget, SVt_PVFM);
2586 sv_setpvn(bodytarget, "", 0);
2587 formtarget = bodytarget;
2590 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2591 sv_setpv(GvSV(tmpgv),origfilename);
2592 magicname("0", "0", 1);
2594 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2595 sv_setpv(GvSV(tmpgv),origargv[0]);
2596 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2598 (void)gv_AVadd(argvgv);
2599 av_clear(GvAVn(argvgv));
2600 for (; argc > 0; argc--,argv++) {
2601 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2604 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2608 hv_magic(hv, envgv, 'E');
2609 #ifndef VMS /* VMS doesn't have environ array */
2610 /* Note that if the supplied env parameter is actually a copy
2611 of the global environ then it may now point to free'd memory
2612 if the environment has been modified since. To avoid this
2613 problem we treat env==NULL as meaning 'use the default'
2618 environ[0] = Nullch;
2619 for (; *env; env++) {
2620 if (!(s = strchr(*env,'=')))
2626 sv = newSVpv(s--,0);
2627 (void)hv_store(hv, *env, s - *env, sv, 0);
2629 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2630 /* Sins of the RTL. See note in my_setenv(). */
2631 (void)putenv(savepv(*env));
2635 #ifdef DYNAMIC_ENV_FETCH
2636 HvNAME(hv) = savepv(ENV_HV_NAME);
2640 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2641 sv_setiv(GvSV(tmpgv), (IV)getpid());
2650 s = getenv("PERL5LIB");
2654 incpush(getenv("PERLLIB"), FALSE);
2656 /* Treat PERL5?LIB as a possible search list logical name -- the
2657 * "natural" VMS idiom for a Unix path string. We allow each
2658 * element to be a set of |-separated directories for compatibility.
2662 if (my_trnlnm("PERL5LIB",buf,0))
2663 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2665 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2669 /* Use the ~-expanded versions of APPLLIB (undocumented),
2670 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2673 incpush(APPLLIB_EXP, FALSE);
2677 incpush(ARCHLIB_EXP, FALSE);
2680 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2682 incpush(PRIVLIB_EXP, FALSE);
2685 incpush(SITEARCH_EXP, FALSE);
2688 incpush(SITELIB_EXP, FALSE);
2690 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2691 incpush(OLDARCHLIB_EXP, FALSE);
2695 incpush(".", FALSE);
2699 # define PERLLIB_SEP ';'
2702 # define PERLLIB_SEP '|'
2704 # define PERLLIB_SEP ':'
2707 #ifndef PERLLIB_MANGLE
2708 # define PERLLIB_MANGLE(s,n) (s)
2712 incpush(char *p, int addsubdirs)
2714 SV *subdir = Nullsv;
2715 static char *archpat_auto;
2722 if (!archpat_auto) {
2723 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2724 + sizeof("//auto"));
2725 New(55, archpat_auto, len, char);
2726 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2728 for (len = sizeof(ARCHNAME) + 2;
2729 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2730 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2735 /* Break at all separators */
2737 SV *libdir = newSV(0);
2740 /* skip any consecutive separators */
2741 while ( *p == PERLLIB_SEP ) {
2742 /* Uncomment the next line for PATH semantics */
2743 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2747 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2748 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2753 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2754 p = Nullch; /* break out */
2758 * BEFORE pushing libdir onto @INC we may first push version- and
2759 * archname-specific sub-directories.
2762 struct stat tmpstatbuf;
2767 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2769 while (unix[len-1] == '/') len--; /* Cosmetic */
2770 sv_usepvn(libdir,unix,len);
2773 PerlIO_printf(PerlIO_stderr(),
2774 "Failed to unixify @INC element \"%s\"\n",
2777 /* .../archname/version if -d .../archname/version/auto */
2778 sv_setsv(subdir, libdir);
2779 sv_catpv(subdir, archpat_auto);
2780 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2781 S_ISDIR(tmpstatbuf.st_mode))
2782 av_push(GvAVn(incgv),
2783 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2785 /* .../archname if -d .../archname/auto */
2786 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2787 strlen(patchlevel) + 1, "", 0);
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"));
2794 /* finally push this lib directory on the end of @INC */
2795 av_push(GvAVn(incgv), libdir);
2798 SvREFCNT_dec(subdir);
2802 call_list(I32 oldscope, AV *list)
2805 line_t oldline = curcop->cop_line;
2810 while (AvFILL(list) >= 0) {
2811 CV *cv = (CV*)av_shift(list);
2818 SV* atsv = sv_mortalcopy(errsv);
2820 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2821 (void)SvPV(atsv, len);
2824 curcop = &compiling;
2825 curcop->cop_line = oldline;
2826 if (list == beginav)
2827 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2829 sv_catpv(atsv, "END failed--cleanup aborted");
2830 while (scopestack_ix > oldscope)
2832 croak("%s", SvPVX(atsv));
2840 /* my_exit() was called */
2841 while (scopestack_ix > oldscope)
2844 curstash = defstash;
2846 call_list(oldscope, endav);
2848 curcop = &compiling;
2849 curcop->cop_line = oldline;
2851 if (list == beginav)
2852 croak("BEGIN failed--compilation aborted");
2854 croak("END failed--cleanup aborted");
2860 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2865 curcop = &compiling;
2866 curcop->cop_line = oldline;
2879 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2880 thr, (unsigned long) status));
2881 #endif /* USE_THREADS */
2890 STATUS_NATIVE_SET(status);
2897 my_failure_exit(void)
2900 if (vaxc$errno & 1) {
2901 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2902 STATUS_NATIVE_SET(44);
2905 if (!vaxc$errno && errno) /* unlikely */
2906 STATUS_NATIVE_SET(44);
2908 STATUS_NATIVE_SET(vaxc$errno);
2912 STATUS_POSIX_SET(errno);
2913 else if (STATUS_POSIX == 0)
2914 STATUS_POSIX_SET(255);
2923 register CONTEXT *cx;
2932 (void)UNLINK(e_tmpname);
2933 Safefree(e_tmpname);
2937 if (cxstack_ix >= 0) {