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)? */
132 if (pthread_key_create(&thr_key, 0))
133 croak("panic: pthread_key_create");
135 MUTEX_INIT(&malloc_mutex);
136 MUTEX_INIT(&sv_mutex);
138 * Safe to use basic SV functions from now on (though
139 * not things like mortals or tainting yet).
141 MUTEX_INIT(&eval_mutex);
142 COND_INIT(&eval_cond);
143 MUTEX_INIT(&threads_mutex);
144 COND_INIT(&nthreads_cond);
146 thr = init_main_thread();
147 #endif /* USE_THREADS */
149 linestr = NEWSV(65,80);
150 sv_upgrade(linestr,SVt_PVIV);
152 if (!SvREADONLY(&sv_undef)) {
153 SvREADONLY_on(&sv_undef);
157 SvREADONLY_on(&sv_no);
159 sv_setpv(&sv_yes,Yes);
161 SvREADONLY_on(&sv_yes);
164 nrs = newSVpv("\n", 1);
165 rs = SvREFCNT_inc(nrs);
167 sighandlerp = sighandler;
172 * There is no way we can refer to them from Perl so close them to save
173 * space. The other alternative would be to provide STDAUX and STDPRN
176 (void)fclose(stdaux);
177 (void)fclose(stdprn);
183 perl_destruct_level = 1;
185 if(perl_destruct_level > 0)
190 lex_state = LEX_NOTPARSING;
192 start_env.je_prev = NULL;
193 start_env.je_ret = -1;
194 start_env.je_mustcatch = TRUE;
195 top_env = &start_env;
198 SET_NUMERIC_STANDARD();
199 #if defined(SUBVERSION) && SUBVERSION > 0
200 sprintf(patchlevel, "%7.5f", (double) 5
201 + ((double) PATCHLEVEL / (double) 1000)
202 + ((double) SUBVERSION / (double) 100000));
204 sprintf(patchlevel, "%5.3f", (double) 5 +
205 ((double) PATCHLEVEL / (double) 1000));
208 #if defined(LOCAL_PATCH_COUNT)
209 localpatches = local_patches; /* For possible -v */
212 PerlIO_init(); /* Hook to IO system */
214 fdpid = newAV(); /* for remembering popen pids by fd */
218 New(51,debname,128,char);
219 New(52,debdelim,128,char);
226 perl_destruct(register PerlInterpreter *sv_interp)
229 int destruct_level; /* 0=none, 1=full, 2=full with checks */
234 #endif /* USE_THREADS */
236 if (!(curinterp = sv_interp))
241 /* Pass 1 on any remaining threads: detach joinables, join zombies */
243 MUTEX_LOCK(&threads_mutex);
244 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
245 "perl_destruct: waiting for %d threads...\n",
247 for (t = thr->next; t != thr; t = t->next) {
248 MUTEX_LOCK(&t->mutex);
249 switch (ThrSTATE(t)) {
252 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
253 "perl_destruct: joining zombie %p\n", t));
254 ThrSETSTATE(t, THRf_DEAD);
255 MUTEX_UNLOCK(&t->mutex);
258 * The SvREFCNT_dec below may take a long time (e.g. av
259 * may contain an object scalar whose destructor gets
260 * called) so we have to unlock threads_mutex and start
263 MUTEX_UNLOCK(&threads_mutex);
265 SvREFCNT_dec((SV*)av);
266 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
267 "perl_destruct: joined zombie %p OK\n", t));
269 case THRf_R_JOINABLE:
270 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
271 "perl_destruct: detaching thread %p\n", t));
272 ThrSETSTATE(t, THRf_R_DETACHED);
274 * We unlock threads_mutex and t->mutex in the opposite order
275 * from which we locked them just so that DETACH won't
276 * deadlock if it panics. It's only a breach of good style
277 * not a bug since they are unlocks not locks.
279 MUTEX_UNLOCK(&threads_mutex);
281 MUTEX_UNLOCK(&t->mutex);
284 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
285 "perl_destruct: ignoring %p (state %u)\n",
287 MUTEX_UNLOCK(&t->mutex);
288 /* fall through and out */
291 /* We leave the above "Pass 1" loop with threads_mutex still locked */
293 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
296 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
297 "perl_destruct: final wait for %d threads\n",
299 COND_WAIT(&nthreads_cond, &threads_mutex);
301 /* At this point, we're the last thread */
302 MUTEX_UNLOCK(&threads_mutex);
303 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
304 MUTEX_DESTROY(&threads_mutex);
305 COND_DESTROY(&nthreads_cond);
306 #endif /* !defined(FAKE_THREADS) */
307 #endif /* USE_THREADS */
309 destruct_level = perl_destruct_level;
313 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
315 if (destruct_level < i)
324 /* We must account for everything. */
326 /* Destroy the main CV and syntax tree */
328 curpad = AvARRAY(comppad);
333 SvREFCNT_dec(main_cv);
338 * Try to destruct global references. We do this first so that the
339 * destructors and destructees still exist. Some sv's might remain.
340 * Non-referenced objects are on their own.
347 /* unhook hooks which will soon be, or use, destroyed data */
348 SvREFCNT_dec(warnhook);
350 SvREFCNT_dec(diehook);
352 SvREFCNT_dec(parsehook);
355 if (destruct_level == 0){
357 DEBUG_P(debprofdump());
359 /* The exit() function will do everything that needs doing. */
363 /* loosen bonds of global variables */
366 (void)PerlIO_close(rsfp);
370 /* Filters for program text */
371 SvREFCNT_dec(rsfp_filters);
372 rsfp_filters = Nullav;
384 sawampersand = FALSE; /* must save all match strings */
385 sawstudy = FALSE; /* do fbm_instr on all strings */
400 /* magical thingies */
402 Safefree(ofs); /* $, */
405 Safefree(ors); /* $\ */
408 SvREFCNT_dec(nrs); /* $\ helper */
411 multiline = 0; /* $* */
413 SvREFCNT_dec(statname);
417 /* defgv, aka *_ should be taken care of elsewhere */
419 #if 0 /* just about all regexp stuff, seems to be ok */
421 /* shortcuts to regexp stuff */
426 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
428 regprecomp = NULL; /* uncompiled string. */
429 regparse = NULL; /* Input-scan pointer. */
430 regxend = NULL; /* End of input for compile */
431 regnpar = 0; /* () count. */
432 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
433 regsize = 0; /* Code size. */
434 regnaughty = 0; /* How bad is this pattern? */
435 regsawback = 0; /* Did we see \1, ...? */
437 reginput = NULL; /* String-input pointer. */
438 regbol = NULL; /* Beginning of input, for ^ check. */
439 regeol = NULL; /* End of input, for $ check. */
440 regstartp = (char **)NULL; /* Pointer to startp array. */
441 regendp = (char **)NULL; /* Ditto for endp. */
442 reglastparen = 0; /* Similarly for lastparen. */
443 regtill = NULL; /* How far we are required to go. */
444 regflags = 0; /* are we folding, multilining? */
445 regprev = (char)NULL; /* char before regbol, \n if none */
449 /* clean up after study() */
450 SvREFCNT_dec(lastscream);
452 Safefree(screamfirst);
454 Safefree(screamnext);
457 /* startup and shutdown function lists */
458 SvREFCNT_dec(beginav);
460 SvREFCNT_dec(initav);
465 /* temp stack during pp_sort() */
466 SvREFCNT_dec(sortstack);
469 /* shortcuts just get cleared */
480 /* reset so print() ends up where we expect */
483 /* Prepare to destruct main symbol table. */
490 if (destruct_level >= 2) {
491 if (scopestack_ix != 0)
492 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
493 (long)scopestack_ix);
494 if (savestack_ix != 0)
495 warn("Unbalanced saves: %ld more saves than restores\n",
497 if (tmps_floor != -1)
498 warn("Unbalanced tmps: %ld more allocs than frees\n",
499 (long)tmps_floor + 1);
500 if (cxstack_ix != -1)
501 warn("Unbalanced context: %ld more PUSHes than POPs\n",
502 (long)cxstack_ix + 1);
505 /* Now absolutely destruct everything, somehow or other, loops or no. */
507 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
508 while (sv_count != 0 && sv_count != last_sv_count) {
509 last_sv_count = sv_count;
512 SvFLAGS(strtab) &= ~SVTYPEMASK;
513 SvFLAGS(strtab) |= SVt_PVHV;
515 /* Destruct the global string table. */
517 /* Yell and reset the HeVAL() slots that are still holding refcounts,
518 * so that sv_free() won't fail on them.
527 array = HvARRAY(strtab);
531 warn("Unbalanced string table refcount: (%d) for \"%s\"",
532 HeVAL(hent) - Nullsv, HeKEY(hent));
533 HeVAL(hent) = Nullsv;
543 SvREFCNT_dec(strtab);
546 warn("Scalars leaked: %ld\n", (long)sv_count);
550 /* No SVs have survived, need to clean out */
554 Safefree(origfilename);
556 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
558 DEBUG_P(debprofdump());
560 MUTEX_DESTROY(&sv_mutex);
561 MUTEX_DESTROY(&malloc_mutex);
562 MUTEX_DESTROY(&eval_mutex);
563 COND_DESTROY(&eval_cond);
565 /* As the penultimate thing, free the non-arena SV for thrsv */
566 Safefree(SvPVX(thrsv));
567 Safefree(SvANY(thrsv));
570 #endif /* USE_THREADS */
572 /* As the absolutely last thing, free the non-arena SV for mess() */
575 /* we know that type >= SVt_PV */
577 Safefree(SvPVX(mess_sv));
578 Safefree(SvANY(mess_sv));
585 perl_free(PerlInterpreter *sv_interp)
587 if (!(curinterp = sv_interp))
593 perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
598 char *scriptname = NULL;
599 VOL bool dosearch = FALSE;
606 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
609 croak("suidperl is no longer needed since the kernel can now execute\n\
610 setuid perl scripts securely.\n");
614 if (!(curinterp = sv_interp))
617 #if defined(NeXT) && defined(__DYNAMIC__)
618 _dyld_lookup_and_bind
619 ("__environ", (unsigned long *) &environ_pointer, NULL);
624 #ifndef VMS /* VMS doesn't have environ array */
625 origenviron = environ;
631 /* Come here if running an undumped a.out. */
633 origfilename = savepv(argv[0]);
635 cxstack_ix = -1; /* start label stack again */
637 init_postdump_symbols(argc,argv,env);
642 curpad = AvARRAY(comppad);
647 SvREFCNT_dec(main_cv);
651 oldscope = scopestack_ix;
659 /* my_exit() was called */
660 while (scopestack_ix > oldscope)
665 call_list(oldscope, endav);
667 return STATUS_NATIVE_EXPORT;
670 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
674 sv_setpvn(linestr,"",0);
675 sv = newSVpv("",0); /* first used for -I flags */
679 for (argc--,argv++; argc > 0; argc--,argv++) {
680 if (argv[0][0] != '-' || !argv[0][1])
684 validarg = " PHOOEY ";
709 if (s = moreswitches(s))
719 if (euid != uid || egid != gid)
720 croak("No -e allowed in setuid scripts");
722 e_tmpname = savepv(TMPPATH);
723 (void)mktemp(e_tmpname);
725 croak("Can't mktemp()");
726 e_fp = PerlIO_open(e_tmpname,"w");
728 croak("Cannot open temporary file");
733 PerlIO_puts(e_fp,argv[1]);
737 croak("No code specified for -e");
738 (void)PerlIO_putc(e_fp,'\n');
740 case 'I': /* -I handled both here and in moreswitches() */
742 if (!*++s && (s=argv[1]) != Nullch) {
745 while (s && isSPACE(*s))
749 for (e = s; *e && !isSPACE(*e); e++) ;
756 } /* XXX else croak? */
770 preambleav = newAV();
771 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
773 Sv = newSVpv("print myconfig();",0);
775 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
777 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
779 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
780 sv_catpv(Sv,"\" Compile-time options:");
782 sv_catpv(Sv," DEBUGGING");
785 sv_catpv(Sv," NO_EMBED");
788 sv_catpv(Sv," MULTIPLICITY");
790 sv_catpv(Sv,"\\n\",");
792 #if defined(LOCAL_PATCH_COUNT)
793 if (LOCAL_PATCH_COUNT > 0) {
795 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
796 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
798 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
802 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
805 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
807 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
812 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
813 print \" \\%ENV:\\n @env\\n\" if @env; \
814 print \" \\@INC:\\n @INC\\n\";");
817 Sv = newSVpv("config_vars(qw(",0);
822 av_push(preambleav, Sv);
823 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
834 if (!*++s || isSPACE(*s)) {
838 /* catch use of gnu style long options */
839 if (strEQ(s, "version")) {
843 if (strEQ(s, "help")) {
850 croak("Unrecognized switch: -%s (-h will show valid options)",s);
855 if (!tainting && (s = getenv("PERL5OPT"))) {
866 if (!strchr("DIMUdmw", *s))
867 croak("Illegal switch in PERL5OPT: -%c", *s);
873 scriptname = argv[0];
875 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
877 warn("Did you forget to compile with -DMULTIPLICITY?");
879 croak("Can't write to temp file for -e: %s", Strerror(errno));
883 scriptname = e_tmpname;
885 else if (scriptname == Nullch) {
887 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
895 open_script(scriptname,dosearch,sv);
897 validate_suid(validarg, scriptname);
902 main_cv = compcv = (CV*)NEWSV(1104,0);
903 sv_upgrade((SV *)compcv, SVt_PVCV);
907 av_push(comppad, Nullsv);
908 curpad = AvARRAY(comppad);
909 comppad_name = newAV();
910 comppad_name_fill = 0;
911 min_intro_pending = 0;
914 av_store(comppad_name, 0, newSVpv("@_", 2));
915 curpad[0] = (SV*)newAV();
916 SvPADMY_on(curpad[0]); /* XXX Needed? */
918 New(666, CvMUTEXP(compcv), 1, perl_mutex);
919 MUTEX_INIT(CvMUTEXP(compcv));
920 #endif /* USE_THREADS */
922 comppadlist = newAV();
923 AvREAL_off(comppadlist);
924 av_store(comppadlist, 0, (SV*)comppad_name);
925 av_store(comppadlist, 1, (SV*)comppad);
926 CvPADLIST(compcv) = comppadlist;
928 boot_core_UNIVERSAL();
930 (*xsinit)(); /* in case linked C routines want magical variables */
931 #if defined(VMS) || defined(WIN32)
935 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
936 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
939 init_predump_symbols();
941 init_postdump_symbols(argc,argv,env);
945 /* now parse the script */
948 if (yyparse() || error_count) {
950 croak("%s had compilation errors.\n", origfilename);
952 croak("Execution of %s aborted due to compilation errors.\n",
956 curcop->cop_line = 0;
960 (void)UNLINK(e_tmpname);
965 /* now that script is parsed, we can modify record separator */
967 rs = SvREFCNT_inc(nrs);
969 sv_setsv(*av_fetch(thr->magicals, find_thread_magical("/"), FALSE), rs);
971 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
972 #endif /* USE_THREADS */
983 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
984 dump_mstats("after compilation:");
994 perl_run(PerlInterpreter *sv_interp)
1001 if (!(curinterp = sv_interp))
1004 oldscope = scopestack_ix;
1009 cxstack_ix = -1; /* start context stack again */
1012 /* my_exit() was called */
1013 while (scopestack_ix > oldscope)
1016 curstash = defstash;
1018 call_list(oldscope, endav);
1020 if (getenv("PERL_DEBUG_MSTATS"))
1021 dump_mstats("after execution: ");
1024 return STATUS_NATIVE_EXPORT;
1027 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1032 if (curstack != mainstack) {
1034 SWITCHSTACK(curstack, mainstack);
1039 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1040 sawampersand ? "Enabling" : "Omitting"));
1043 DEBUG_x(dump_all());
1044 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1046 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1047 (unsigned long) thr));
1048 #endif /* USE_THREADS */
1051 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1054 if (PERLDB_SINGLE && DBsingle)
1055 sv_setiv(DBsingle, 1);
1057 call_list(oldscope, initav);
1067 else if (main_start) {
1068 CvDEPTH(main_cv) = 1;
1079 perl_get_sv(char *name, I32 create)
1081 GV* gv = gv_fetchpv(name, create, SVt_PV);
1088 perl_get_av(char *name, I32 create)
1090 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1099 perl_get_hv(char *name, I32 create)
1101 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1110 perl_get_cv(char *name, I32 create)
1112 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1113 if (create && !GvCVu(gv))
1114 return newSUB(start_subparse(FALSE, 0),
1115 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1123 /* Be sure to refetch the stack pointer after calling these routines. */
1126 perl_call_argv(char *subname, I32 flags, register char **argv)
1128 /* See G_* flags in cop.h */
1129 /* null terminated arg list */
1136 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1141 return perl_call_pv(subname, flags);
1145 perl_call_pv(char *subname, I32 flags)
1146 /* name of the subroutine */
1147 /* See G_* flags in cop.h */
1149 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1153 perl_call_method(char *methname, I32 flags)
1154 /* name of the subroutine */
1155 /* See G_* flags in cop.h */
1161 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1164 return perl_call_sv(*stack_sp--, flags);
1167 /* May be called with any of a CV, a GV, or an SV containing the name. */
1169 perl_call_sv(SV *sv, I32 flags)
1171 /* See G_* flags in cop.h */
1174 LOGOP myop; /* fake syntax tree node */
1180 bool oldcatch = CATCH_GET;
1185 if (flags & G_DISCARD) {
1190 Zero(&myop, 1, LOGOP);
1191 myop.op_next = Nullop;
1192 if (!(flags & G_NOARGS))
1193 myop.op_flags |= OPf_STACKED;
1194 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1195 (flags & G_ARRAY) ? OPf_WANT_LIST :
1200 EXTEND(stack_sp, 1);
1203 oldscope = scopestack_ix;
1205 if (PERLDB_SUB && curstash != debstash
1206 /* Handle first BEGIN of -d. */
1207 && (DBcv || (DBcv = GvCV(DBsub)))
1208 /* Try harder, since this may have been a sighandler, thus
1209 * curstash may be meaningless. */
1210 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1211 op->op_private |= OPpENTERSUB_DB;
1213 if (flags & G_EVAL) {
1214 cLOGOP->op_other = op;
1216 /* we're trying to emulate pp_entertry() here */
1218 register CONTEXT *cx;
1219 I32 gimme = GIMME_V;
1224 push_return(op->op_next);
1225 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1227 eval_root = op; /* Only needed so that goto works right. */
1230 if (flags & G_KEEPERR)
1245 /* my_exit() was called */
1246 curstash = defstash;
1250 croak("Callback called exit");
1259 stack_sp = stack_base + oldmark;
1260 if (flags & G_ARRAY)
1264 *++stack_sp = &sv_undef;
1272 if (op == (OP*)&myop)
1273 op = pp_entersub(ARGS);
1276 retval = stack_sp - (stack_base + oldmark);
1277 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1281 if (flags & G_EVAL) {
1282 if (scopestack_ix > oldscope) {
1286 register CONTEXT *cx;
1298 CATCH_SET(oldcatch);
1300 if (flags & G_DISCARD) {
1301 stack_sp = stack_base + oldmark;
1310 /* Eval a string. The G_EVAL flag is always assumed. */
1313 perl_eval_sv(SV *sv, I32 flags)
1315 /* See G_* flags in cop.h */
1318 UNOP myop; /* fake syntax tree node */
1320 I32 oldmark = sp - stack_base;
1327 if (flags & G_DISCARD) {
1335 EXTEND(stack_sp, 1);
1337 oldscope = scopestack_ix;
1339 if (!(flags & G_NOARGS))
1340 myop.op_flags = OPf_STACKED;
1341 myop.op_next = Nullop;
1342 myop.op_type = OP_ENTEREVAL;
1343 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1344 (flags & G_ARRAY) ? OPf_WANT_LIST :
1346 if (flags & G_KEEPERR)
1347 myop.op_flags |= OPf_SPECIAL;
1357 /* my_exit() was called */
1358 curstash = defstash;
1362 croak("Callback called exit");
1371 stack_sp = stack_base + oldmark;
1372 if (flags & G_ARRAY)
1376 *++stack_sp = &sv_undef;
1381 if (op == (OP*)&myop)
1382 op = pp_entereval(ARGS);
1385 retval = stack_sp - (stack_base + oldmark);
1386 if (!(flags & G_KEEPERR))
1391 if (flags & G_DISCARD) {
1392 stack_sp = stack_base + oldmark;
1402 perl_eval_pv(char *p, I32 croak_on_error)
1405 SV* sv = newSVpv(p, 0);
1408 perl_eval_sv(sv, G_SCALAR);
1415 if (croak_on_error && SvTRUE(errsv))
1416 croak(SvPV(errsv, na));
1421 /* Require a module. */
1424 perl_require_pv(char *pv)
1426 SV* sv = sv_newmortal();
1427 sv_setpv(sv, "require '");
1430 perl_eval_sv(sv, G_DISCARD);
1434 magicname(char *sym, char *name, I32 namlen)
1438 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1439 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1443 usage(char *name) /* XXX move this out into a module ? */
1446 /* This message really ought to be max 23 lines.
1447 * Removed -h because the user already knows that opton. Others? */
1449 static char *usage[] = {
1450 "-0[octal] specify record separator (\\0, if no argument)",
1451 "-a autosplit mode with -n or -p (splits $_ into @F)",
1452 "-c check syntax only (runs BEGIN and END blocks)",
1453 "-d[:debugger] run scripts under debugger",
1454 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1455 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1456 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1457 "-i[extension] edit <> files in place (make backup if extension supplied)",
1458 "-Idirectory specify @INC/#include directory (may be used more than once)",
1459 "-l[octal] enable line ending processing, specifies line terminator",
1460 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1461 "-n assume 'while (<>) { ... }' loop around your script",
1462 "-p assume loop like -n but print line also like sed",
1463 "-P run script through C preprocessor before compilation",
1464 "-s enable some switch parsing for switches after script name",
1465 "-S look for the script using PATH environment variable",
1466 "-T turn on tainting checks",
1467 "-u dump core after parsing script",
1468 "-U allow unsafe operations",
1469 "-v print version number and patchlevel of perl",
1470 "-V[:variable] print perl configuration information",
1471 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1472 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1478 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1480 printf("\n %s", *p++);
1483 /* This routine handles any switches that can be given during run */
1486 moreswitches(char *s)
1495 rschar = scan_oct(s, 4, &numlen);
1497 if (rschar & ~((U8)~0))
1499 else if (!rschar && numlen >= 2)
1500 nrs = newSVpv("", 0);
1503 nrs = newSVpv(&ch, 1);
1509 splitstr = savepv(s + 1);
1523 if (*s == ':' || *s == '=') {
1524 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1528 perldb = PERLDB_ALL;
1535 if (isALPHA(s[1])) {
1536 static char debopts[] = "psltocPmfrxuLHXD";
1539 for (s++; *s && (d = strchr(debopts,*s)); s++)
1540 debug |= 1 << (d - debopts);
1544 for (s++; isDIGIT(*s); s++) ;
1546 debug |= 0x80000000;
1548 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1549 for (s++; isALNUM(*s); s++) ;
1559 inplace = savepv(s+1);
1561 for (s = inplace; *s && !isSPACE(*s); s++) ;
1565 case 'I': /* -I handled both here and in parse_perl() */
1568 while (*s && isSPACE(*s))
1572 for (e = s; *e && !isSPACE(*e); e++) ;
1573 p = savepvn(s, e-s);
1579 croak("No space allowed after -I");
1589 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1599 ors = SvPV(nrs, orslen);
1600 ors = savepvn(ors, orslen);
1604 forbid_setid("-M"); /* XXX ? */
1607 forbid_setid("-m"); /* XXX ? */
1612 /* -M-foo == 'no foo' */
1613 if (*s == '-') { use = "no "; ++s; }
1614 sv = newSVpv(use,0);
1616 /* We allow -M'Module qw(Foo Bar)' */
1617 while(isALNUM(*s) || *s==':') ++s;
1619 sv_catpv(sv, start);
1620 if (*(start-1) == 'm') {
1622 croak("Can't use '%c' after -mname", *s);
1623 sv_catpv( sv, " ()");
1626 sv_catpvn(sv, start, s-start);
1627 sv_catpv(sv, " split(/,/,q{");
1632 if (preambleav == NULL)
1633 preambleav = newAV();
1634 av_push(preambleav, sv);
1637 croak("No space allowed after -%c", *(s-1));
1654 croak("Too late for \"-T\" option");
1666 #if defined(SUBVERSION) && SUBVERSION > 0
1667 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1668 PATCHLEVEL, SUBVERSION, ARCHNAME);
1670 printf("\nThis is perl, version %s built for %s",
1671 patchlevel, ARCHNAME);
1673 #if defined(LOCAL_PATCH_COUNT)
1674 if (LOCAL_PATCH_COUNT > 0)
1675 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1676 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1679 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1681 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1684 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1687 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1688 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1691 printf("atariST series port, ++jrb bammi@cadence.com\n");
1694 Perl may be copied only under the terms of either the Artistic License or the\n\
1695 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1703 if (s[1] == '-') /* Additional switches on #! line. */
1711 #ifdef ALTERNATE_SHEBANG
1712 case 'S': /* OS/2 needs -S on "extproc" line. */
1720 croak("Can't emulate -%.1s on #! line",s);
1725 /* compliments of Tom Christiansen */
1727 /* unexec() can be found in the Gnu emacs distribution */
1738 prog = newSVpv(BIN_EXP);
1739 sv_catpv(prog, "/perl");
1740 file = newSVpv(origfilename);
1741 sv_catpv(file, ".perldump");
1743 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1745 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1746 SvPVX(prog), SvPVX(file));
1750 # include <lib$routines.h>
1751 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1753 ABORT(); /* for use with undump */
1759 init_main_stash(void)
1764 /* Note that strtab is a rather special HV. Assumptions are made
1765 about not iterating on it, and not adding tie magic to it.
1766 It is properly deallocated in perl_destruct() */
1768 HvSHAREKEYS_off(strtab); /* mandatory */
1769 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1770 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1772 curstash = defstash = newHV();
1773 curstname = newSVpv("main",4);
1774 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1775 SvREFCNT_dec(GvHV(gv));
1776 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1778 HvNAME(defstash) = savepv("main");
1779 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1781 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1782 errsv = newSVpv("", 0);
1784 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1785 sv_grow(errsv, 240); /* Preallocate - for immediate signals. */
1786 sv_setpvn(errsv, "", 0);
1787 curstash = defstash;
1788 compiling.cop_stash = defstash;
1789 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1790 /* We must init $/ before switches are processed. */
1791 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1794 #ifdef CAN_PROTOTYPE
1796 open_script(char *scriptname, bool dosearch, SV *sv)
1799 open_script(scriptname,dosearch,sv)
1806 char *xfound = Nullch;
1807 char *xfailed = Nullch;
1811 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1812 # define SEARCH_EXTS ".bat", ".cmd", NULL
1813 # define MAX_EXT_LEN 4
1816 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1817 # define MAX_EXT_LEN 4
1820 # define SEARCH_EXTS ".pl", ".com", NULL
1821 # define MAX_EXT_LEN 4
1823 /* additional extensions to try in each dir if scriptname not found */
1825 char *ext[] = { SEARCH_EXTS };
1826 int extidx = 0, i = 0;
1827 char *curext = Nullch;
1829 # define MAX_EXT_LEN 0
1833 * If dosearch is true and if scriptname does not contain path
1834 * delimiters, search the PATH for scriptname.
1836 * If SEARCH_EXTS is also defined, will look for each
1837 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1838 * while searching the PATH.
1840 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1841 * proceeds as follows:
1843 * + look for ./scriptname{,.foo,.bar}
1844 * + search the PATH for scriptname{,.foo,.bar}
1847 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1848 * this will not look in '.' if it's not in the PATH)
1853 int hasdir, idx = 0, deftypes = 1;
1856 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1857 /* The first time through, just add SEARCH_EXTS to whatever we
1858 * already have, so we can check for default file types. */
1860 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1866 if ((strlen(tokenbuf) + strlen(scriptname)
1867 + MAX_EXT_LEN) >= sizeof tokenbuf)
1868 continue; /* don't search dir with too-long name */
1869 strcat(tokenbuf, scriptname);
1873 if (strEQ(scriptname, "-"))
1875 if (dosearch) { /* Look in '.' first. */
1876 char *cur = scriptname;
1878 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1880 if (strEQ(ext[i++],curext)) {
1881 extidx = -1; /* already has an ext */
1886 DEBUG_p(PerlIO_printf(Perl_debug_log,
1887 "Looking for %s\n",cur));
1888 if (Stat(cur,&statbuf) >= 0) {
1896 if (cur == scriptname) {
1897 len = strlen(scriptname);
1898 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1900 cur = strcpy(tokenbuf, scriptname);
1902 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1903 && strcpy(tokenbuf+len, ext[extidx++]));
1908 if (dosearch && !strchr(scriptname, '/')
1910 && !strchr(scriptname, '\\')
1912 && (s = getenv("PATH"))) {
1915 bufend = s + strlen(s);
1916 while (s < bufend) {
1917 #if defined(atarist) || defined(DOSISH)
1922 && *s != ';'; len++, s++) {
1923 if (len < sizeof tokenbuf)
1926 if (len < sizeof tokenbuf)
1927 tokenbuf[len] = '\0';
1928 #else /* ! (atarist || DOSISH) */
1929 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1932 #endif /* ! (atarist || DOSISH) */
1935 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1936 continue; /* don't search dir with too-long name */
1938 #if defined(atarist) || defined(DOSISH)
1939 && tokenbuf[len - 1] != '/'
1940 && tokenbuf[len - 1] != '\\'
1943 tokenbuf[len++] = '/';
1944 if (len == 2 && tokenbuf[0] == '.')
1946 (void)strcpy(tokenbuf + len, scriptname);
1950 len = strlen(tokenbuf);
1951 if (extidx > 0) /* reset after previous loop */
1955 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1956 retval = Stat(tokenbuf,&statbuf);
1958 } while ( retval < 0 /* not there */
1959 && extidx>=0 && ext[extidx] /* try an extension? */
1960 && strcpy(tokenbuf+len, ext[extidx++])
1965 if (S_ISREG(statbuf.st_mode)
1966 && cando(S_IRUSR,TRUE,&statbuf)
1968 && cando(S_IXUSR,TRUE,&statbuf)
1972 xfound = tokenbuf; /* bingo! */
1976 xfailed = savepv(tokenbuf);
1979 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1981 seen_dot = 1; /* Disable message. */
1983 croak("Can't %s %s%s%s",
1984 (xfailed ? "execute" : "find"),
1985 (xfailed ? xfailed : scriptname),
1986 (xfailed ? "" : " on PATH"),
1987 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1990 scriptname = xfound;
1993 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1994 char *s = scriptname + 8;
2003 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2004 curcop->cop_filegv = gv_fetchfile(origfilename);
2005 if (strEQ(origfilename,"-"))
2007 if (fdscript >= 0) {
2008 rsfp = PerlIO_fdopen(fdscript,"r");
2009 #if defined(HAS_FCNTL) && defined(F_SETFD)
2011 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2014 else if (preprocess) {
2015 char *cpp_cfg = CPPSTDIN;
2016 SV *cpp = NEWSV(0,0);
2017 SV *cmd = NEWSV(0,0);
2019 if (strEQ(cpp_cfg, "cppstdin"))
2020 sv_catpvf(cpp, "%s/", BIN_EXP);
2021 sv_catpv(cpp, cpp_cfg);
2024 sv_catpv(sv,PRIVLIB_EXP);
2028 sed %s -e \"/^[^#]/b\" \
2029 -e \"/^#[ ]*include[ ]/b\" \
2030 -e \"/^#[ ]*define[ ]/b\" \
2031 -e \"/^#[ ]*if[ ]/b\" \
2032 -e \"/^#[ ]*ifdef[ ]/b\" \
2033 -e \"/^#[ ]*ifndef[ ]/b\" \
2034 -e \"/^#[ ]*else/b\" \
2035 -e \"/^#[ ]*elif[ ]/b\" \
2036 -e \"/^#[ ]*undef[ ]/b\" \
2037 -e \"/^#[ ]*endif/b\" \
2040 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2043 %s %s -e '/^[^#]/b' \
2044 -e '/^#[ ]*include[ ]/b' \
2045 -e '/^#[ ]*define[ ]/b' \
2046 -e '/^#[ ]*if[ ]/b' \
2047 -e '/^#[ ]*ifdef[ ]/b' \
2048 -e '/^#[ ]*ifndef[ ]/b' \
2049 -e '/^#[ ]*else/b' \
2050 -e '/^#[ ]*elif[ ]/b' \
2051 -e '/^#[ ]*undef[ ]/b' \
2052 -e '/^#[ ]*endif/b' \
2060 (doextract ? "-e '1,/^#/d\n'" : ""),
2062 scriptname, cpp, sv, CPPMINUS);
2064 #ifdef IAMSUID /* actually, this is caught earlier */
2065 if (euid != uid && !euid) { /* if running suidperl */
2067 (void)seteuid(uid); /* musn't stay setuid root */
2070 (void)setreuid((Uid_t)-1, uid);
2072 #ifdef HAS_SETRESUID
2073 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2079 if (geteuid() != uid)
2080 croak("Can't do seteuid!\n");
2082 #endif /* IAMSUID */
2083 rsfp = my_popen(SvPVX(cmd), "r");
2087 else if (!*scriptname) {
2088 forbid_setid("program input from stdin");
2089 rsfp = PerlIO_stdin();
2092 rsfp = PerlIO_open(scriptname,"r");
2093 #if defined(HAS_FCNTL) && defined(F_SETFD)
2095 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2103 #ifndef IAMSUID /* in case script is not readable before setuid */
2104 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2105 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2107 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2108 croak("Can't do setuid\n");
2112 croak("Can't open perl script \"%s\": %s\n",
2113 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2118 validate_suid(char *validarg, char *scriptname)
2122 /* do we need to emulate setuid on scripts? */
2124 /* This code is for those BSD systems that have setuid #! scripts disabled
2125 * in the kernel because of a security problem. Merely defining DOSUID
2126 * in perl will not fix that problem, but if you have disabled setuid
2127 * scripts in the kernel, this will attempt to emulate setuid and setgid
2128 * on scripts that have those now-otherwise-useless bits set. The setuid
2129 * root version must be called suidperl or sperlN.NNN. If regular perl
2130 * discovers that it has opened a setuid script, it calls suidperl with
2131 * the same argv that it had. If suidperl finds that the script it has
2132 * just opened is NOT setuid root, it sets the effective uid back to the
2133 * uid. We don't just make perl setuid root because that loses the
2134 * effective uid we had before invoking perl, if it was different from the
2137 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2138 * be defined in suidperl only. suidperl must be setuid root. The
2139 * Configure script will set this up for you if you want it.
2146 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2147 croak("Can't stat script \"%s\"",origfilename);
2148 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2152 #ifndef HAS_SETREUID
2153 /* On this access check to make sure the directories are readable,
2154 * there is actually a small window that the user could use to make
2155 * filename point to an accessible directory. So there is a faint
2156 * chance that someone could execute a setuid script down in a
2157 * non-accessible directory. I don't know what to do about that.
2158 * But I don't think it's too important. The manual lies when
2159 * it says access() is useful in setuid programs.
2161 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2162 croak("Permission denied");
2164 /* If we can swap euid and uid, then we can determine access rights
2165 * with a simple stat of the file, and then compare device and
2166 * inode to make sure we did stat() on the same file we opened.
2167 * Then we just have to make sure he or she can execute it.
2170 struct stat tmpstatbuf;
2174 setreuid(euid,uid) < 0
2177 setresuid(euid,uid,(Uid_t)-1) < 0
2180 || getuid() != euid || geteuid() != uid)
2181 croak("Can't swap uid and euid"); /* really paranoid */
2182 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2183 croak("Permission denied"); /* testing full pathname here */
2184 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2185 tmpstatbuf.st_ino != statbuf.st_ino) {
2186 (void)PerlIO_close(rsfp);
2187 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2189 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2190 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2191 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2192 (long)statbuf.st_dev, (long)statbuf.st_ino,
2193 SvPVX(GvSV(curcop->cop_filegv)),
2194 (long)statbuf.st_uid, (long)statbuf.st_gid);
2195 (void)my_pclose(rsfp);
2197 croak("Permission denied\n");
2201 setreuid(uid,euid) < 0
2203 # if defined(HAS_SETRESUID)
2204 setresuid(uid,euid,(Uid_t)-1) < 0
2207 || getuid() != uid || geteuid() != euid)
2208 croak("Can't reswap uid and euid");
2209 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2210 croak("Permission denied\n");
2212 #endif /* HAS_SETREUID */
2213 #endif /* IAMSUID */
2215 if (!S_ISREG(statbuf.st_mode))
2216 croak("Permission denied");
2217 if (statbuf.st_mode & S_IWOTH)
2218 croak("Setuid/gid script is writable by world");
2219 doswitches = FALSE; /* -s is insecure in suid */
2221 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2222 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2223 croak("No #! line");
2224 s = SvPV(linestr,na)+2;
2226 while (!isSPACE(*s)) s++;
2227 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2228 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2229 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2230 croak("Not a perl script");
2231 while (*s == ' ' || *s == '\t') s++;
2233 * #! arg must be what we saw above. They can invoke it by
2234 * mentioning suidperl explicitly, but they may not add any strange
2235 * arguments beyond what #! says if they do invoke suidperl that way.
2237 len = strlen(validarg);
2238 if (strEQ(validarg," PHOOEY ") ||
2239 strnNE(s,validarg,len) || !isSPACE(s[len]))
2240 croak("Args must match #! line");
2243 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2244 euid == statbuf.st_uid)
2246 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2247 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2248 #endif /* IAMSUID */
2250 if (euid) { /* oops, we're not the setuid root perl */
2251 (void)PerlIO_close(rsfp);
2254 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2256 croak("Can't do setuid\n");
2259 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2261 (void)setegid(statbuf.st_gid);
2264 (void)setregid((Gid_t)-1,statbuf.st_gid);
2266 #ifdef HAS_SETRESGID
2267 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2269 setgid(statbuf.st_gid);
2273 if (getegid() != statbuf.st_gid)
2274 croak("Can't do setegid!\n");
2276 if (statbuf.st_mode & S_ISUID) {
2277 if (statbuf.st_uid != euid)
2279 (void)seteuid(statbuf.st_uid); /* all that for this */
2282 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2284 #ifdef HAS_SETRESUID
2285 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2287 setuid(statbuf.st_uid);
2291 if (geteuid() != statbuf.st_uid)
2292 croak("Can't do seteuid!\n");
2294 else if (uid) { /* oops, mustn't run as root */
2296 (void)seteuid((Uid_t)uid);
2299 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2301 #ifdef HAS_SETRESUID
2302 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2308 if (geteuid() != uid)
2309 croak("Can't do seteuid!\n");
2312 if (!cando(S_IXUSR,TRUE,&statbuf))
2313 croak("Permission denied\n"); /* they can't do this */
2316 else if (preprocess)
2317 croak("-P not allowed for setuid/setgid script\n");
2318 else if (fdscript >= 0)
2319 croak("fd script not allowed in suidperl\n");
2321 croak("Script is not setuid/setgid in suidperl\n");
2323 /* We absolutely must clear out any saved ids here, so we */
2324 /* exec the real perl, substituting fd script for scriptname. */
2325 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2326 PerlIO_rewind(rsfp);
2327 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2328 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2329 if (!origargv[which])
2330 croak("Permission denied");
2331 origargv[which] = savepv(form("/dev/fd/%d/%s",
2332 PerlIO_fileno(rsfp), origargv[which]));
2333 #if defined(HAS_FCNTL) && defined(F_SETFD)
2334 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2336 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2337 croak("Can't do setuid\n");
2338 #endif /* IAMSUID */
2340 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2341 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2343 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2344 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2346 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2349 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2350 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2351 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2352 /* not set-id, must be wrapped */
2358 find_beginning(void)
2360 register char *s, *s2;
2362 /* skip forward in input to the real script? */
2366 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2367 croak("No Perl script found in input\n");
2368 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2369 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2371 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2373 while (*s == ' ' || *s == '\t') s++;
2375 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2376 if (strnEQ(s2-4,"perl",4))
2378 while (s = moreswitches(s)) ;
2380 if (cddir && chdir(cddir) < 0)
2381 croak("Can't chdir to %s",cddir);
2389 uid = (int)getuid();
2390 euid = (int)geteuid();
2391 gid = (int)getgid();
2392 egid = (int)getegid();
2397 tainting |= (uid && (euid != uid || egid != gid));
2401 forbid_setid(char *s)
2404 croak("No %s allowed while running setuid", s);
2406 croak("No %s allowed while running setgid", s);
2413 curstash = debstash;
2414 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2416 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2417 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2418 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2419 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2420 sv_setiv(DBsingle, 0);
2421 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2422 sv_setiv(DBtrace, 0);
2423 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2424 sv_setiv(DBsignal, 0);
2425 curstash = defstash;
2429 init_stacks(ARGSproto)
2432 mainstack = curstack; /* remember in case we switch stacks */
2433 AvREAL_off(curstack); /* not a real array */
2434 av_extend(curstack,127);
2436 stack_base = AvARRAY(curstack);
2437 stack_sp = stack_base;
2438 stack_max = stack_base + 127;
2440 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2441 New(50,cxstack,cxstack_max + 1,CONTEXT);
2444 New(50,tmps_stack,128,SV*);
2450 * The following stacks almost certainly should be per-interpreter,
2451 * but for now they're not. XXX
2455 markstack_ptr = markstack;
2457 New(54,markstack,64,I32);
2458 markstack_ptr = markstack;
2459 markstack_max = markstack + 64;
2465 New(54,scopestack,32,I32);
2467 scopestack_max = 32;
2473 New(54,savestack,128,ANY);
2475 savestack_max = 128;
2481 New(54,retstack,16,OP*);
2492 Safefree(tmps_stack);
2499 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2508 subname = newSVpv("main",4);
2512 init_predump_symbols(void)
2519 sv_setpvn(*av_fetch(thr->magicals,find_thread_magical("\""),FALSE)," ", 1);
2521 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2522 #endif /* USE_THREADS */
2524 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2525 GvMULTI_on(stdingv);
2526 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2527 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2529 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2531 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2533 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2535 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2537 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2539 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2540 GvMULTI_on(othergv);
2541 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2542 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2544 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2546 statname = NEWSV(66,0); /* last filename we did stat on */
2549 osname = savepv(OSNAME);
2553 init_postdump_symbols(register int argc, register char **argv, register char **env)
2560 argc--,argv++; /* skip name of script */
2562 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2565 if (argv[0][1] == '-') {
2569 if (s = strchr(argv[0], '=')) {
2571 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2574 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2577 toptarget = NEWSV(0,0);
2578 sv_upgrade(toptarget, SVt_PVFM);
2579 sv_setpvn(toptarget, "", 0);
2580 bodytarget = NEWSV(0,0);
2581 sv_upgrade(bodytarget, SVt_PVFM);
2582 sv_setpvn(bodytarget, "", 0);
2583 formtarget = bodytarget;
2586 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2587 sv_setpv(GvSV(tmpgv),origfilename);
2588 magicname("0", "0", 1);
2590 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2591 sv_setpv(GvSV(tmpgv),origargv[0]);
2592 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2594 (void)gv_AVadd(argvgv);
2595 av_clear(GvAVn(argvgv));
2596 for (; argc > 0; argc--,argv++) {
2597 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2600 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2604 hv_magic(hv, envgv, 'E');
2605 #ifndef VMS /* VMS doesn't have environ array */
2606 /* Note that if the supplied env parameter is actually a copy
2607 of the global environ then it may now point to free'd memory
2608 if the environment has been modified since. To avoid this
2609 problem we treat env==NULL as meaning 'use the default'
2614 environ[0] = Nullch;
2615 for (; *env; env++) {
2616 if (!(s = strchr(*env,'=')))
2622 sv = newSVpv(s--,0);
2623 (void)hv_store(hv, *env, s - *env, sv, 0);
2625 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2626 /* Sins of the RTL. See note in my_setenv(). */
2627 (void)putenv(savepv(*env));
2631 #ifdef DYNAMIC_ENV_FETCH
2632 HvNAME(hv) = savepv(ENV_HV_NAME);
2636 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2637 sv_setiv(GvSV(tmpgv), (IV)getpid());
2646 s = getenv("PERL5LIB");
2650 incpush(getenv("PERLLIB"), FALSE);
2652 /* Treat PERL5?LIB as a possible search list logical name -- the
2653 * "natural" VMS idiom for a Unix path string. We allow each
2654 * element to be a set of |-separated directories for compatibility.
2658 if (my_trnlnm("PERL5LIB",buf,0))
2659 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2661 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2665 /* Use the ~-expanded versions of APPLLIB (undocumented),
2666 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2669 incpush(APPLLIB_EXP, FALSE);
2673 incpush(ARCHLIB_EXP, FALSE);
2676 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2678 incpush(PRIVLIB_EXP, FALSE);
2681 incpush(SITEARCH_EXP, FALSE);
2684 incpush(SITELIB_EXP, FALSE);
2686 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2687 incpush(OLDARCHLIB_EXP, FALSE);
2691 incpush(".", FALSE);
2695 # define PERLLIB_SEP ';'
2698 # define PERLLIB_SEP '|'
2700 # define PERLLIB_SEP ':'
2703 #ifndef PERLLIB_MANGLE
2704 # define PERLLIB_MANGLE(s,n) (s)
2708 incpush(char *p, int addsubdirs)
2710 SV *subdir = Nullsv;
2711 static char *archpat_auto;
2718 if (!archpat_auto) {
2719 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2720 + sizeof("//auto"));
2721 New(55, archpat_auto, len, char);
2722 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2724 for (len = sizeof(ARCHNAME) + 2;
2725 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2726 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2731 /* Break at all separators */
2733 SV *libdir = newSV(0);
2736 /* skip any consecutive separators */
2737 while ( *p == PERLLIB_SEP ) {
2738 /* Uncomment the next line for PATH semantics */
2739 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2743 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2744 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2749 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2750 p = Nullch; /* break out */
2754 * BEFORE pushing libdir onto @INC we may first push version- and
2755 * archname-specific sub-directories.
2758 struct stat tmpstatbuf;
2763 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2765 while (unix[len-1] == '/') len--; /* Cosmetic */
2766 sv_usepvn(libdir,unix,len);
2769 PerlIO_printf(PerlIO_stderr(),
2770 "Failed to unixify @INC element \"%s\"\n",
2773 /* .../archname/version if -d .../archname/version/auto */
2774 sv_setsv(subdir, libdir);
2775 sv_catpv(subdir, archpat_auto);
2776 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2777 S_ISDIR(tmpstatbuf.st_mode))
2778 av_push(GvAVn(incgv),
2779 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2781 /* .../archname if -d .../archname/auto */
2782 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2783 strlen(patchlevel) + 1, "", 0);
2784 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2785 S_ISDIR(tmpstatbuf.st_mode))
2786 av_push(GvAVn(incgv),
2787 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2790 /* finally push this lib directory on the end of @INC */
2791 av_push(GvAVn(incgv), libdir);
2794 SvREFCNT_dec(subdir);
2798 static struct thread *
2804 Newz(53, thr, 1, struct thread);
2805 curcop = &compiling;
2806 thr->cvcache = newHV();
2807 thr->magicals = newAV();
2808 thr->specific = newAV();
2809 thr->flags = THRf_R_JOINABLE;
2810 MUTEX_INIT(&thr->mutex);
2811 /* Handcraft thrsv similarly to mess_sv */
2812 New(53, thrsv, 1, SV);
2813 Newz(53, xpv, 1, XPV);
2814 SvFLAGS(thrsv) = SVt_PV;
2815 SvANY(thrsv) = (void*)xpv;
2816 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2817 SvPVX(thrsv) = (char*)thr;
2818 SvCUR_set(thrsv, sizeof(thr));
2819 SvLEN_set(thrsv, sizeof(thr));
2820 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2822 curcop = &compiling;
2825 MUTEX_LOCK(&threads_mutex);
2830 MUTEX_UNLOCK(&threads_mutex);
2832 #ifdef HAVE_THREAD_INTERN
2833 init_thread_intern(thr);
2835 thr->self = pthread_self();
2836 #endif /* HAVE_THREAD_INTERN */
2840 * These must come after the SET_THR because sv_setpvn does
2841 * SvTAINT and the taint fields require dTHR.
2843 toptarget = NEWSV(0,0);
2844 sv_upgrade(toptarget, SVt_PVFM);
2845 sv_setpvn(toptarget, "", 0);
2846 bodytarget = NEWSV(0,0);
2847 sv_upgrade(bodytarget, SVt_PVFM);
2848 sv_setpvn(bodytarget, "", 0);
2849 formtarget = bodytarget;
2852 #endif /* USE_THREADS */
2855 call_list(I32 oldscope, AV *list)
2858 line_t oldline = curcop->cop_line;
2863 while (AvFILL(list) >= 0) {
2864 CV *cv = (CV*)av_shift(list);
2872 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2873 (void)SvPV(errsv, len);
2876 curcop = &compiling;
2877 curcop->cop_line = oldline;
2878 if (list == beginav)
2879 sv_catpv(errsv, "BEGIN failed--compilation aborted");
2881 sv_catpv(errsv, "END failed--cleanup aborted");
2882 while (scopestack_ix > oldscope)
2884 croak("%s", SvPVX(errsv));
2892 /* my_exit() was called */
2893 while (scopestack_ix > oldscope)
2896 curstash = defstash;
2898 call_list(oldscope, endav);
2900 curcop = &compiling;
2901 curcop->cop_line = oldline;
2903 if (list == beginav)
2904 croak("BEGIN failed--compilation aborted");
2906 croak("END failed--cleanup aborted");
2912 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2917 curcop = &compiling;
2918 curcop->cop_line = oldline;
2931 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2932 thr, (unsigned long) status));
2933 #endif /* USE_THREADS */
2942 STATUS_NATIVE_SET(status);
2949 my_failure_exit(void)
2952 if (vaxc$errno & 1) {
2953 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2954 STATUS_NATIVE_SET(44);
2957 if (!vaxc$errno && errno) /* unlikely */
2958 STATUS_NATIVE_SET(44);
2960 STATUS_NATIVE_SET(vaxc$errno);
2964 STATUS_POSIX_SET(errno);
2965 else if (STATUS_POSIX == 0)
2966 STATUS_POSIX_SET(255);
2975 register CONTEXT *cx;
2984 (void)UNLINK(e_tmpname);
2985 Safefree(e_tmpname);
2989 if (cxstack_ix >= 0) {