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( sv_interp )
111 register PerlInterpreter *sv_interp;
117 #endif /* FAKE_THREADS */
118 #endif /* USE_THREADS */
120 if (!(curinterp = sv_interp))
124 Zero(sv_interp, 1, PerlInterpreter);
127 /* Init the real globals (and main thread)? */
132 if (pthread_key_create(&thr_key, 0))
133 croak("panic: pthread_key_create");
134 MUTEX_INIT(&malloc_mutex);
135 MUTEX_INIT(&sv_mutex);
137 * Safe to use basic SV functions from now on (though
138 * not things like mortals or tainting yet).
140 MUTEX_INIT(&eval_mutex);
141 COND_INIT(&eval_cond);
142 MUTEX_INIT(&threads_mutex);
143 COND_INIT(&nthreads_cond);
145 thr = init_main_thread();
146 #endif /* USE_THREADS */
148 linestr = NEWSV(65,80);
149 sv_upgrade(linestr,SVt_PVIV);
151 if (!SvREADONLY(&sv_undef)) {
152 SvREADONLY_on(&sv_undef);
156 SvREADONLY_on(&sv_no);
158 sv_setpv(&sv_yes,Yes);
160 SvREADONLY_on(&sv_yes);
163 nrs = newSVpv("\n", 1);
164 rs = SvREFCNT_inc(nrs);
166 sighandlerp = sighandler;
171 * There is no way we can refer to them from Perl so close them to save
172 * space. The other alternative would be to provide STDAUX and STDPRN
175 (void)fclose(stdaux);
176 (void)fclose(stdprn);
182 perl_destruct_level = 1;
184 if(perl_destruct_level > 0)
189 lex_state = LEX_NOTPARSING;
191 start_env.je_prev = NULL;
192 start_env.je_ret = -1;
193 start_env.je_mustcatch = TRUE;
194 top_env = &start_env;
197 SET_NUMERIC_STANDARD();
198 #if defined(SUBVERSION) && SUBVERSION > 0
199 sprintf(patchlevel, "%7.5f", (double) 5
200 + ((double) PATCHLEVEL / (double) 1000)
201 + ((double) SUBVERSION / (double) 100000));
203 sprintf(patchlevel, "%5.3f", (double) 5 +
204 ((double) PATCHLEVEL / (double) 1000));
207 #if defined(LOCAL_PATCH_COUNT)
208 localpatches = local_patches; /* For possible -v */
211 PerlIO_init(); /* Hook to IO system */
213 fdpid = newAV(); /* for remembering popen pids by fd */
217 New(51,debname,128,char);
218 New(52,debdelim,128,char);
225 perl_destruct(sv_interp)
226 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 */
479 /* reset so print() ends up where we expect */
482 /* Prepare to destruct main symbol table. */
489 if (destruct_level >= 2) {
490 if (scopestack_ix != 0)
491 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
492 (long)scopestack_ix);
493 if (savestack_ix != 0)
494 warn("Unbalanced saves: %ld more saves than restores\n",
496 if (tmps_floor != -1)
497 warn("Unbalanced tmps: %ld more allocs than frees\n",
498 (long)tmps_floor + 1);
499 if (cxstack_ix != -1)
500 warn("Unbalanced context: %ld more PUSHes than POPs\n",
501 (long)cxstack_ix + 1);
504 /* Now absolutely destruct everything, somehow or other, loops or no. */
506 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
507 while (sv_count != 0 && sv_count != last_sv_count) {
508 last_sv_count = sv_count;
511 SvFLAGS(strtab) &= ~SVTYPEMASK;
512 SvFLAGS(strtab) |= SVt_PVHV;
514 /* Destruct the global string table. */
516 /* Yell and reset the HeVAL() slots that are still holding refcounts,
517 * so that sv_free() won't fail on them.
526 array = HvARRAY(strtab);
530 warn("Unbalanced string table refcount: (%d) for \"%s\"",
531 HeVAL(hent) - Nullsv, HeKEY(hent));
532 HeVAL(hent) = Nullsv;
542 SvREFCNT_dec(strtab);
545 warn("Scalars leaked: %ld\n", (long)sv_count);
549 /* No SVs have survived, need to clean out */
553 Safefree(origfilename);
555 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
557 DEBUG_P(debprofdump());
559 MUTEX_DESTROY(&sv_mutex);
560 MUTEX_DESTROY(&malloc_mutex);
561 MUTEX_DESTROY(&eval_mutex);
562 COND_DESTROY(&eval_cond);
564 /* As the penultimate thing, free the non-arena SV for thrsv */
565 Safefree(SvPVX(thrsv));
566 Safefree(SvANY(thrsv));
569 #endif /* USE_THREADS */
571 /* As the absolutely last thing, free the non-arena SV for mess() */
574 /* we know that type >= SVt_PV */
576 Safefree(SvPVX(mess_sv));
577 Safefree(SvANY(mess_sv));
585 PerlInterpreter *sv_interp;
587 if (!(curinterp = sv_interp))
593 perl_parse(sv_interp, xsinit, argc, argv, env)
594 PerlInterpreter *sv_interp;
595 void (*xsinit)_((void));
603 char *scriptname = NULL;
604 VOL bool dosearch = FALSE;
611 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
614 croak("suidperl is no longer needed since the kernel can now execute\n\
615 setuid perl scripts securely.\n");
619 if (!(curinterp = sv_interp))
622 #if defined(NeXT) && defined(__DYNAMIC__)
623 _dyld_lookup_and_bind
624 ("__environ", (unsigned long *) &environ_pointer, NULL);
629 #ifndef VMS /* VMS doesn't have environ array */
630 origenviron = environ;
636 /* Come here if running an undumped a.out. */
638 origfilename = savepv(argv[0]);
640 cxstack_ix = -1; /* start label stack again */
642 init_postdump_symbols(argc,argv,env);
647 curpad = AvARRAY(comppad);
652 SvREFCNT_dec(main_cv);
656 oldscope = scopestack_ix;
664 /* my_exit() was called */
665 while (scopestack_ix > oldscope)
670 call_list(oldscope, endav);
672 return STATUS_NATIVE_EXPORT;
675 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
679 sv_setpvn(linestr,"",0);
680 sv = newSVpv("",0); /* first used for -I flags */
684 for (argc--,argv++; argc > 0; argc--,argv++) {
685 if (argv[0][0] != '-' || !argv[0][1])
689 validarg = " PHOOEY ";
714 if (s = moreswitches(s))
724 if (euid != uid || egid != gid)
725 croak("No -e allowed in setuid scripts");
727 e_tmpname = savepv(TMPPATH);
728 (void)mktemp(e_tmpname);
730 croak("Can't mktemp()");
731 e_fp = PerlIO_open(e_tmpname,"w");
733 croak("Cannot open temporary file");
738 PerlIO_puts(e_fp,argv[1]);
742 croak("No code specified for -e");
743 (void)PerlIO_putc(e_fp,'\n');
745 case 'I': /* -I handled both here and in moreswitches() */
747 if (!*++s && (s=argv[1]) != Nullch) {
750 while (s && isSPACE(*s))
754 for (e = s; *e && !isSPACE(*e); e++) ;
761 } /* XXX else croak? */
775 preambleav = newAV();
776 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
778 Sv = newSVpv("print myconfig();",0);
780 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
782 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
784 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
785 sv_catpv(Sv,"\" Compile-time options:");
787 sv_catpv(Sv," DEBUGGING");
790 sv_catpv(Sv," NO_EMBED");
793 sv_catpv(Sv," MULTIPLICITY");
795 sv_catpv(Sv,"\\n\",");
797 #if defined(LOCAL_PATCH_COUNT)
798 if (LOCAL_PATCH_COUNT > 0) {
800 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
801 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
803 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
807 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
810 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
812 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
817 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
818 print \" \\%ENV:\\n @env\\n\" if @env; \
819 print \" \\@INC:\\n @INC\\n\";");
822 Sv = newSVpv("config_vars(qw(",0);
827 av_push(preambleav, Sv);
828 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
839 if (!*++s || isSPACE(*s)) {
843 /* catch use of gnu style long options */
844 if (strEQ(s, "version")) {
848 if (strEQ(s, "help")) {
855 croak("Unrecognized switch: -%s (-h will show valid options)",s);
860 if (!tainting && (s = getenv("PERL5OPT"))) {
871 if (!strchr("DIMUdmw", *s))
872 croak("Illegal switch in PERL5OPT: -%c", *s);
878 scriptname = argv[0];
880 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
882 warn("Did you forget to compile with -DMULTIPLICITY?");
884 croak("Can't write to temp file for -e: %s", Strerror(errno));
888 scriptname = e_tmpname;
890 else if (scriptname == Nullch) {
892 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
900 open_script(scriptname,dosearch,sv);
902 validate_suid(validarg, scriptname);
907 main_cv = compcv = (CV*)NEWSV(1104,0);
908 sv_upgrade((SV *)compcv, SVt_PVCV);
912 av_push(comppad, Nullsv);
913 curpad = AvARRAY(comppad);
914 comppad_name = newAV();
915 comppad_name_fill = 0;
916 min_intro_pending = 0;
919 av_store(comppad_name, 0, newSVpv("@_", 2));
920 curpad[0] = (SV*)newAV();
921 SvPADMY_on(curpad[0]); /* XXX Needed? */
923 New(666, CvMUTEXP(compcv), 1, perl_mutex);
924 MUTEX_INIT(CvMUTEXP(compcv));
925 #endif /* USE_THREADS */
927 comppadlist = newAV();
928 AvREAL_off(comppadlist);
929 av_store(comppadlist, 0, (SV*)comppad_name);
930 av_store(comppadlist, 1, (SV*)comppad);
931 CvPADLIST(compcv) = comppadlist;
933 boot_core_UNIVERSAL();
935 (*xsinit)(); /* in case linked C routines want magical variables */
936 #if defined(VMS) || defined(WIN32)
940 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
941 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
944 init_predump_symbols();
946 init_postdump_symbols(argc,argv,env);
950 /* now parse the script */
953 if (yyparse() || error_count) {
955 croak("%s had compilation errors.\n", origfilename);
957 croak("Execution of %s aborted due to compilation errors.\n",
961 curcop->cop_line = 0;
965 (void)UNLINK(e_tmpname);
970 /* now that script is parsed, we can modify record separator */
972 rs = SvREFCNT_inc(nrs);
974 sv_setsv(*av_fetch(thr->magicals, find_thread_magical("/"), FALSE), rs);
976 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
977 #endif /* USE_THREADS */
988 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
989 dump_mstats("after compilation:");
1000 PerlInterpreter *sv_interp;
1007 if (!(curinterp = sv_interp))
1010 oldscope = scopestack_ix;
1015 cxstack_ix = -1; /* start context stack again */
1018 /* my_exit() was called */
1019 while (scopestack_ix > oldscope)
1022 curstash = defstash;
1024 call_list(oldscope, endav);
1026 if (getenv("PERL_DEBUG_MSTATS"))
1027 dump_mstats("after execution: ");
1030 return STATUS_NATIVE_EXPORT;
1033 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1038 if (curstack != mainstack) {
1040 SWITCHSTACK(curstack, mainstack);
1045 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1046 sawampersand ? "Enabling" : "Omitting"));
1049 DEBUG_x(dump_all());
1050 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1052 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1053 (unsigned long) thr));
1054 #endif /* USE_THREADS */
1057 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1060 if (PERLDB_SINGLE && DBsingle)
1061 sv_setiv(DBsingle, 1);
1063 call_list(oldscope, initav);
1073 else if (main_start) {
1074 CvDEPTH(main_cv) = 1;
1085 perl_get_sv(name, create)
1091 if (name[1] == '\0' && !isALPHA(name[0])) {
1092 PADOFFSET tmp = find_thread_magical(name);
1093 if (tmp != NOT_IN_PAD) {
1095 return *av_fetch(thr->magicals, tmp, FALSE);
1098 #endif /* USE_THREADS */
1099 gv = gv_fetchpv(name, create, SVt_PV);
1106 perl_get_av(name, create)
1110 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1119 perl_get_hv(name, create)
1123 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1132 perl_get_cv(name, create)
1136 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1137 if (create && !GvCVu(gv))
1138 return newSUB(start_subparse(FALSE, 0),
1139 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1147 /* Be sure to refetch the stack pointer after calling these routines. */
1150 perl_call_argv(subname, flags, argv)
1152 I32 flags; /* See G_* flags in cop.h */
1153 register char **argv; /* null terminated arg list */
1161 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1166 return perl_call_pv(subname, flags);
1170 perl_call_pv(subname, flags)
1171 char *subname; /* name of the subroutine */
1172 I32 flags; /* See G_* flags in cop.h */
1174 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1178 perl_call_method(methname, flags)
1179 char *methname; /* name of the subroutine */
1180 I32 flags; /* See G_* flags in cop.h */
1187 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1190 return perl_call_sv(*stack_sp--, flags);
1193 /* May be called with any of a CV, a GV, or an SV containing the name. */
1195 perl_call_sv(sv, flags)
1197 I32 flags; /* See G_* flags in cop.h */
1200 LOGOP myop; /* fake syntax tree node */
1206 bool oldcatch = CATCH_GET;
1211 if (flags & G_DISCARD) {
1216 Zero(&myop, 1, LOGOP);
1217 myop.op_next = Nullop;
1218 if (!(flags & G_NOARGS))
1219 myop.op_flags |= OPf_STACKED;
1220 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1221 (flags & G_ARRAY) ? OPf_WANT_LIST :
1226 EXTEND(stack_sp, 1);
1229 oldscope = scopestack_ix;
1231 if (PERLDB_SUB && curstash != debstash
1232 /* Handle first BEGIN of -d. */
1233 && (DBcv || (DBcv = GvCV(DBsub)))
1234 /* Try harder, since this may have been a sighandler, thus
1235 * curstash may be meaningless. */
1236 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1237 op->op_private |= OPpENTERSUB_DB;
1239 if (flags & G_EVAL) {
1240 cLOGOP->op_other = op;
1242 /* we're trying to emulate pp_entertry() here */
1244 register CONTEXT *cx;
1245 I32 gimme = GIMME_V;
1250 push_return(op->op_next);
1251 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1253 eval_root = op; /* Only needed so that goto works right. */
1256 if (flags & G_KEEPERR)
1271 /* my_exit() was called */
1272 curstash = defstash;
1276 croak("Callback called exit");
1285 stack_sp = stack_base + oldmark;
1286 if (flags & G_ARRAY)
1290 *++stack_sp = &sv_undef;
1298 if (op == (OP*)&myop)
1299 op = pp_entersub(ARGS);
1302 retval = stack_sp - (stack_base + oldmark);
1303 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1307 if (flags & G_EVAL) {
1308 if (scopestack_ix > oldscope) {
1312 register CONTEXT *cx;
1324 CATCH_SET(oldcatch);
1326 if (flags & G_DISCARD) {
1327 stack_sp = stack_base + oldmark;
1336 /* Eval a string. The G_EVAL flag is always assumed. */
1339 perl_eval_sv(sv, flags)
1341 I32 flags; /* See G_* flags in cop.h */
1344 UNOP myop; /* fake syntax tree node */
1346 I32 oldmark = sp - stack_base;
1353 if (flags & G_DISCARD) {
1361 EXTEND(stack_sp, 1);
1363 oldscope = scopestack_ix;
1365 if (!(flags & G_NOARGS))
1366 myop.op_flags = OPf_STACKED;
1367 myop.op_next = Nullop;
1368 myop.op_type = OP_ENTEREVAL;
1369 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1370 (flags & G_ARRAY) ? OPf_WANT_LIST :
1372 if (flags & G_KEEPERR)
1373 myop.op_flags |= OPf_SPECIAL;
1383 /* my_exit() was called */
1384 curstash = defstash;
1388 croak("Callback called exit");
1397 stack_sp = stack_base + oldmark;
1398 if (flags & G_ARRAY)
1402 *++stack_sp = &sv_undef;
1407 if (op == (OP*)&myop)
1408 op = pp_entereval(ARGS);
1411 retval = stack_sp - (stack_base + oldmark);
1412 if (!(flags & G_KEEPERR))
1417 if (flags & G_DISCARD) {
1418 stack_sp = stack_base + oldmark;
1428 perl_eval_pv(p, croak_on_error)
1434 SV* sv = newSVpv(p, 0);
1437 perl_eval_sv(sv, G_SCALAR);
1444 if (croak_on_error && SvTRUE(ERRSV))
1445 croak(SvPVx(ERRSV, na));
1450 /* Require a module. */
1456 SV* sv = sv_newmortal();
1457 sv_setpv(sv, "require '");
1460 perl_eval_sv(sv, G_DISCARD);
1464 magicname(sym,name,namlen)
1471 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1472 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1476 usage(name) /* XXX move this out into a module ? */
1479 /* This message really ought to be max 23 lines.
1480 * Removed -h because the user already knows that opton. Others? */
1482 static char *usage[] = {
1483 "-0[octal] specify record separator (\\0, if no argument)",
1484 "-a autosplit mode with -n or -p (splits $_ into @F)",
1485 "-c check syntax only (runs BEGIN and END blocks)",
1486 "-d[:debugger] run scripts under debugger",
1487 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1488 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1489 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1490 "-i[extension] edit <> files in place (make backup if extension supplied)",
1491 "-Idirectory specify @INC/#include directory (may be used more than once)",
1492 "-l[octal] enable line ending processing, specifies line terminator",
1493 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1494 "-n assume 'while (<>) { ... }' loop around your script",
1495 "-p assume loop like -n but print line also like sed",
1496 "-P run script through C preprocessor before compilation",
1497 "-s enable some switch parsing for switches after script name",
1498 "-S look for the script using PATH environment variable",
1499 "-T turn on tainting checks",
1500 "-u dump core after parsing script",
1501 "-U allow unsafe operations",
1502 "-v print version number and patchlevel of perl",
1503 "-V[:variable] print perl configuration information",
1504 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1505 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1511 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1513 printf("\n %s", *p++);
1516 /* This routine handles any switches that can be given during run */
1529 rschar = scan_oct(s, 4, &numlen);
1531 if (rschar & ~((U8)~0))
1533 else if (!rschar && numlen >= 2)
1534 nrs = newSVpv("", 0);
1537 nrs = newSVpv(&ch, 1);
1543 splitstr = savepv(s + 1);
1557 if (*s == ':' || *s == '=') {
1558 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1562 perldb = PERLDB_ALL;
1569 if (isALPHA(s[1])) {
1570 static char debopts[] = "psltocPmfrxuLHXD";
1573 for (s++; *s && (d = strchr(debopts,*s)); s++)
1574 debug |= 1 << (d - debopts);
1578 for (s++; isDIGIT(*s); s++) ;
1580 debug |= 0x80000000;
1582 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1583 for (s++; isALNUM(*s); s++) ;
1593 inplace = savepv(s+1);
1595 for (s = inplace; *s && !isSPACE(*s); s++) ;
1599 case 'I': /* -I handled both here and in parse_perl() */
1602 while (*s && isSPACE(*s))
1606 for (e = s; *e && !isSPACE(*e); e++) ;
1607 p = savepvn(s, e-s);
1613 croak("No space allowed after -I");
1623 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1633 ors = SvPV(nrs, orslen);
1634 ors = savepvn(ors, orslen);
1638 forbid_setid("-M"); /* XXX ? */
1641 forbid_setid("-m"); /* XXX ? */
1646 /* -M-foo == 'no foo' */
1647 if (*s == '-') { use = "no "; ++s; }
1648 sv = newSVpv(use,0);
1650 /* We allow -M'Module qw(Foo Bar)' */
1651 while(isALNUM(*s) || *s==':') ++s;
1653 sv_catpv(sv, start);
1654 if (*(start-1) == 'm') {
1656 croak("Can't use '%c' after -mname", *s);
1657 sv_catpv( sv, " ()");
1660 sv_catpvn(sv, start, s-start);
1661 sv_catpv(sv, " split(/,/,q{");
1666 if (preambleav == NULL)
1667 preambleav = newAV();
1668 av_push(preambleav, sv);
1671 croak("No space allowed after -%c", *(s-1));
1688 croak("Too late for \"-T\" option");
1700 #if defined(SUBVERSION) && SUBVERSION > 0
1701 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1702 PATCHLEVEL, SUBVERSION, ARCHNAME);
1704 printf("\nThis is perl, version %s built for %s",
1705 patchlevel, ARCHNAME);
1707 #if defined(LOCAL_PATCH_COUNT)
1708 if (LOCAL_PATCH_COUNT > 0)
1709 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1710 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1713 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1715 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1718 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1721 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1722 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1725 printf("atariST series port, ++jrb bammi@cadence.com\n");
1728 Perl may be copied only under the terms of either the Artistic License or the\n\
1729 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1737 if (s[1] == '-') /* Additional switches on #! line. */
1745 #ifdef ALTERNATE_SHEBANG
1746 case 'S': /* OS/2 needs -S on "extproc" line. */
1754 croak("Can't emulate -%.1s on #! line",s);
1759 /* compliments of Tom Christiansen */
1761 /* unexec() can be found in the Gnu emacs distribution */
1772 prog = newSVpv(BIN_EXP);
1773 sv_catpv(prog, "/perl");
1774 file = newSVpv(origfilename);
1775 sv_catpv(file, ".perldump");
1777 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1779 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1780 SvPVX(prog), SvPVX(file));
1784 # include <lib$routines.h>
1785 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1787 ABORT(); /* for use with undump */
1798 /* Note that strtab is a rather special HV. Assumptions are made
1799 about not iterating on it, and not adding tie magic to it.
1800 It is properly deallocated in perl_destruct() */
1802 HvSHAREKEYS_off(strtab); /* mandatory */
1803 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1804 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1806 curstash = defstash = newHV();
1807 curstname = newSVpv("main",4);
1808 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1809 SvREFCNT_dec(GvHV(gv));
1810 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1812 HvNAME(defstash) = savepv("main");
1813 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1815 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1816 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1818 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1819 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1820 sv_setpvn(ERRSV, "", 0);
1821 curstash = defstash;
1822 compiling.cop_stash = defstash;
1823 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1824 /* We must init $/ before switches are processed. */
1825 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1828 #ifdef CAN_PROTOTYPE
1830 open_script(char *scriptname, bool dosearch, SV *sv)
1833 open_script(scriptname,dosearch,sv)
1840 char *xfound = Nullch;
1841 char *xfailed = Nullch;
1845 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1846 # define SEARCH_EXTS ".bat", ".cmd", NULL
1847 # define MAX_EXT_LEN 4
1850 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1851 # define MAX_EXT_LEN 4
1854 # define SEARCH_EXTS ".pl", ".com", NULL
1855 # define MAX_EXT_LEN 4
1857 /* additional extensions to try in each dir if scriptname not found */
1859 char *ext[] = { SEARCH_EXTS };
1860 int extidx = 0, i = 0;
1861 char *curext = Nullch;
1863 # define MAX_EXT_LEN 0
1867 * If dosearch is true and if scriptname does not contain path
1868 * delimiters, search the PATH for scriptname.
1870 * If SEARCH_EXTS is also defined, will look for each
1871 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1872 * while searching the PATH.
1874 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1875 * proceeds as follows:
1877 * + look for ./scriptname{,.foo,.bar}
1878 * + search the PATH for scriptname{,.foo,.bar}
1881 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1882 * this will not look in '.' if it's not in the PATH)
1887 int hasdir, idx = 0, deftypes = 1;
1890 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1891 /* The first time through, just add SEARCH_EXTS to whatever we
1892 * already have, so we can check for default file types. */
1894 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1900 if ((strlen(tokenbuf) + strlen(scriptname)
1901 + MAX_EXT_LEN) >= sizeof tokenbuf)
1902 continue; /* don't search dir with too-long name */
1903 strcat(tokenbuf, scriptname);
1907 if (strEQ(scriptname, "-"))
1909 if (dosearch) { /* Look in '.' first. */
1910 char *cur = scriptname;
1912 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1914 if (strEQ(ext[i++],curext)) {
1915 extidx = -1; /* already has an ext */
1920 DEBUG_p(PerlIO_printf(Perl_debug_log,
1921 "Looking for %s\n",cur));
1922 if (Stat(cur,&statbuf) >= 0) {
1930 if (cur == scriptname) {
1931 len = strlen(scriptname);
1932 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1934 cur = strcpy(tokenbuf, scriptname);
1936 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1937 && strcpy(tokenbuf+len, ext[extidx++]));
1942 if (dosearch && !strchr(scriptname, '/')
1944 && !strchr(scriptname, '\\')
1946 && (s = getenv("PATH"))) {
1949 bufend = s + strlen(s);
1950 while (s < bufend) {
1951 #if defined(atarist) || defined(DOSISH)
1956 && *s != ';'; len++, s++) {
1957 if (len < sizeof tokenbuf)
1960 if (len < sizeof tokenbuf)
1961 tokenbuf[len] = '\0';
1962 #else /* ! (atarist || DOSISH) */
1963 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1966 #endif /* ! (atarist || DOSISH) */
1969 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1970 continue; /* don't search dir with too-long name */
1972 #if defined(atarist) || defined(DOSISH)
1973 && tokenbuf[len - 1] != '/'
1974 && tokenbuf[len - 1] != '\\'
1977 tokenbuf[len++] = '/';
1978 if (len == 2 && tokenbuf[0] == '.')
1980 (void)strcpy(tokenbuf + len, scriptname);
1984 len = strlen(tokenbuf);
1985 if (extidx > 0) /* reset after previous loop */
1989 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1990 retval = Stat(tokenbuf,&statbuf);
1992 } while ( retval < 0 /* not there */
1993 && extidx>=0 && ext[extidx] /* try an extension? */
1994 && strcpy(tokenbuf+len, ext[extidx++])
1999 if (S_ISREG(statbuf.st_mode)
2000 && cando(S_IRUSR,TRUE,&statbuf)
2002 && cando(S_IXUSR,TRUE,&statbuf)
2006 xfound = tokenbuf; /* bingo! */
2010 xfailed = savepv(tokenbuf);
2013 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
2015 seen_dot = 1; /* Disable message. */
2017 croak("Can't %s %s%s%s",
2018 (xfailed ? "execute" : "find"),
2019 (xfailed ? xfailed : scriptname),
2020 (xfailed ? "" : " on PATH"),
2021 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
2024 scriptname = xfound;
2027 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2028 char *s = scriptname + 8;
2037 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2038 curcop->cop_filegv = gv_fetchfile(origfilename);
2039 if (strEQ(origfilename,"-"))
2041 if (fdscript >= 0) {
2042 rsfp = PerlIO_fdopen(fdscript,"r");
2043 #if defined(HAS_FCNTL) && defined(F_SETFD)
2045 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2048 else if (preprocess) {
2049 char *cpp_cfg = CPPSTDIN;
2050 SV *cpp = NEWSV(0,0);
2051 SV *cmd = NEWSV(0,0);
2053 if (strEQ(cpp_cfg, "cppstdin"))
2054 sv_catpvf(cpp, "%s/", BIN_EXP);
2055 sv_catpv(cpp, cpp_cfg);
2058 sv_catpv(sv,PRIVLIB_EXP);
2062 sed %s -e \"/^[^#]/b\" \
2063 -e \"/^#[ ]*include[ ]/b\" \
2064 -e \"/^#[ ]*define[ ]/b\" \
2065 -e \"/^#[ ]*if[ ]/b\" \
2066 -e \"/^#[ ]*ifdef[ ]/b\" \
2067 -e \"/^#[ ]*ifndef[ ]/b\" \
2068 -e \"/^#[ ]*else/b\" \
2069 -e \"/^#[ ]*elif[ ]/b\" \
2070 -e \"/^#[ ]*undef[ ]/b\" \
2071 -e \"/^#[ ]*endif/b\" \
2074 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2077 %s %s -e '/^[^#]/b' \
2078 -e '/^#[ ]*include[ ]/b' \
2079 -e '/^#[ ]*define[ ]/b' \
2080 -e '/^#[ ]*if[ ]/b' \
2081 -e '/^#[ ]*ifdef[ ]/b' \
2082 -e '/^#[ ]*ifndef[ ]/b' \
2083 -e '/^#[ ]*else/b' \
2084 -e '/^#[ ]*elif[ ]/b' \
2085 -e '/^#[ ]*undef[ ]/b' \
2086 -e '/^#[ ]*endif/b' \
2094 (doextract ? "-e '1,/^#/d\n'" : ""),
2096 scriptname, cpp, sv, CPPMINUS);
2098 #ifdef IAMSUID /* actually, this is caught earlier */
2099 if (euid != uid && !euid) { /* if running suidperl */
2101 (void)seteuid(uid); /* musn't stay setuid root */
2104 (void)setreuid((Uid_t)-1, uid);
2106 #ifdef HAS_SETRESUID
2107 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2113 if (geteuid() != uid)
2114 croak("Can't do seteuid!\n");
2116 #endif /* IAMSUID */
2117 rsfp = my_popen(SvPVX(cmd), "r");
2121 else if (!*scriptname) {
2122 forbid_setid("program input from stdin");
2123 rsfp = PerlIO_stdin();
2126 rsfp = PerlIO_open(scriptname,"r");
2127 #if defined(HAS_FCNTL) && defined(F_SETFD)
2129 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2137 #ifndef IAMSUID /* in case script is not readable before setuid */
2138 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2139 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2141 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2142 croak("Can't do setuid\n");
2146 croak("Can't open perl script \"%s\": %s\n",
2147 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2152 validate_suid(validarg, scriptname)
2158 /* do we need to emulate setuid on scripts? */
2160 /* This code is for those BSD systems that have setuid #! scripts disabled
2161 * in the kernel because of a security problem. Merely defining DOSUID
2162 * in perl will not fix that problem, but if you have disabled setuid
2163 * scripts in the kernel, this will attempt to emulate setuid and setgid
2164 * on scripts that have those now-otherwise-useless bits set. The setuid
2165 * root version must be called suidperl or sperlN.NNN. If regular perl
2166 * discovers that it has opened a setuid script, it calls suidperl with
2167 * the same argv that it had. If suidperl finds that the script it has
2168 * just opened is NOT setuid root, it sets the effective uid back to the
2169 * uid. We don't just make perl setuid root because that loses the
2170 * effective uid we had before invoking perl, if it was different from the
2173 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2174 * be defined in suidperl only. suidperl must be setuid root. The
2175 * Configure script will set this up for you if you want it.
2182 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2183 croak("Can't stat script \"%s\"",origfilename);
2184 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2188 #ifndef HAS_SETREUID
2189 /* On this access check to make sure the directories are readable,
2190 * there is actually a small window that the user could use to make
2191 * filename point to an accessible directory. So there is a faint
2192 * chance that someone could execute a setuid script down in a
2193 * non-accessible directory. I don't know what to do about that.
2194 * But I don't think it's too important. The manual lies when
2195 * it says access() is useful in setuid programs.
2197 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2198 croak("Permission denied");
2200 /* If we can swap euid and uid, then we can determine access rights
2201 * with a simple stat of the file, and then compare device and
2202 * inode to make sure we did stat() on the same file we opened.
2203 * Then we just have to make sure he or she can execute it.
2206 struct stat tmpstatbuf;
2210 setreuid(euid,uid) < 0
2213 setresuid(euid,uid,(Uid_t)-1) < 0
2216 || getuid() != euid || geteuid() != uid)
2217 croak("Can't swap uid and euid"); /* really paranoid */
2218 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2219 croak("Permission denied"); /* testing full pathname here */
2220 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2221 tmpstatbuf.st_ino != statbuf.st_ino) {
2222 (void)PerlIO_close(rsfp);
2223 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2225 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2226 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2227 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2228 (long)statbuf.st_dev, (long)statbuf.st_ino,
2229 SvPVX(GvSV(curcop->cop_filegv)),
2230 (long)statbuf.st_uid, (long)statbuf.st_gid);
2231 (void)my_pclose(rsfp);
2233 croak("Permission denied\n");
2237 setreuid(uid,euid) < 0
2239 # if defined(HAS_SETRESUID)
2240 setresuid(uid,euid,(Uid_t)-1) < 0
2243 || getuid() != uid || geteuid() != euid)
2244 croak("Can't reswap uid and euid");
2245 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2246 croak("Permission denied\n");
2248 #endif /* HAS_SETREUID */
2249 #endif /* IAMSUID */
2251 if (!S_ISREG(statbuf.st_mode))
2252 croak("Permission denied");
2253 if (statbuf.st_mode & S_IWOTH)
2254 croak("Setuid/gid script is writable by world");
2255 doswitches = FALSE; /* -s is insecure in suid */
2257 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2258 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2259 croak("No #! line");
2260 s = SvPV(linestr,na)+2;
2262 while (!isSPACE(*s)) s++;
2263 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2264 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2265 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2266 croak("Not a perl script");
2267 while (*s == ' ' || *s == '\t') s++;
2269 * #! arg must be what we saw above. They can invoke it by
2270 * mentioning suidperl explicitly, but they may not add any strange
2271 * arguments beyond what #! says if they do invoke suidperl that way.
2273 len = strlen(validarg);
2274 if (strEQ(validarg," PHOOEY ") ||
2275 strnNE(s,validarg,len) || !isSPACE(s[len]))
2276 croak("Args must match #! line");
2279 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2280 euid == statbuf.st_uid)
2282 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2283 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2284 #endif /* IAMSUID */
2286 if (euid) { /* oops, we're not the setuid root perl */
2287 (void)PerlIO_close(rsfp);
2290 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2292 croak("Can't do setuid\n");
2295 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2297 (void)setegid(statbuf.st_gid);
2300 (void)setregid((Gid_t)-1,statbuf.st_gid);
2302 #ifdef HAS_SETRESGID
2303 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2305 setgid(statbuf.st_gid);
2309 if (getegid() != statbuf.st_gid)
2310 croak("Can't do setegid!\n");
2312 if (statbuf.st_mode & S_ISUID) {
2313 if (statbuf.st_uid != euid)
2315 (void)seteuid(statbuf.st_uid); /* all that for this */
2318 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2320 #ifdef HAS_SETRESUID
2321 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2323 setuid(statbuf.st_uid);
2327 if (geteuid() != statbuf.st_uid)
2328 croak("Can't do seteuid!\n");
2330 else if (uid) { /* oops, mustn't run as root */
2332 (void)seteuid((Uid_t)uid);
2335 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2337 #ifdef HAS_SETRESUID
2338 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2344 if (geteuid() != uid)
2345 croak("Can't do seteuid!\n");
2348 if (!cando(S_IXUSR,TRUE,&statbuf))
2349 croak("Permission denied\n"); /* they can't do this */
2352 else if (preprocess)
2353 croak("-P not allowed for setuid/setgid script\n");
2354 else if (fdscript >= 0)
2355 croak("fd script not allowed in suidperl\n");
2357 croak("Script is not setuid/setgid in suidperl\n");
2359 /* We absolutely must clear out any saved ids here, so we */
2360 /* exec the real perl, substituting fd script for scriptname. */
2361 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2362 PerlIO_rewind(rsfp);
2363 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2364 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2365 if (!origargv[which])
2366 croak("Permission denied");
2367 origargv[which] = savepv(form("/dev/fd/%d/%s",
2368 PerlIO_fileno(rsfp), origargv[which]));
2369 #if defined(HAS_FCNTL) && defined(F_SETFD)
2370 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2372 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2373 croak("Can't do setuid\n");
2374 #endif /* IAMSUID */
2376 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2377 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2379 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2380 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2382 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2385 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2386 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2387 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2388 /* not set-id, must be wrapped */
2396 register char *s, *s2;
2398 /* skip forward in input to the real script? */
2402 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2403 croak("No Perl script found in input\n");
2404 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2405 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2407 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2409 while (*s == ' ' || *s == '\t') s++;
2411 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2412 if (strnEQ(s2-4,"perl",4))
2414 while (s = moreswitches(s)) ;
2416 if (cddir && chdir(cddir) < 0)
2417 croak("Can't chdir to %s",cddir);
2425 uid = (int)getuid();
2426 euid = (int)geteuid();
2427 gid = (int)getgid();
2428 egid = (int)getegid();
2433 tainting |= (uid && (euid != uid || egid != gid));
2441 croak("No %s allowed while running setuid", s);
2443 croak("No %s allowed while running setgid", s);
2450 curstash = debstash;
2451 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2453 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2454 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2455 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2456 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2457 sv_setiv(DBsingle, 0);
2458 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2459 sv_setiv(DBtrace, 0);
2460 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2461 sv_setiv(DBsignal, 0);
2462 curstash = defstash;
2470 mainstack = curstack; /* remember in case we switch stacks */
2471 AvREAL_off(curstack); /* not a real array */
2472 av_extend(curstack,127);
2474 stack_base = AvARRAY(curstack);
2475 stack_sp = stack_base;
2476 stack_max = stack_base + 127;
2478 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2479 New(50,cxstack,cxstack_max + 1,CONTEXT);
2482 New(50,tmps_stack,128,SV*);
2488 * The following stacks almost certainly should be per-interpreter,
2489 * but for now they're not. XXX
2493 markstack_ptr = markstack;
2495 New(54,markstack,64,I32);
2496 markstack_ptr = markstack;
2497 markstack_max = markstack + 64;
2503 New(54,scopestack,32,I32);
2505 scopestack_max = 32;
2511 New(54,savestack,128,ANY);
2513 savestack_max = 128;
2519 New(54,retstack,16,OP*);
2530 Safefree(tmps_stack);
2537 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2546 subname = newSVpv("main",4);
2550 init_predump_symbols()
2557 sv_setpvn(*av_fetch(thr->magicals,find_thread_magical("\""),FALSE)," ", 1);
2559 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2560 #endif /* USE_THREADS */
2562 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2563 GvMULTI_on(stdingv);
2564 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2565 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2567 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2569 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2571 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2573 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2575 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2577 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2578 GvMULTI_on(othergv);
2579 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2580 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2582 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2584 statname = NEWSV(66,0); /* last filename we did stat on */
2587 osname = savepv(OSNAME);
2591 init_postdump_symbols(argc,argv,env)
2593 register char **argv;
2594 register char **env;
2601 argc--,argv++; /* skip name of script */
2603 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2606 if (argv[0][1] == '-') {
2610 if (s = strchr(argv[0], '=')) {
2612 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2615 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2618 toptarget = NEWSV(0,0);
2619 sv_upgrade(toptarget, SVt_PVFM);
2620 sv_setpvn(toptarget, "", 0);
2621 bodytarget = NEWSV(0,0);
2622 sv_upgrade(bodytarget, SVt_PVFM);
2623 sv_setpvn(bodytarget, "", 0);
2624 formtarget = bodytarget;
2627 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2628 sv_setpv(GvSV(tmpgv),origfilename);
2629 magicname("0", "0", 1);
2631 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2632 sv_setpv(GvSV(tmpgv),origargv[0]);
2633 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2635 (void)gv_AVadd(argvgv);
2636 av_clear(GvAVn(argvgv));
2637 for (; argc > 0; argc--,argv++) {
2638 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2641 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2645 hv_magic(hv, envgv, 'E');
2646 #ifndef VMS /* VMS doesn't have environ array */
2647 /* Note that if the supplied env parameter is actually a copy
2648 of the global environ then it may now point to free'd memory
2649 if the environment has been modified since. To avoid this
2650 problem we treat env==NULL as meaning 'use the default'
2655 environ[0] = Nullch;
2656 for (; *env; env++) {
2657 if (!(s = strchr(*env,'=')))
2663 sv = newSVpv(s--,0);
2664 (void)hv_store(hv, *env, s - *env, sv, 0);
2666 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2667 /* Sins of the RTL. See note in my_setenv(). */
2668 (void)putenv(savepv(*env));
2672 #ifdef DYNAMIC_ENV_FETCH
2673 HvNAME(hv) = savepv(ENV_HV_NAME);
2677 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2678 sv_setiv(GvSV(tmpgv), (IV)getpid());
2687 s = getenv("PERL5LIB");
2691 incpush(getenv("PERLLIB"), FALSE);
2693 /* Treat PERL5?LIB as a possible search list logical name -- the
2694 * "natural" VMS idiom for a Unix path string. We allow each
2695 * element to be a set of |-separated directories for compatibility.
2699 if (my_trnlnm("PERL5LIB",buf,0))
2700 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2702 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2706 /* Use the ~-expanded versions of APPLLIB (undocumented),
2707 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2710 incpush(APPLLIB_EXP, FALSE);
2714 incpush(ARCHLIB_EXP, FALSE);
2717 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2719 incpush(PRIVLIB_EXP, FALSE);
2722 incpush(SITEARCH_EXP, FALSE);
2725 incpush(SITELIB_EXP, FALSE);
2727 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2728 incpush(OLDARCHLIB_EXP, FALSE);
2732 incpush(".", FALSE);
2736 # define PERLLIB_SEP ';'
2739 # define PERLLIB_SEP '|'
2741 # define PERLLIB_SEP ':'
2744 #ifndef PERLLIB_MANGLE
2745 # define PERLLIB_MANGLE(s,n) (s)
2749 incpush(p, addsubdirs)
2753 SV *subdir = Nullsv;
2754 static char *archpat_auto;
2761 if (!archpat_auto) {
2762 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2763 + sizeof("//auto"));
2764 New(55, archpat_auto, len, char);
2765 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2767 for (len = sizeof(ARCHNAME) + 2;
2768 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2769 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2774 /* Break at all separators */
2776 SV *libdir = newSV(0);
2779 /* skip any consecutive separators */
2780 while ( *p == PERLLIB_SEP ) {
2781 /* Uncomment the next line for PATH semantics */
2782 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2786 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2787 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2792 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2793 p = Nullch; /* break out */
2797 * BEFORE pushing libdir onto @INC we may first push version- and
2798 * archname-specific sub-directories.
2801 struct stat tmpstatbuf;
2806 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2808 while (unix[len-1] == '/') len--; /* Cosmetic */
2809 sv_usepvn(libdir,unix,len);
2812 PerlIO_printf(PerlIO_stderr(),
2813 "Failed to unixify @INC element \"%s\"\n",
2816 /* .../archname/version if -d .../archname/version/auto */
2817 sv_setsv(subdir, libdir);
2818 sv_catpv(subdir, archpat_auto);
2819 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2820 S_ISDIR(tmpstatbuf.st_mode))
2821 av_push(GvAVn(incgv),
2822 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2824 /* .../archname if -d .../archname/auto */
2825 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2826 strlen(patchlevel) + 1, "", 0);
2827 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2828 S_ISDIR(tmpstatbuf.st_mode))
2829 av_push(GvAVn(incgv),
2830 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2833 /* finally push this lib directory on the end of @INC */
2834 av_push(GvAVn(incgv), libdir);
2837 SvREFCNT_dec(subdir);
2841 static struct thread *
2847 Newz(53, thr, 1, struct thread);
2848 curcop = &compiling;
2849 thr->cvcache = newHV();
2850 thr->magicals = newAV();
2851 thr->specific = newAV();
2852 thr->errhv = newHV();
2853 thr->flags = THRf_R_JOINABLE;
2854 MUTEX_INIT(&thr->mutex);
2855 /* Handcraft thrsv similarly to mess_sv */
2856 New(53, thrsv, 1, SV);
2857 Newz(53, xpv, 1, XPV);
2858 SvFLAGS(thrsv) = SVt_PV;
2859 SvANY(thrsv) = (void*)xpv;
2860 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2861 SvPVX(thrsv) = (char*)thr;
2862 SvCUR_set(thrsv, sizeof(thr));
2863 SvLEN_set(thrsv, sizeof(thr));
2864 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2866 curcop = &compiling;
2869 MUTEX_LOCK(&threads_mutex);
2874 MUTEX_UNLOCK(&threads_mutex);
2876 #ifdef HAVE_THREAD_INTERN
2877 init_thread_intern(thr);
2879 thr->self = pthread_self();
2880 #endif /* HAVE_THREAD_INTERN */
2884 * These must come after the SET_THR because sv_setpvn does
2885 * SvTAINT and the taint fields require dTHR.
2887 toptarget = NEWSV(0,0);
2888 sv_upgrade(toptarget, SVt_PVFM);
2889 sv_setpvn(toptarget, "", 0);
2890 bodytarget = NEWSV(0,0);
2891 sv_upgrade(bodytarget, SVt_PVFM);
2892 sv_setpvn(bodytarget, "", 0);
2893 formtarget = bodytarget;
2894 thr->errsv = newSVpv("", 0);
2897 #endif /* USE_THREADS */
2900 call_list(oldscope, list)
2905 line_t oldline = curcop->cop_line;
2910 while (AvFILL(list) >= 0) {
2911 CV *cv = (CV*)av_shift(list);
2920 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2921 (void)SvPV(atsv, len);
2924 curcop = &compiling;
2925 curcop->cop_line = oldline;
2926 if (list == beginav)
2927 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2929 sv_catpv(atsv, "END failed--cleanup aborted");
2930 while (scopestack_ix > oldscope)
2932 croak("%s", SvPVX(atsv));
2940 /* my_exit() was called */
2941 while (scopestack_ix > oldscope)
2944 curstash = defstash;
2946 call_list(oldscope, endav);
2948 curcop = &compiling;
2949 curcop->cop_line = oldline;
2951 if (list == beginav)
2952 croak("BEGIN failed--compilation aborted");
2954 croak("END failed--cleanup aborted");
2960 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2965 curcop = &compiling;
2966 curcop->cop_line = oldline;
2980 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2981 thr, (unsigned long) status));
2982 #endif /* USE_THREADS */
2991 STATUS_NATIVE_SET(status);
3001 if (vaxc$errno & 1) {
3002 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
3003 STATUS_NATIVE_SET(44);
3006 if (!vaxc$errno && errno) /* unlikely */
3007 STATUS_NATIVE_SET(44);
3009 STATUS_NATIVE_SET(vaxc$errno);
3013 STATUS_POSIX_SET(errno);
3014 else if (STATUS_POSIX == 0)
3015 STATUS_POSIX_SET(255);
3024 register CONTEXT *cx;
3033 (void)UNLINK(e_tmpname);
3034 Safefree(e_tmpname);
3038 if (cxstack_ix >= 0) {