3 * Copyright (c) 1987-1997 Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
16 #include "patchlevel.h"
18 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
23 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
24 char *getenv _((char *)); /* Usually in <stdlib.h> */
27 dEXTCONST char rcsid[] = "perl.c\nPatch level: ###\n";
35 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
45 curcop = &compiling; \
52 laststype = OP_STAT; \
54 maxsysfd = MAXSYSFD; \
61 laststype = OP_STAT; \
65 static void find_beginning _((void));
66 static void forbid_setid _((char *));
67 static void incpush _((char *, int));
68 static void init_ids _((void));
69 static void init_debugger _((void));
70 static void init_lexer _((void));
71 static void init_main_stash _((void));
72 static void init_perllib _((void));
73 static void init_postdump_symbols _((int, char **, char **));
74 static void init_predump_symbols _((void));
75 static void my_exit_jump _((void)) __attribute__((noreturn));
76 static void nuke_stacks _((void));
77 static void open_script _((char *, bool, SV *));
78 static void usage _((char *));
79 static void validate_suid _((char *, char*));
81 static int fdscript = -1;
83 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
84 #include <asm/sigcontext.h>
86 catch_sigsegv(int signo, struct sigcontext_struct sc)
88 signal(SIGSEGV, SIG_DFL);
89 fprintf(stderr, "Segmentation fault dereferencing 0x%lx\n"
90 "return_address = 0x%lx, eip = 0x%lx\n",
91 sc.cr2, __builtin_return_address(0), sc.eip);
92 fprintf(stderr, "thread = 0x%lx\n", (unsigned long)THR);
99 PerlInterpreter *sv_interp;
102 New(53, sv_interp, 1, PerlInterpreter);
107 perl_construct( sv_interp )
108 register PerlInterpreter *sv_interp;
110 #if defined(USE_THREADS) && !defined(FAKE_THREADS)
114 if (!(curinterp = sv_interp))
118 Zero(sv_interp, 1, PerlInterpreter);
121 /* Init the real globals (and main thread)? */
125 New(53, thr, 1, struct thread);
126 MUTEX_INIT(&malloc_mutex);
127 MUTEX_INIT(&sv_mutex);
128 MUTEX_INIT(&eval_mutex);
129 COND_INIT(&eval_cond);
130 MUTEX_INIT(&threads_mutex);
131 COND_INIT(&nthreads_cond);
135 thr->flags = THRf_R_JOINABLE;
136 MUTEX_INIT(&thr->mutex);
140 #ifdef HAVE_THREAD_INTERN
141 init_thread_intern(thr);
143 self = pthread_self();
144 if (pthread_key_create(&thr_key, 0))
145 croak("panic: pthread_key_create");
146 if (pthread_setspecific(thr_key, (void *) thr))
147 croak("panic: pthread_setspecific");
148 #endif /* FAKE_THREADS */
149 #endif /* USE_THREADS */
151 linestr = NEWSV(65,80);
152 sv_upgrade(linestr,SVt_PVIV);
154 if (!SvREADONLY(&sv_undef)) {
155 SvREADONLY_on(&sv_undef);
159 SvREADONLY_on(&sv_no);
161 sv_setpv(&sv_yes,Yes);
163 SvREADONLY_on(&sv_yes);
166 nrs = newSVpv("\n", 1);
167 rs = SvREFCNT_inc(nrs);
169 sighandlerp = sighandler;
174 * There is no way we can refer to them from Perl so close them to save
175 * space. The other alternative would be to provide STDAUX and STDPRN
178 (void)fclose(stdaux);
179 (void)fclose(stdprn);
185 perl_destruct_level = 1;
187 if(perl_destruct_level > 0)
192 lex_state = LEX_NOTPARSING;
194 start_env.je_prev = NULL;
195 start_env.je_ret = -1;
196 start_env.je_mustcatch = TRUE;
197 top_env = &start_env;
200 SET_NUMERIC_STANDARD();
201 #if defined(SUBVERSION) && SUBVERSION > 0
202 sprintf(patchlevel, "%7.5f", (double) 5
203 + ((double) PATCHLEVEL / (double) 1000)
204 + ((double) SUBVERSION / (double) 100000));
206 sprintf(patchlevel, "%5.3f", (double) 5 +
207 ((double) PATCHLEVEL / (double) 1000));
210 #if defined(LOCAL_PATCH_COUNT)
211 localpatches = local_patches; /* For possible -v */
214 PerlIO_init(); /* Hook to IO system */
216 fdpid = newAV(); /* for remembering popen pids by fd */
220 New(51,debname,128,char);
221 New(52,debdelim,128,char);
228 perl_destruct(sv_interp)
229 register PerlInterpreter *sv_interp;
232 int destruct_level; /* 0=none, 1=full, 2=full with checks */
237 #endif /* USE_THREADS */
239 if (!(curinterp = sv_interp))
244 /* Join with any remaining non-detached threads */
245 MUTEX_LOCK(&threads_mutex);
246 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
247 "perl_destruct: waiting for %d threads...\n",
249 for (t = thr->next; t != thr; t = t->next) {
250 MUTEX_LOCK(&t->mutex);
251 switch (ThrSTATE(t)) {
254 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
255 "perl_destruct: joining zombie %p\n", t));
256 ThrSETSTATE(t, THRf_DEAD);
257 MUTEX_UNLOCK(&t->mutex);
259 MUTEX_UNLOCK(&threads_mutex);
260 if (pthread_join(t->Tself, (void**)&av))
261 croak("panic: pthread_join failed during global destruction");
262 SvREFCNT_dec((SV*)av);
263 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
264 "perl_destruct: joined zombie %p OK\n", t));
266 case THRf_R_JOINABLE:
267 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
268 "perl_destruct: detaching thread %p\n", t));
269 ThrSETSTATE(t, THRf_R_DETACHED);
271 * We unlock threads_mutex and t->mutex in the opposite order
272 * from which we locked them just so that DETACH won't
273 * deadlock if it panics. It's only a breach of good style
274 * not a bug since they are unlocks not locks.
276 MUTEX_UNLOCK(&threads_mutex);
278 MUTEX_UNLOCK(&t->mutex);
281 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
282 "perl_destruct: ignoring %p (state %u)\n",
284 MUTEX_UNLOCK(&t->mutex);
285 MUTEX_UNLOCK(&threads_mutex);
286 /* fall through and out */
289 /* Now wait for the thread count nthreads to drop to one */
292 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
293 "perl_destruct: final wait for %d threads\n",
295 COND_WAIT(&nthreads_cond, &threads_mutex);
297 /* At this point, we're the last thread */
298 MUTEX_UNLOCK(&threads_mutex);
299 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
300 MUTEX_DESTROY(&threads_mutex);
301 COND_DESTROY(&nthreads_cond);
302 #endif /* !defined(FAKE_THREADS) */
303 #endif /* USE_THREADS */
305 destruct_level = perl_destruct_level;
309 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
311 if (destruct_level < i)
320 /* We must account for everything. */
322 /* Destroy the main CV and syntax tree */
324 curpad = AvARRAY(comppad);
329 SvREFCNT_dec(main_cv);
334 * Try to destruct global references. We do this first so that the
335 * destructors and destructees still exist. Some sv's might remain.
336 * Non-referenced objects are on their own.
343 /* unhook hooks which will soon be, or use, destroyed data */
344 SvREFCNT_dec(warnhook);
346 SvREFCNT_dec(diehook);
348 SvREFCNT_dec(parsehook);
351 if (destruct_level == 0){
353 DEBUG_P(debprofdump());
355 /* The exit() function will do everything that needs doing. */
359 /* loosen bonds of global variables */
362 (void)PerlIO_close(rsfp);
366 /* Filters for program text */
367 SvREFCNT_dec(rsfp_filters);
368 rsfp_filters = Nullav;
380 sawampersand = FALSE; /* must save all match strings */
381 sawstudy = FALSE; /* do fbm_instr on all strings */
396 /* magical thingies */
398 Safefree(ofs); /* $, */
401 Safefree(ors); /* $\ */
404 SvREFCNT_dec(nrs); /* $\ helper */
407 multiline = 0; /* $* */
409 SvREFCNT_dec(statname);
413 /* defgv, aka *_ should be taken care of elsewhere */
415 #if 0 /* just about all regexp stuff, seems to be ok */
417 /* shortcuts to regexp stuff */
422 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
424 regprecomp = NULL; /* uncompiled string. */
425 regparse = NULL; /* Input-scan pointer. */
426 regxend = NULL; /* End of input for compile */
427 regnpar = 0; /* () count. */
428 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
429 regsize = 0; /* Code size. */
430 regnaughty = 0; /* How bad is this pattern? */
431 regsawback = 0; /* Did we see \1, ...? */
433 reginput = NULL; /* String-input pointer. */
434 regbol = NULL; /* Beginning of input, for ^ check. */
435 regeol = NULL; /* End of input, for $ check. */
436 regstartp = (char **)NULL; /* Pointer to startp array. */
437 regendp = (char **)NULL; /* Ditto for endp. */
438 reglastparen = 0; /* Similarly for lastparen. */
439 regtill = NULL; /* How far we are required to go. */
440 regflags = 0; /* are we folding, multilining? */
441 regprev = (char)NULL; /* char before regbol, \n if none */
445 /* clean up after study() */
446 SvREFCNT_dec(lastscream);
448 Safefree(screamfirst);
450 Safefree(screamnext);
453 /* startup and shutdown function lists */
454 SvREFCNT_dec(beginav);
456 SvREFCNT_dec(initav);
461 /* temp stack during pp_sort() */
462 SvREFCNT_dec(sortstack);
465 /* shortcuts just get cleared */
475 /* reset so print() ends up where we expect */
478 /* Prepare to destruct main symbol table. */
485 if (destruct_level >= 2) {
486 if (scopestack_ix != 0)
487 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
488 (long)scopestack_ix);
489 if (savestack_ix != 0)
490 warn("Unbalanced saves: %ld more saves than restores\n",
492 if (tmps_floor != -1)
493 warn("Unbalanced tmps: %ld more allocs than frees\n",
494 (long)tmps_floor + 1);
495 if (cxstack_ix != -1)
496 warn("Unbalanced context: %ld more PUSHes than POPs\n",
497 (long)cxstack_ix + 1);
500 /* Now absolutely destruct everything, somehow or other, loops or no. */
502 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
503 while (sv_count != 0 && sv_count != last_sv_count) {
504 last_sv_count = sv_count;
507 SvFLAGS(strtab) &= ~SVTYPEMASK;
508 SvFLAGS(strtab) |= SVt_PVHV;
510 /* Destruct the global string table. */
512 /* Yell and reset the HeVAL() slots that are still holding refcounts,
513 * so that sv_free() won't fail on them.
522 array = HvARRAY(strtab);
526 warn("Unbalanced string table refcount: (%d) for \"%s\"",
527 HeVAL(hent) - Nullsv, HeKEY(hent));
528 HeVAL(hent) = Nullsv;
538 SvREFCNT_dec(strtab);
541 warn("Scalars leaked: %ld\n", (long)sv_count);
545 /* No SVs have survived, need to clean out */
549 Safefree(origfilename);
551 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
553 DEBUG_P(debprofdump());
555 MUTEX_DESTROY(&sv_mutex);
556 MUTEX_DESTROY(&malloc_mutex);
557 MUTEX_DESTROY(&eval_mutex);
558 COND_DESTROY(&eval_cond);
559 #endif /* USE_THREADS */
561 /* As the absolutely last thing, free the non-arena SV for mess() */
564 /* we know that type >= SVt_PV */
566 Safefree(SvPVX(mess_sv));
567 Safefree(SvANY(mess_sv));
575 PerlInterpreter *sv_interp;
577 if (!(curinterp = sv_interp))
583 perl_parse(sv_interp, xsinit, argc, argv, env)
584 PerlInterpreter *sv_interp;
585 void (*xsinit)_((void));
593 char *scriptname = NULL;
594 VOL bool dosearch = FALSE;
601 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
604 croak("suidperl is no longer needed since the kernel can now execute\n\
605 setuid perl scripts securely.\n");
609 if (!(curinterp = sv_interp))
612 #if defined(NeXT) && defined(__DYNAMIC__)
613 _dyld_lookup_and_bind
614 ("__environ", (unsigned long *) &environ_pointer, NULL);
619 #ifndef VMS /* VMS doesn't have environ array */
620 origenviron = environ;
626 /* Come here if running an undumped a.out. */
628 origfilename = savepv(argv[0]);
630 cxstack_ix = -1; /* start label stack again */
632 init_postdump_symbols(argc,argv,env);
637 curpad = AvARRAY(comppad);
642 SvREFCNT_dec(main_cv);
646 oldscope = scopestack_ix;
654 /* my_exit() was called */
655 while (scopestack_ix > oldscope)
660 call_list(oldscope, endav);
662 return STATUS_NATIVE_EXPORT;
665 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
669 sv_setpvn(linestr,"",0);
670 sv = newSVpv("",0); /* first used for -I flags */
674 for (argc--,argv++; argc > 0; argc--,argv++) {
675 if (argv[0][0] != '-' || !argv[0][1])
679 validarg = " PHOOEY ";
704 if (s = moreswitches(s))
714 if (euid != uid || egid != gid)
715 croak("No -e allowed in setuid scripts");
717 e_tmpname = savepv(TMPPATH);
718 (void)mktemp(e_tmpname);
720 croak("Can't mktemp()");
721 e_fp = PerlIO_open(e_tmpname,"w");
723 croak("Cannot open temporary file");
728 PerlIO_puts(e_fp,argv[1]);
732 croak("No code specified for -e");
733 (void)PerlIO_putc(e_fp,'\n');
735 case 'I': /* -I handled both here and in moreswitches() */
737 if (!*++s && (s=argv[1]) != Nullch) {
740 while (s && isSPACE(*s))
744 for (e = s; *e && !isSPACE(*e); e++) ;
751 } /* XXX else croak? */
765 preambleav = newAV();
766 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
768 Sv = newSVpv("print myconfig();",0);
770 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
772 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
774 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
775 sv_catpv(Sv,"\" Compile-time options:");
777 sv_catpv(Sv," DEBUGGING");
780 sv_catpv(Sv," NO_EMBED");
783 sv_catpv(Sv," MULTIPLICITY");
785 sv_catpv(Sv,"\\n\",");
787 #if defined(LOCAL_PATCH_COUNT)
788 if (LOCAL_PATCH_COUNT > 0) {
790 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
791 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
793 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
797 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
800 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
802 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
807 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
808 print \" \\%ENV:\\n @env\\n\" if @env; \
809 print \" \\@INC:\\n @INC\\n\";");
812 Sv = newSVpv("config_vars(qw(",0);
817 av_push(preambleav, Sv);
818 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
829 if (!*++s || isSPACE(*s)) {
833 /* catch use of gnu style long options */
834 if (strEQ(s, "version")) {
838 if (strEQ(s, "help")) {
845 croak("Unrecognized switch: -%s (-h will show valid options)",s);
850 if (!tainting && (s = getenv("PERL5OPT"))) {
861 if (!strchr("DIMUdmw", *s))
862 croak("Illegal switch in PERL5OPT: -%c", *s);
868 scriptname = argv[0];
870 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
872 warn("Did you forget to compile with -DMULTIPLICITY?");
874 croak("Can't write to temp file for -e: %s", Strerror(errno));
878 scriptname = e_tmpname;
880 else if (scriptname == Nullch) {
882 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
890 open_script(scriptname,dosearch,sv);
892 validate_suid(validarg, scriptname);
897 main_cv = compcv = (CV*)NEWSV(1104,0);
898 sv_upgrade((SV *)compcv, SVt_PVCV);
902 av_push(comppad, Nullsv);
903 curpad = AvARRAY(comppad);
904 comppad_name = newAV();
905 comppad_name_fill = 0;
906 min_intro_pending = 0;
909 av_store(comppad_name, 0, newSVpv("@_", 2));
910 curpad[0] = (SV*)newAV();
911 SvPADMY_on(curpad[0]); /* XXX Needed? */
913 New(666, CvMUTEXP(compcv), 1, perl_mutex);
914 MUTEX_INIT(CvMUTEXP(compcv));
915 #endif /* USE_THREADS */
917 comppadlist = newAV();
918 AvREAL_off(comppadlist);
919 av_store(comppadlist, 0, (SV*)comppad_name);
920 av_store(comppadlist, 1, (SV*)comppad);
921 CvPADLIST(compcv) = comppadlist;
923 boot_core_UNIVERSAL();
925 (*xsinit)(); /* in case linked C routines want magical variables */
926 #if defined(VMS) || defined(WIN32)
930 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
931 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
934 init_predump_symbols();
936 init_postdump_symbols(argc,argv,env);
940 /* now parse the script */
943 if (yyparse() || error_count) {
945 croak("%s had compilation errors.\n", origfilename);
947 croak("Execution of %s aborted due to compilation errors.\n",
951 curcop->cop_line = 0;
955 (void)UNLINK(e_tmpname);
960 /* now that script is parsed, we can modify record separator */
962 rs = SvREFCNT_inc(nrs);
963 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
975 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
976 dump_mstats("after compilation:");
987 PerlInterpreter *sv_interp;
994 if (!(curinterp = sv_interp))
997 oldscope = scopestack_ix;
1002 cxstack_ix = -1; /* start context stack again */
1005 /* my_exit() was called */
1006 while (scopestack_ix > oldscope)
1009 curstash = defstash;
1011 call_list(oldscope, endav);
1013 if (getenv("PERL_DEBUG_MSTATS"))
1014 dump_mstats("after execution: ");
1017 return STATUS_NATIVE_EXPORT;
1020 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1025 if (curstack != mainstack) {
1027 SWITCHSTACK(curstack, mainstack);
1032 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1033 sawampersand ? "Enabling" : "Omitting"));
1036 DEBUG_x(dump_all());
1037 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1039 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1040 (unsigned long) thr));
1041 #endif /* USE_THREADS */
1044 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1047 if (PERLDB_SINGLE && DBsingle)
1048 sv_setiv(DBsingle, 1);
1050 call_list(oldscope, initav);
1060 else if (main_start) {
1061 CvDEPTH(main_cv) = 1;
1072 perl_get_sv(name, create)
1076 GV* gv = gv_fetchpv(name, create, SVt_PV);
1083 perl_get_av(name, create)
1087 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1096 perl_get_hv(name, create)
1100 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1109 perl_get_cv(name, create)
1113 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1114 if (create && !GvCVu(gv))
1115 return newSUB(start_subparse(FALSE, 0),
1116 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1124 /* Be sure to refetch the stack pointer after calling these routines. */
1127 perl_call_argv(subname, flags, argv)
1129 I32 flags; /* See G_* flags in cop.h */
1130 register char **argv; /* null terminated arg list */
1138 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1143 return perl_call_pv(subname, flags);
1147 perl_call_pv(subname, flags)
1148 char *subname; /* name of the subroutine */
1149 I32 flags; /* See G_* flags in cop.h */
1151 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1155 perl_call_method(methname, flags)
1156 char *methname; /* name of the subroutine */
1157 I32 flags; /* See G_* flags in cop.h */
1164 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1167 return perl_call_sv(*stack_sp--, flags);
1170 /* May be called with any of a CV, a GV, or an SV containing the name. */
1172 perl_call_sv(sv, flags)
1174 I32 flags; /* See G_* flags in cop.h */
1177 LOGOP myop; /* fake syntax tree node */
1183 bool oldcatch = CATCH_GET;
1188 if (flags & G_DISCARD) {
1193 Zero(&myop, 1, LOGOP);
1194 myop.op_next = Nullop;
1195 if (!(flags & G_NOARGS))
1196 myop.op_flags |= OPf_STACKED;
1197 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1198 (flags & G_ARRAY) ? OPf_WANT_LIST :
1203 EXTEND(stack_sp, 1);
1206 oldscope = scopestack_ix;
1208 if (PERLDB_SUB && curstash != debstash
1209 /* Handle first BEGIN of -d. */
1210 && (DBcv || (DBcv = GvCV(DBsub)))
1211 /* Try harder, since this may have been a sighandler, thus
1212 * curstash may be meaningless. */
1213 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1214 op->op_private |= OPpENTERSUB_DB;
1216 if (flags & G_EVAL) {
1217 cLOGOP->op_other = op;
1219 /* we're trying to emulate pp_entertry() here */
1221 register CONTEXT *cx;
1222 I32 gimme = GIMME_V;
1227 push_return(op->op_next);
1228 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1230 eval_root = op; /* Only needed so that goto works right. */
1233 if (flags & G_KEEPERR)
1236 sv_setpv(GvSV(errgv),"");
1248 /* my_exit() was called */
1249 curstash = defstash;
1253 croak("Callback called exit");
1262 stack_sp = stack_base + oldmark;
1263 if (flags & G_ARRAY)
1267 *++stack_sp = &sv_undef;
1275 if (op == (OP*)&myop)
1276 op = pp_entersub(ARGS);
1279 retval = stack_sp - (stack_base + oldmark);
1280 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1281 sv_setpv(GvSV(errgv),"");
1284 if (flags & G_EVAL) {
1285 if (scopestack_ix > oldscope) {
1289 register CONTEXT *cx;
1301 CATCH_SET(oldcatch);
1303 if (flags & G_DISCARD) {
1304 stack_sp = stack_base + oldmark;
1313 /* Eval a string. The G_EVAL flag is always assumed. */
1316 perl_eval_sv(sv, flags)
1318 I32 flags; /* See G_* flags in cop.h */
1321 UNOP myop; /* fake syntax tree node */
1323 I32 oldmark = sp - stack_base;
1330 if (flags & G_DISCARD) {
1338 EXTEND(stack_sp, 1);
1340 oldscope = scopestack_ix;
1342 if (!(flags & G_NOARGS))
1343 myop.op_flags = OPf_STACKED;
1344 myop.op_next = Nullop;
1345 myop.op_type = OP_ENTEREVAL;
1346 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1347 (flags & G_ARRAY) ? OPf_WANT_LIST :
1349 if (flags & G_KEEPERR)
1350 myop.op_flags |= OPf_SPECIAL;
1360 /* my_exit() was called */
1361 curstash = defstash;
1365 croak("Callback called exit");
1374 stack_sp = stack_base + oldmark;
1375 if (flags & G_ARRAY)
1379 *++stack_sp = &sv_undef;
1384 if (op == (OP*)&myop)
1385 op = pp_entereval(ARGS);
1388 retval = stack_sp - (stack_base + oldmark);
1389 if (!(flags & G_KEEPERR))
1390 sv_setpv(GvSV(errgv),"");
1394 if (flags & G_DISCARD) {
1395 stack_sp = stack_base + oldmark;
1405 perl_eval_pv(p, croak_on_error)
1411 SV* sv = newSVpv(p, 0);
1414 perl_eval_sv(sv, G_SCALAR);
1421 if (croak_on_error && SvTRUE(GvSV(errgv)))
1422 croak(SvPVx(GvSV(errgv), na));
1427 /* Require a module. */
1433 SV* sv = sv_newmortal();
1434 sv_setpv(sv, "require '");
1437 perl_eval_sv(sv, G_DISCARD);
1441 magicname(sym,name,namlen)
1448 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1449 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1453 usage(name) /* XXX move this out into a module ? */
1456 /* This message really ought to be max 23 lines.
1457 * Removed -h because the user already knows that opton. Others? */
1459 static char *usage[] = {
1460 "-0[octal] specify record separator (\\0, if no argument)",
1461 "-a autosplit mode with -n or -p (splits $_ into @F)",
1462 "-c check syntax only (runs BEGIN and END blocks)",
1463 "-d[:debugger] run scripts under debugger",
1464 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1465 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1466 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1467 "-i[extension] edit <> files in place (make backup if extension supplied)",
1468 "-Idirectory specify @INC/#include directory (may be used more than once)",
1469 "-l[octal] enable line ending processing, specifies line terminator",
1470 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1471 "-n assume 'while (<>) { ... }' loop around your script",
1472 "-p assume loop like -n but print line also like sed",
1473 "-P run script through C preprocessor before compilation",
1474 "-s enable some switch parsing for switches after script name",
1475 "-S look for the script using PATH environment variable",
1476 "-T turn on tainting checks",
1477 "-u dump core after parsing script",
1478 "-U allow unsafe operations",
1479 "-v print version number and patchlevel of perl",
1480 "-V[:variable] print perl configuration information",
1481 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1482 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1488 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1490 printf("\n %s", *p++);
1493 /* This routine handles any switches that can be given during run */
1504 rschar = scan_oct(s, 4, &numlen);
1506 if (rschar & ~((U8)~0))
1508 else if (!rschar && numlen >= 2)
1509 nrs = newSVpv("", 0);
1512 nrs = newSVpv(&ch, 1);
1517 splitstr = savepv(s + 1);
1531 if (*s == ':' || *s == '=') {
1532 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1536 perldb = PERLDB_ALL;
1543 if (isALPHA(s[1])) {
1544 static char debopts[] = "psltocPmfrxuLHXD";
1547 for (s++; *s && (d = strchr(debopts,*s)); s++)
1548 debug |= 1 << (d - debopts);
1552 for (s++; isDIGIT(*s); s++) ;
1554 debug |= 0x80000000;
1556 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1557 for (s++; isALNUM(*s); s++) ;
1567 inplace = savepv(s+1);
1569 for (s = inplace; *s && !isSPACE(*s); s++) ;
1573 case 'I': /* -I handled both here and in parse_perl() */
1576 while (*s && isSPACE(*s))
1580 for (e = s; *e && !isSPACE(*e); e++) ;
1581 p = savepvn(s, e-s);
1587 croak("No space allowed after -I");
1597 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1606 ors = SvPV(nrs, orslen);
1607 ors = savepvn(ors, orslen);
1611 forbid_setid("-M"); /* XXX ? */
1614 forbid_setid("-m"); /* XXX ? */
1619 /* -M-foo == 'no foo' */
1620 if (*s == '-') { use = "no "; ++s; }
1621 sv = newSVpv(use,0);
1623 /* We allow -M'Module qw(Foo Bar)' */
1624 while(isALNUM(*s) || *s==':') ++s;
1626 sv_catpv(sv, start);
1627 if (*(start-1) == 'm') {
1629 croak("Can't use '%c' after -mname", *s);
1630 sv_catpv( sv, " ()");
1633 sv_catpvn(sv, start, s-start);
1634 sv_catpv(sv, " split(/,/,q{");
1639 if (preambleav == NULL)
1640 preambleav = newAV();
1641 av_push(preambleav, sv);
1644 croak("No space allowed after -%c", *(s-1));
1661 croak("Too late for \"-T\" option");
1673 #if defined(SUBVERSION) && SUBVERSION > 0
1674 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1675 PATCHLEVEL, SUBVERSION, ARCHNAME);
1677 printf("\nThis is perl, version %s built for %s",
1678 patchlevel, ARCHNAME);
1680 #if defined(LOCAL_PATCH_COUNT)
1681 if (LOCAL_PATCH_COUNT > 0)
1682 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1683 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1686 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1688 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1691 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1694 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1695 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1698 printf("atariST series port, ++jrb bammi@cadence.com\n");
1701 Perl may be copied only under the terms of either the Artistic License or the\n\
1702 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1710 if (s[1] == '-') /* Additional switches on #! line. */
1718 #ifdef ALTERNATE_SHEBANG
1719 case 'S': /* OS/2 needs -S on "extproc" line. */
1727 croak("Can't emulate -%.1s on #! line",s);
1732 /* compliments of Tom Christiansen */
1734 /* unexec() can be found in the Gnu emacs distribution */
1745 prog = newSVpv(BIN_EXP);
1746 sv_catpv(prog, "/perl");
1747 file = newSVpv(origfilename);
1748 sv_catpv(file, ".perldump");
1750 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1752 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1753 SvPVX(prog), SvPVX(file));
1757 # include <lib$routines.h>
1758 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1760 ABORT(); /* for use with undump */
1771 /* Note that strtab is a rather special HV. Assumptions are made
1772 about not iterating on it, and not adding tie magic to it.
1773 It is properly deallocated in perl_destruct() */
1775 HvSHAREKEYS_off(strtab); /* mandatory */
1776 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1777 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1779 curstash = defstash = newHV();
1780 curstname = newSVpv("main",4);
1781 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1782 SvREFCNT_dec(GvHV(gv));
1783 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1785 HvNAME(defstash) = savepv("main");
1786 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1788 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1789 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1791 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1792 sv_grow(GvSV(errgv), 240); /* Preallocate - for immediate signals. */
1793 sv_setpvn(GvSV(errgv), "", 0);
1794 curstash = defstash;
1795 compiling.cop_stash = defstash;
1796 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1797 /* We must init $/ before switches are processed. */
1798 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1801 #ifdef CAN_PROTOTYPE
1803 open_script(char *scriptname, bool dosearch, SV *sv)
1806 open_script(scriptname,dosearch,sv)
1813 char *xfound = Nullch;
1814 char *xfailed = Nullch;
1818 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1819 # define SEARCH_EXTS ".bat", ".cmd", NULL
1820 # define MAX_EXT_LEN 4
1823 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1824 # define MAX_EXT_LEN 4
1827 # define SEARCH_EXTS ".pl", ".com", NULL
1828 # define MAX_EXT_LEN 4
1830 /* additional extensions to try in each dir if scriptname not found */
1832 char *ext[] = { SEARCH_EXTS };
1833 int extidx = 0, i = 0;
1834 char *curext = Nullch;
1836 # define MAX_EXT_LEN 0
1840 * If dosearch is true and if scriptname does not contain path
1841 * delimiters, search the PATH for scriptname.
1843 * If SEARCH_EXTS is also defined, will look for each
1844 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1845 * while searching the PATH.
1847 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1848 * proceeds as follows:
1850 * + look for ./scriptname{,.foo,.bar}
1851 * + search the PATH for scriptname{,.foo,.bar}
1854 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1855 * this will not look in '.' if it's not in the PATH)
1860 int hasdir, idx = 0, deftypes = 1;
1863 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1864 /* The first time through, just add SEARCH_EXTS to whatever we
1865 * already have, so we can check for default file types. */
1867 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1873 if ((strlen(tokenbuf) + strlen(scriptname)
1874 + MAX_EXT_LEN) >= sizeof tokenbuf)
1875 continue; /* don't search dir with too-long name */
1876 strcat(tokenbuf, scriptname);
1880 if (strEQ(scriptname, "-"))
1882 if (dosearch) { /* Look in '.' first. */
1883 char *cur = scriptname;
1885 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1887 if (strEQ(ext[i++],curext)) {
1888 extidx = -1; /* already has an ext */
1893 DEBUG_p(PerlIO_printf(Perl_debug_log,
1894 "Looking for %s\n",cur));
1895 if (Stat(cur,&statbuf) >= 0) {
1903 if (cur == scriptname) {
1904 len = strlen(scriptname);
1905 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1907 cur = strcpy(tokenbuf, scriptname);
1909 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1910 && strcpy(tokenbuf+len, ext[extidx++]));
1915 if (dosearch && !strchr(scriptname, '/')
1917 && !strchr(scriptname, '\\')
1919 && (s = getenv("PATH"))) {
1922 bufend = s + strlen(s);
1923 while (s < bufend) {
1924 #if defined(atarist) || defined(DOSISH)
1929 && *s != ';'; len++, s++) {
1930 if (len < sizeof tokenbuf)
1933 if (len < sizeof tokenbuf)
1934 tokenbuf[len] = '\0';
1935 #else /* ! (atarist || DOSISH) */
1936 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1939 #endif /* ! (atarist || DOSISH) */
1942 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1943 continue; /* don't search dir with too-long name */
1945 #if defined(atarist) || defined(DOSISH)
1946 && tokenbuf[len - 1] != '/'
1947 && tokenbuf[len - 1] != '\\'
1950 tokenbuf[len++] = '/';
1951 if (len == 2 && tokenbuf[0] == '.')
1953 (void)strcpy(tokenbuf + len, scriptname);
1957 len = strlen(tokenbuf);
1958 if (extidx > 0) /* reset after previous loop */
1962 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1963 retval = Stat(tokenbuf,&statbuf);
1965 } while ( retval < 0 /* not there */
1966 && extidx>=0 && ext[extidx] /* try an extension? */
1967 && strcpy(tokenbuf+len, ext[extidx++])
1972 if (S_ISREG(statbuf.st_mode)
1973 && cando(S_IRUSR,TRUE,&statbuf)
1975 && cando(S_IXUSR,TRUE,&statbuf)
1979 xfound = tokenbuf; /* bingo! */
1983 xfailed = savepv(tokenbuf);
1986 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1988 seen_dot = 1; /* Disable message. */
1990 croak("Can't %s %s%s%s",
1991 (xfailed ? "execute" : "find"),
1992 (xfailed ? xfailed : scriptname),
1993 (xfailed ? "" : " on PATH"),
1994 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1997 scriptname = xfound;
2000 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2001 char *s = scriptname + 8;
2010 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2011 curcop->cop_filegv = gv_fetchfile(origfilename);
2012 if (strEQ(origfilename,"-"))
2014 if (fdscript >= 0) {
2015 rsfp = PerlIO_fdopen(fdscript,"r");
2016 #if defined(HAS_FCNTL) && defined(F_SETFD)
2018 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2021 else if (preprocess) {
2022 char *cpp_cfg = CPPSTDIN;
2023 SV *cpp = NEWSV(0,0);
2024 SV *cmd = NEWSV(0,0);
2026 if (strEQ(cpp_cfg, "cppstdin"))
2027 sv_catpvf(cpp, "%s/", BIN_EXP);
2028 sv_catpv(cpp, cpp_cfg);
2031 sv_catpv(sv,PRIVLIB_EXP);
2035 sed %s -e \"/^[^#]/b\" \
2036 -e \"/^#[ ]*include[ ]/b\" \
2037 -e \"/^#[ ]*define[ ]/b\" \
2038 -e \"/^#[ ]*if[ ]/b\" \
2039 -e \"/^#[ ]*ifdef[ ]/b\" \
2040 -e \"/^#[ ]*ifndef[ ]/b\" \
2041 -e \"/^#[ ]*else/b\" \
2042 -e \"/^#[ ]*elif[ ]/b\" \
2043 -e \"/^#[ ]*undef[ ]/b\" \
2044 -e \"/^#[ ]*endif/b\" \
2047 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2050 %s %s -e '/^[^#]/b' \
2051 -e '/^#[ ]*include[ ]/b' \
2052 -e '/^#[ ]*define[ ]/b' \
2053 -e '/^#[ ]*if[ ]/b' \
2054 -e '/^#[ ]*ifdef[ ]/b' \
2055 -e '/^#[ ]*ifndef[ ]/b' \
2056 -e '/^#[ ]*else/b' \
2057 -e '/^#[ ]*elif[ ]/b' \
2058 -e '/^#[ ]*undef[ ]/b' \
2059 -e '/^#[ ]*endif/b' \
2067 (doextract ? "-e '1,/^#/d\n'" : ""),
2069 scriptname, cpp, sv, CPPMINUS);
2071 #ifdef IAMSUID /* actually, this is caught earlier */
2072 if (euid != uid && !euid) { /* if running suidperl */
2074 (void)seteuid(uid); /* musn't stay setuid root */
2077 (void)setreuid((Uid_t)-1, uid);
2079 #ifdef HAS_SETRESUID
2080 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2086 if (geteuid() != uid)
2087 croak("Can't do seteuid!\n");
2089 #endif /* IAMSUID */
2090 rsfp = my_popen(SvPVX(cmd), "r");
2094 else if (!*scriptname) {
2095 forbid_setid("program input from stdin");
2096 rsfp = PerlIO_stdin();
2099 rsfp = PerlIO_open(scriptname,"r");
2100 #if defined(HAS_FCNTL) && defined(F_SETFD)
2102 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2110 #ifndef IAMSUID /* in case script is not readable before setuid */
2111 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2112 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2114 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2115 croak("Can't do setuid\n");
2119 croak("Can't open perl script \"%s\": %s\n",
2120 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2125 validate_suid(validarg, scriptname)
2131 /* do we need to emulate setuid on scripts? */
2133 /* This code is for those BSD systems that have setuid #! scripts disabled
2134 * in the kernel because of a security problem. Merely defining DOSUID
2135 * in perl will not fix that problem, but if you have disabled setuid
2136 * scripts in the kernel, this will attempt to emulate setuid and setgid
2137 * on scripts that have those now-otherwise-useless bits set. The setuid
2138 * root version must be called suidperl or sperlN.NNN. If regular perl
2139 * discovers that it has opened a setuid script, it calls suidperl with
2140 * the same argv that it had. If suidperl finds that the script it has
2141 * just opened is NOT setuid root, it sets the effective uid back to the
2142 * uid. We don't just make perl setuid root because that loses the
2143 * effective uid we had before invoking perl, if it was different from the
2146 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2147 * be defined in suidperl only. suidperl must be setuid root. The
2148 * Configure script will set this up for you if you want it.
2154 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2155 croak("Can't stat script \"%s\"",origfilename);
2156 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2160 #ifndef HAS_SETREUID
2161 /* On this access check to make sure the directories are readable,
2162 * there is actually a small window that the user could use to make
2163 * filename point to an accessible directory. So there is a faint
2164 * chance that someone could execute a setuid script down in a
2165 * non-accessible directory. I don't know what to do about that.
2166 * But I don't think it's too important. The manual lies when
2167 * it says access() is useful in setuid programs.
2169 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2170 croak("Permission denied");
2172 /* If we can swap euid and uid, then we can determine access rights
2173 * with a simple stat of the file, and then compare device and
2174 * inode to make sure we did stat() on the same file we opened.
2175 * Then we just have to make sure he or she can execute it.
2178 struct stat tmpstatbuf;
2182 setreuid(euid,uid) < 0
2185 setresuid(euid,uid,(Uid_t)-1) < 0
2188 || getuid() != euid || geteuid() != uid)
2189 croak("Can't swap uid and euid"); /* really paranoid */
2190 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2191 croak("Permission denied"); /* testing full pathname here */
2192 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2193 tmpstatbuf.st_ino != statbuf.st_ino) {
2194 (void)PerlIO_close(rsfp);
2195 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2197 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2198 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2199 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2200 (long)statbuf.st_dev, (long)statbuf.st_ino,
2201 SvPVX(GvSV(curcop->cop_filegv)),
2202 (long)statbuf.st_uid, (long)statbuf.st_gid);
2203 (void)my_pclose(rsfp);
2205 croak("Permission denied\n");
2209 setreuid(uid,euid) < 0
2211 # if defined(HAS_SETRESUID)
2212 setresuid(uid,euid,(Uid_t)-1) < 0
2215 || getuid() != uid || geteuid() != euid)
2216 croak("Can't reswap uid and euid");
2217 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2218 croak("Permission denied\n");
2220 #endif /* HAS_SETREUID */
2221 #endif /* IAMSUID */
2223 if (!S_ISREG(statbuf.st_mode))
2224 croak("Permission denied");
2225 if (statbuf.st_mode & S_IWOTH)
2226 croak("Setuid/gid script is writable by world");
2227 doswitches = FALSE; /* -s is insecure in suid */
2229 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2230 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2231 croak("No #! line");
2232 s = SvPV(linestr,na)+2;
2234 while (!isSPACE(*s)) s++;
2235 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2236 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2237 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2238 croak("Not a perl script");
2239 while (*s == ' ' || *s == '\t') s++;
2241 * #! arg must be what we saw above. They can invoke it by
2242 * mentioning suidperl explicitly, but they may not add any strange
2243 * arguments beyond what #! says if they do invoke suidperl that way.
2245 len = strlen(validarg);
2246 if (strEQ(validarg," PHOOEY ") ||
2247 strnNE(s,validarg,len) || !isSPACE(s[len]))
2248 croak("Args must match #! line");
2251 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2252 euid == statbuf.st_uid)
2254 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2255 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2256 #endif /* IAMSUID */
2258 if (euid) { /* oops, we're not the setuid root perl */
2259 (void)PerlIO_close(rsfp);
2262 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2264 croak("Can't do setuid\n");
2267 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2269 (void)setegid(statbuf.st_gid);
2272 (void)setregid((Gid_t)-1,statbuf.st_gid);
2274 #ifdef HAS_SETRESGID
2275 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2277 setgid(statbuf.st_gid);
2281 if (getegid() != statbuf.st_gid)
2282 croak("Can't do setegid!\n");
2284 if (statbuf.st_mode & S_ISUID) {
2285 if (statbuf.st_uid != euid)
2287 (void)seteuid(statbuf.st_uid); /* all that for this */
2290 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2292 #ifdef HAS_SETRESUID
2293 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2295 setuid(statbuf.st_uid);
2299 if (geteuid() != statbuf.st_uid)
2300 croak("Can't do seteuid!\n");
2302 else if (uid) { /* oops, mustn't run as root */
2304 (void)seteuid((Uid_t)uid);
2307 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2309 #ifdef HAS_SETRESUID
2310 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2316 if (geteuid() != uid)
2317 croak("Can't do seteuid!\n");
2320 if (!cando(S_IXUSR,TRUE,&statbuf))
2321 croak("Permission denied\n"); /* they can't do this */
2324 else if (preprocess)
2325 croak("-P not allowed for setuid/setgid script\n");
2326 else if (fdscript >= 0)
2327 croak("fd script not allowed in suidperl\n");
2329 croak("Script is not setuid/setgid in suidperl\n");
2331 /* We absolutely must clear out any saved ids here, so we */
2332 /* exec the real perl, substituting fd script for scriptname. */
2333 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2334 PerlIO_rewind(rsfp);
2335 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2336 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2337 if (!origargv[which])
2338 croak("Permission denied");
2339 origargv[which] = savepv(form("/dev/fd/%d/%s",
2340 PerlIO_fileno(rsfp), origargv[which]));
2341 #if defined(HAS_FCNTL) && defined(F_SETFD)
2342 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2344 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2345 croak("Can't do setuid\n");
2346 #endif /* IAMSUID */
2348 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2349 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2351 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2352 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2354 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2357 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2358 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2359 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2360 /* not set-id, must be wrapped */
2368 register char *s, *s2;
2370 /* skip forward in input to the real script? */
2374 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2375 croak("No Perl script found in input\n");
2376 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2377 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2379 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2381 while (*s == ' ' || *s == '\t') s++;
2383 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2384 if (strnEQ(s2-4,"perl",4))
2386 while (s = moreswitches(s)) ;
2388 if (cddir && chdir(cddir) < 0)
2389 croak("Can't chdir to %s",cddir);
2397 uid = (int)getuid();
2398 euid = (int)geteuid();
2399 gid = (int)getgid();
2400 egid = (int)getegid();
2405 tainting |= (uid && (euid != uid || egid != gid));
2413 croak("No %s allowed while running setuid", s);
2415 croak("No %s allowed while running setgid", s);
2422 curstash = debstash;
2423 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2425 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2426 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2427 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2428 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2429 sv_setiv(DBsingle, 0);
2430 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2431 sv_setiv(DBtrace, 0);
2432 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2433 sv_setiv(DBsignal, 0);
2434 curstash = defstash;
2442 mainstack = curstack; /* remember in case we switch stacks */
2443 AvREAL_off(curstack); /* not a real array */
2444 av_extend(curstack,127);
2446 stack_base = AvARRAY(curstack);
2447 stack_sp = stack_base;
2448 stack_max = stack_base + 127;
2450 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2451 New(50,cxstack,cxstack_max + 1,CONTEXT);
2454 New(50,tmps_stack,128,SV*);
2460 * The following stacks almost certainly should be per-interpreter,
2461 * but for now they're not. XXX
2465 markstack_ptr = markstack;
2467 New(54,markstack,64,I32);
2468 markstack_ptr = markstack;
2469 markstack_max = markstack + 64;
2475 New(54,scopestack,32,I32);
2477 scopestack_max = 32;
2483 New(54,savestack,128,ANY);
2485 savestack_max = 128;
2491 New(54,retstack,16,OP*);
2502 Safefree(tmps_stack);
2509 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2518 subname = newSVpv("main",4);
2522 init_predump_symbols()
2528 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2530 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2531 GvMULTI_on(stdingv);
2532 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2533 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2535 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2537 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2539 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2541 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2543 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2545 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2546 GvMULTI_on(othergv);
2547 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2548 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2550 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2552 statname = NEWSV(66,0); /* last filename we did stat on */
2555 osname = savepv(OSNAME);
2559 init_postdump_symbols(argc,argv,env)
2561 register char **argv;
2562 register char **env;
2568 argc--,argv++; /* skip name of script */
2570 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2573 if (argv[0][1] == '-') {
2577 if (s = strchr(argv[0], '=')) {
2579 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2582 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2585 toptarget = NEWSV(0,0);
2586 sv_upgrade(toptarget, SVt_PVFM);
2587 sv_setpvn(toptarget, "", 0);
2588 bodytarget = NEWSV(0,0);
2589 sv_upgrade(bodytarget, SVt_PVFM);
2590 sv_setpvn(bodytarget, "", 0);
2591 formtarget = bodytarget;
2594 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2595 sv_setpv(GvSV(tmpgv),origfilename);
2596 magicname("0", "0", 1);
2598 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2599 sv_setpv(GvSV(tmpgv),origargv[0]);
2600 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2602 (void)gv_AVadd(argvgv);
2603 av_clear(GvAVn(argvgv));
2604 for (; argc > 0; argc--,argv++) {
2605 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2608 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2612 hv_magic(hv, envgv, 'E');
2613 #ifndef VMS /* VMS doesn't have environ array */
2614 /* Note that if the supplied env parameter is actually a copy
2615 of the global environ then it may now point to free'd memory
2616 if the environment has been modified since. To avoid this
2617 problem we treat env==NULL as meaning 'use the default'
2622 environ[0] = Nullch;
2623 for (; *env; env++) {
2624 if (!(s = strchr(*env,'=')))
2630 sv = newSVpv(s--,0);
2631 (void)hv_store(hv, *env, s - *env, sv, 0);
2633 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2634 /* Sins of the RTL. See note in my_setenv(). */
2635 (void)putenv(savepv(*env));
2639 #ifdef DYNAMIC_ENV_FETCH
2640 HvNAME(hv) = savepv(ENV_HV_NAME);
2644 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2645 sv_setiv(GvSV(tmpgv), (IV)getpid());
2654 s = getenv("PERL5LIB");
2658 incpush(getenv("PERLLIB"), FALSE);
2660 /* Treat PERL5?LIB as a possible search list logical name -- the
2661 * "natural" VMS idiom for a Unix path string. We allow each
2662 * element to be a set of |-separated directories for compatibility.
2666 if (my_trnlnm("PERL5LIB",buf,0))
2667 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2669 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2673 /* Use the ~-expanded versions of APPLLIB (undocumented),
2674 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2677 incpush(APPLLIB_EXP, FALSE);
2681 incpush(ARCHLIB_EXP, FALSE);
2684 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2686 incpush(PRIVLIB_EXP, FALSE);
2689 incpush(SITEARCH_EXP, FALSE);
2692 incpush(SITELIB_EXP, FALSE);
2694 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2695 incpush(OLDARCHLIB_EXP, FALSE);
2699 incpush(".", FALSE);
2703 # define PERLLIB_SEP ';'
2706 # define PERLLIB_SEP '|'
2708 # define PERLLIB_SEP ':'
2711 #ifndef PERLLIB_MANGLE
2712 # define PERLLIB_MANGLE(s,n) (s)
2716 incpush(p, addsubdirs)
2720 SV *subdir = Nullsv;
2721 static char *archpat_auto;
2728 if (!archpat_auto) {
2729 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2730 + sizeof("//auto"));
2731 New(55, archpat_auto, len, char);
2732 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2734 for (len = sizeof(ARCHNAME) + 2;
2735 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2736 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2741 /* Break at all separators */
2743 SV *libdir = newSV(0);
2746 /* skip any consecutive separators */
2747 while ( *p == PERLLIB_SEP ) {
2748 /* Uncomment the next line for PATH semantics */
2749 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2753 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2754 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2759 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2760 p = Nullch; /* break out */
2764 * BEFORE pushing libdir onto @INC we may first push version- and
2765 * archname-specific sub-directories.
2768 struct stat tmpstatbuf;
2773 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2775 while (unix[len-1] == '/') len--; /* Cosmetic */
2776 sv_usepvn(libdir,unix,len);
2779 PerlIO_printf(PerlIO_stderr(),
2780 "Failed to unixify @INC element \"%s\"\n",
2783 /* .../archname/version if -d .../archname/version/auto */
2784 sv_setsv(subdir, libdir);
2785 sv_catpv(subdir, archpat_auto);
2786 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2787 S_ISDIR(tmpstatbuf.st_mode))
2788 av_push(GvAVn(incgv),
2789 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2791 /* .../archname if -d .../archname/auto */
2792 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2793 strlen(patchlevel) + 1, "", 0);
2794 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2795 S_ISDIR(tmpstatbuf.st_mode))
2796 av_push(GvAVn(incgv),
2797 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2800 /* finally push this lib directory on the end of @INC */
2801 av_push(GvAVn(incgv), libdir);
2804 SvREFCNT_dec(subdir);
2808 call_list(oldscope, list)
2813 line_t oldline = curcop->cop_line;
2818 while (AvFILL(list) >= 0) {
2819 CV *cv = (CV*)av_shift(list);
2826 SV* atsv = GvSV(errgv);
2828 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2829 (void)SvPV(atsv, len);
2832 curcop = &compiling;
2833 curcop->cop_line = oldline;
2834 if (list == beginav)
2835 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2837 sv_catpv(atsv, "END failed--cleanup aborted");
2838 while (scopestack_ix > oldscope)
2840 croak("%s", SvPVX(atsv));
2848 /* my_exit() was called */
2849 while (scopestack_ix > oldscope)
2852 curstash = defstash;
2854 call_list(oldscope, endav);
2856 curcop = &compiling;
2857 curcop->cop_line = oldline;
2859 if (list == beginav)
2860 croak("BEGIN failed--compilation aborted");
2862 croak("END failed--cleanup aborted");
2868 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2873 curcop = &compiling;
2874 curcop->cop_line = oldline;
2888 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread 0x%lx, status %lu\n",
2889 (unsigned long) thr, (unsigned long) status));
2890 #endif /* USE_THREADS */
2899 STATUS_NATIVE_SET(status);
2909 if (vaxc$errno & 1) {
2910 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2911 STATUS_NATIVE_SET(44);
2914 if (!vaxc$errno && errno) /* unlikely */
2915 STATUS_NATIVE_SET(44);
2917 STATUS_NATIVE_SET(vaxc$errno);
2921 STATUS_POSIX_SET(errno);
2922 else if (STATUS_POSIX == 0)
2923 STATUS_POSIX_SET(255);
2932 register CONTEXT *cx;
2941 (void)UNLINK(e_tmpname);
2942 Safefree(e_tmpname);
2946 if (cxstack_ix >= 0) {