3 * Copyright (c) 1987-1998 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 perl_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;
89 PerlInterpreter *sv_interp;
92 New(53, sv_interp, 1, PerlInterpreter);
97 perl_construct(register PerlInterpreter *sv_interp)
102 struct perl_thread *thr;
103 #endif /* FAKE_THREADS */
104 #endif /* USE_THREADS */
106 if (!(curinterp = sv_interp))
110 Zero(sv_interp, 1, PerlInterpreter);
113 /* Init the real globals (and main thread)? */
118 #ifdef ALLOC_THREAD_KEY
121 if (pthread_key_create(&thr_key, 0))
122 croak("panic: pthread_key_create");
124 MUTEX_INIT(&sv_mutex);
126 * Safe to use basic SV functions from now on (though
127 * not things like mortals or tainting yet).
129 MUTEX_INIT(&eval_mutex);
130 COND_INIT(&eval_cond);
131 MUTEX_INIT(&threads_mutex);
132 COND_INIT(&nthreads_cond);
133 #ifdef EMULATE_ATOMIC_REFCOUNTS
134 MUTEX_INIT(&svref_mutex);
135 #endif /* EMULATE_ATOMIC_REFCOUNTS */
137 thr = init_main_thread();
138 #endif /* USE_THREADS */
140 linestr = NEWSV(65,80);
141 sv_upgrade(linestr,SVt_PVIV);
143 if (!SvREADONLY(&sv_undef)) {
144 SvREADONLY_on(&sv_undef);
148 SvREADONLY_on(&sv_no);
150 sv_setpv(&sv_yes,Yes);
152 SvREADONLY_on(&sv_yes);
155 nrs = newSVpv("\n", 1);
156 rs = SvREFCNT_inc(nrs);
158 sighandlerp = sighandler;
163 * There is no way we can refer to them from Perl so close them to save
164 * space. The other alternative would be to provide STDAUX and STDPRN
167 (void)fclose(stdaux);
168 (void)fclose(stdprn);
174 perl_destruct_level = 1;
176 if(perl_destruct_level > 0)
181 lex_state = LEX_NOTPARSING;
183 start_env.je_prev = NULL;
184 start_env.je_ret = -1;
185 start_env.je_mustcatch = TRUE;
186 top_env = &start_env;
189 SET_NUMERIC_STANDARD();
190 #if defined(SUBVERSION) && SUBVERSION > 0
191 sprintf(patchlevel, "%7.5f", (double) 5
192 + ((double) PATCHLEVEL / (double) 1000)
193 + ((double) SUBVERSION / (double) 100000));
195 sprintf(patchlevel, "%5.3f", (double) 5 +
196 ((double) PATCHLEVEL / (double) 1000));
199 #if defined(LOCAL_PATCH_COUNT)
200 localpatches = local_patches; /* For possible -v */
203 PerlIO_init(); /* Hook to IO system */
205 fdpid = newAV(); /* for remembering popen pids by fd */
209 New(51,debname,128,char);
210 New(52,debdelim,128,char);
217 perl_destruct(register PerlInterpreter *sv_interp)
220 int destruct_level; /* 0=none, 1=full, 2=full with checks */
225 #endif /* USE_THREADS */
227 if (!(curinterp = sv_interp))
232 /* Pass 1 on any remaining threads: detach joinables, join zombies */
234 MUTEX_LOCK(&threads_mutex);
235 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
236 "perl_destruct: waiting for %d threads...\n",
238 for (t = thr->next; t != thr; t = t->next) {
239 MUTEX_LOCK(&t->mutex);
240 switch (ThrSTATE(t)) {
243 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
244 "perl_destruct: joining zombie %p\n", t));
245 ThrSETSTATE(t, THRf_DEAD);
246 MUTEX_UNLOCK(&t->mutex);
249 * The SvREFCNT_dec below may take a long time (e.g. av
250 * may contain an object scalar whose destructor gets
251 * called) so we have to unlock threads_mutex and start
254 MUTEX_UNLOCK(&threads_mutex);
256 SvREFCNT_dec((SV*)av);
257 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
258 "perl_destruct: joined zombie %p OK\n", t));
260 case THRf_R_JOINABLE:
261 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
262 "perl_destruct: detaching thread %p\n", t));
263 ThrSETSTATE(t, THRf_R_DETACHED);
265 * We unlock threads_mutex and t->mutex in the opposite order
266 * from which we locked them just so that DETACH won't
267 * deadlock if it panics. It's only a breach of good style
268 * not a bug since they are unlocks not locks.
270 MUTEX_UNLOCK(&threads_mutex);
272 MUTEX_UNLOCK(&t->mutex);
275 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
276 "perl_destruct: ignoring %p (state %u)\n",
278 MUTEX_UNLOCK(&t->mutex);
279 /* fall through and out */
282 /* We leave the above "Pass 1" loop with threads_mutex still locked */
284 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
287 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
288 "perl_destruct: final wait for %d threads\n",
290 COND_WAIT(&nthreads_cond, &threads_mutex);
292 /* At this point, we're the last thread */
293 MUTEX_UNLOCK(&threads_mutex);
294 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
295 MUTEX_DESTROY(&threads_mutex);
296 COND_DESTROY(&nthreads_cond);
297 #endif /* !defined(FAKE_THREADS) */
298 #endif /* USE_THREADS */
300 destruct_level = perl_destruct_level;
304 if (s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL")) {
306 if (destruct_level < i)
315 /* We must account for everything. */
317 /* Destroy the main CV and syntax tree */
319 curpad = AvARRAY(comppad);
324 SvREFCNT_dec(main_cv);
329 * Try to destruct global references. We do this first so that the
330 * destructors and destructees still exist. Some sv's might remain.
331 * Non-referenced objects are on their own.
338 /* unhook hooks which will soon be, or use, destroyed data */
339 SvREFCNT_dec(warnhook);
341 SvREFCNT_dec(diehook);
343 SvREFCNT_dec(parsehook);
346 if (destruct_level == 0){
348 DEBUG_P(debprofdump());
350 /* The exit() function will do everything that needs doing. */
354 /* loosen bonds of global variables */
357 (void)PerlIO_close(rsfp);
361 /* Filters for program text */
362 SvREFCNT_dec(rsfp_filters);
363 rsfp_filters = Nullav;
375 sawampersand = FALSE; /* must save all match strings */
376 sawstudy = FALSE; /* do fbm_instr on all strings */
391 /* magical thingies */
393 Safefree(ofs); /* $, */
396 Safefree(ors); /* $\ */
399 SvREFCNT_dec(nrs); /* $\ helper */
402 multiline = 0; /* $* */
404 SvREFCNT_dec(statname);
408 /* defgv, aka *_ should be taken care of elsewhere */
410 /* clean up after study() */
411 SvREFCNT_dec(lastscream);
413 Safefree(screamfirst);
415 Safefree(screamnext);
418 /* startup and shutdown function lists */
419 SvREFCNT_dec(beginav);
421 SvREFCNT_dec(initav);
426 /* temp stack during pp_sort() */
427 SvREFCNT_dec(sortstack);
430 /* shortcuts just get cleared */
440 /* reset so print() ends up where we expect */
443 /* Prepare to destruct main symbol table. */
450 if (destruct_level >= 2) {
451 if (scopestack_ix != 0)
452 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
453 (long)scopestack_ix);
454 if (savestack_ix != 0)
455 warn("Unbalanced saves: %ld more saves than restores\n",
457 if (tmps_floor != -1)
458 warn("Unbalanced tmps: %ld more allocs than frees\n",
459 (long)tmps_floor + 1);
460 if (cxstack_ix != -1)
461 warn("Unbalanced context: %ld more PUSHes than POPs\n",
462 (long)cxstack_ix + 1);
465 /* Now absolutely destruct everything, somehow or other, loops or no. */
467 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
468 while (sv_count != 0 && sv_count != last_sv_count) {
469 last_sv_count = sv_count;
472 SvFLAGS(strtab) &= ~SVTYPEMASK;
473 SvFLAGS(strtab) |= SVt_PVHV;
475 /* Destruct the global string table. */
477 /* Yell and reset the HeVAL() slots that are still holding refcounts,
478 * so that sv_free() won't fail on them.
487 array = HvARRAY(strtab);
491 warn("Unbalanced string table refcount: (%d) for \"%s\"",
492 HeVAL(hent) - Nullsv, HeKEY(hent));
493 HeVAL(hent) = Nullsv;
503 SvREFCNT_dec(strtab);
506 warn("Scalars leaked: %ld\n", (long)sv_count);
510 /* No SVs have survived, need to clean out */
514 Safefree(origfilename);
516 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
518 DEBUG_P(debprofdump());
520 MUTEX_DESTROY(&sv_mutex);
521 MUTEX_DESTROY(&eval_mutex);
522 COND_DESTROY(&eval_cond);
524 /* As the penultimate thing, free the non-arena SV for thrsv */
525 Safefree(SvPVX(thrsv));
526 Safefree(SvANY(thrsv));
529 #endif /* USE_THREADS */
531 /* As the absolutely last thing, free the non-arena SV for mess() */
534 /* we know that type >= SVt_PV */
536 Safefree(SvPVX(mess_sv));
537 Safefree(SvANY(mess_sv));
544 perl_free(PerlInterpreter *sv_interp)
546 if (!(curinterp = sv_interp))
552 perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
557 char *scriptname = NULL;
558 VOL bool dosearch = FALSE;
565 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
568 croak("suidperl is no longer needed since the kernel can now execute\n\
569 setuid perl scripts securely.\n");
573 if (!(curinterp = sv_interp))
576 #if defined(NeXT) && defined(__DYNAMIC__)
577 _dyld_lookup_and_bind
578 ("__environ", (unsigned long *) &environ_pointer, NULL);
583 #ifndef VMS /* VMS doesn't have environ array */
584 origenviron = environ;
590 /* Come here if running an undumped a.out. */
592 origfilename = savepv(argv[0]);
594 cxstack_ix = -1; /* start label stack again */
596 init_postdump_symbols(argc,argv,env);
601 curpad = AvARRAY(comppad);
606 SvREFCNT_dec(main_cv);
610 oldscope = scopestack_ix;
618 /* my_exit() was called */
619 while (scopestack_ix > oldscope)
624 call_list(oldscope, endav);
626 return STATUS_NATIVE_EXPORT;
629 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
633 sv_setpvn(linestr,"",0);
634 sv = newSVpv("",0); /* first used for -I flags */
638 for (argc--,argv++; argc > 0; argc--,argv++) {
639 if (argv[0][0] != '-' || !argv[0][1])
643 validarg = " PHOOEY ";
668 if (s = moreswitches(s))
678 if (euid != uid || egid != gid)
679 croak("No -e allowed in setuid scripts");
681 e_tmpname = savepv(TMPPATH);
682 (void)PerlLIO_mktemp(e_tmpname);
684 croak("Can't mktemp()");
685 e_fp = PerlIO_open(e_tmpname,"w");
687 croak("Cannot open temporary file");
692 PerlIO_puts(e_fp,argv[1]);
696 croak("No code specified for -e");
697 (void)PerlIO_putc(e_fp,'\n');
699 case 'I': /* -I handled both here and in moreswitches() */
701 if (!*++s && (s=argv[1]) != Nullch) {
704 while (s && isSPACE(*s))
708 for (e = s; *e && !isSPACE(*e); e++) ;
715 } /* XXX else croak? */
729 preambleav = newAV();
730 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
732 Sv = newSVpv("print myconfig();",0);
734 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
736 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
738 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
739 sv_catpv(Sv,"\" Compile-time options:");
741 sv_catpv(Sv," DEBUGGING");
744 sv_catpv(Sv," NO_EMBED");
747 sv_catpv(Sv," MULTIPLICITY");
749 sv_catpv(Sv,"\\n\",");
751 #if defined(LOCAL_PATCH_COUNT)
752 if (LOCAL_PATCH_COUNT > 0) {
754 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
755 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
757 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
761 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
764 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
766 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
771 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
772 print \" \\%ENV:\\n @env\\n\" if @env; \
773 print \" \\@INC:\\n @INC\\n\";");
776 Sv = newSVpv("config_vars(qw(",0);
781 av_push(preambleav, Sv);
782 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
793 if (!*++s || isSPACE(*s)) {
797 /* catch use of gnu style long options */
798 if (strEQ(s, "version")) {
802 if (strEQ(s, "help")) {
809 croak("Unrecognized switch: -%s (-h will show valid options)",s);
814 if (!tainting && (s = PerlEnv_getenv("PERL5OPT"))) {
825 if (!strchr("DIMUdmw", *s))
826 croak("Illegal switch in PERL5OPT: -%c", *s);
832 scriptname = argv[0];
834 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
836 warn("Did you forget to compile with -DMULTIPLICITY?");
838 croak("Can't write to temp file for -e: %s", Strerror(errno));
842 scriptname = e_tmpname;
844 else if (scriptname == Nullch) {
846 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
854 open_script(scriptname,dosearch,sv);
856 validate_suid(validarg, scriptname);
861 main_cv = compcv = (CV*)NEWSV(1104,0);
862 sv_upgrade((SV *)compcv, SVt_PVCV);
866 av_push(comppad, Nullsv);
867 curpad = AvARRAY(comppad);
868 comppad_name = newAV();
869 comppad_name_fill = 0;
870 min_intro_pending = 0;
873 av_store(comppad_name, 0, newSVpv("@_", 2));
874 curpad[0] = (SV*)newAV();
875 SvPADMY_on(curpad[0]); /* XXX Needed? */
877 New(666, CvMUTEXP(compcv), 1, perl_mutex);
878 MUTEX_INIT(CvMUTEXP(compcv));
879 #endif /* USE_THREADS */
881 comppadlist = newAV();
882 AvREAL_off(comppadlist);
883 av_store(comppadlist, 0, (SV*)comppad_name);
884 av_store(comppadlist, 1, (SV*)comppad);
885 CvPADLIST(compcv) = comppadlist;
887 boot_core_UNIVERSAL();
889 (*xsinit)(); /* in case linked C routines want magical variables */
890 #if defined(VMS) || defined(WIN32) || defined(DJGPP)
894 init_predump_symbols();
896 init_postdump_symbols(argc,argv,env);
900 /* now parse the script */
902 SETERRNO(0,SS$_NORMAL);
904 if (yyparse() || error_count) {
906 croak("%s had compilation errors.\n", origfilename);
908 croak("Execution of %s aborted due to compilation errors.\n",
912 curcop->cop_line = 0;
916 (void)UNLINK(e_tmpname);
921 /* now that script is parsed, we can modify record separator */
923 rs = SvREFCNT_inc(nrs);
924 sv_setsv(perl_get_sv("/", TRUE), rs);
935 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
936 dump_mstats("after compilation:");
946 perl_run(PerlInterpreter *sv_interp)
953 if (!(curinterp = sv_interp))
956 oldscope = scopestack_ix;
961 cxstack_ix = -1; /* start context stack again */
964 /* my_exit() was called */
965 while (scopestack_ix > oldscope)
970 call_list(oldscope, endav);
972 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
973 dump_mstats("after execution: ");
976 return STATUS_NATIVE_EXPORT;
979 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
984 if (curstack != mainstack) {
986 SWITCHSTACK(curstack, mainstack);
991 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
992 sawampersand ? "Enabling" : "Omitting"));
996 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
998 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
999 (unsigned long) thr));
1000 #endif /* USE_THREADS */
1003 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1006 if (PERLDB_SINGLE && DBsingle)
1007 sv_setiv(DBsingle, 1);
1009 call_list(oldscope, initav);
1019 else if (main_start) {
1020 CvDEPTH(main_cv) = 1;
1031 perl_get_sv(char *name, I32 create)
1035 if (name[1] == '\0' && !isALPHA(name[0])) {
1036 PADOFFSET tmp = find_threadsv(name);
1037 if (tmp != NOT_IN_PAD) {
1039 return THREADSV(tmp);
1042 #endif /* USE_THREADS */
1043 gv = gv_fetchpv(name, create, SVt_PV);
1050 perl_get_av(char *name, I32 create)
1052 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1061 perl_get_hv(char *name, I32 create)
1063 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1072 perl_get_cv(char *name, I32 create)
1074 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1075 if (create && !GvCVu(gv))
1076 return newSUB(start_subparse(FALSE, 0),
1077 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1085 /* Be sure to refetch the stack pointer after calling these routines. */
1088 perl_call_argv(char *sub_name, I32 flags, register char **argv)
1090 /* See G_* flags in cop.h */
1091 /* null terminated arg list */
1098 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1103 return perl_call_pv(sub_name, flags);
1107 perl_call_pv(char *sub_name, I32 flags)
1108 /* name of the subroutine */
1109 /* See G_* flags in cop.h */
1111 return perl_call_sv((SV*)perl_get_cv(sub_name, TRUE), flags);
1115 perl_call_method(char *methname, I32 flags)
1116 /* name of the subroutine */
1117 /* See G_* flags in cop.h */
1123 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1126 return perl_call_sv(*stack_sp--, flags);
1129 /* May be called with any of a CV, a GV, or an SV containing the name. */
1131 perl_call_sv(SV *sv, I32 flags)
1133 /* See G_* flags in cop.h */
1136 LOGOP myop; /* fake syntax tree node */
1141 bool oldcatch = CATCH_GET;
1146 if (flags & G_DISCARD) {
1151 Zero(&myop, 1, LOGOP);
1152 myop.op_next = Nullop;
1153 if (!(flags & G_NOARGS))
1154 myop.op_flags |= OPf_STACKED;
1155 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1156 (flags & G_ARRAY) ? OPf_WANT_LIST :
1161 EXTEND(stack_sp, 1);
1164 oldscope = scopestack_ix;
1166 if (PERLDB_SUB && curstash != debstash
1167 /* Handle first BEGIN of -d. */
1168 && (DBcv || (DBcv = GvCV(DBsub)))
1169 /* Try harder, since this may have been a sighandler, thus
1170 * curstash may be meaningless. */
1171 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1172 op->op_private |= OPpENTERSUB_DB;
1174 if (flags & G_EVAL) {
1175 cLOGOP->op_other = op;
1177 /* we're trying to emulate pp_entertry() here */
1179 register PERL_CONTEXT *cx;
1180 I32 gimme = GIMME_V;
1185 push_return(op->op_next);
1186 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1188 eval_root = op; /* Only needed so that goto works right. */
1191 if (flags & G_KEEPERR)
1206 /* my_exit() was called */
1207 curstash = defstash;
1211 croak("Callback called exit");
1220 stack_sp = stack_base + oldmark;
1221 if (flags & G_ARRAY)
1225 *++stack_sp = &sv_undef;
1233 if (op == (OP*)&myop)
1234 op = pp_entersub(ARGS);
1237 retval = stack_sp - (stack_base + oldmark);
1238 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1242 if (flags & G_EVAL) {
1243 if (scopestack_ix > oldscope) {
1247 register PERL_CONTEXT *cx;
1259 CATCH_SET(oldcatch);
1261 if (flags & G_DISCARD) {
1262 stack_sp = stack_base + oldmark;
1271 /* Eval a string. The G_EVAL flag is always assumed. */
1274 perl_eval_sv(SV *sv, I32 flags)
1276 /* See G_* flags in cop.h */
1279 UNOP myop; /* fake syntax tree node */
1280 I32 oldmark = SP - stack_base;
1287 if (flags & G_DISCARD) {
1295 EXTEND(stack_sp, 1);
1297 oldscope = scopestack_ix;
1299 if (!(flags & G_NOARGS))
1300 myop.op_flags = OPf_STACKED;
1301 myop.op_next = Nullop;
1302 myop.op_type = OP_ENTEREVAL;
1303 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1304 (flags & G_ARRAY) ? OPf_WANT_LIST :
1306 if (flags & G_KEEPERR)
1307 myop.op_flags |= OPf_SPECIAL;
1317 /* my_exit() was called */
1318 curstash = defstash;
1322 croak("Callback called exit");
1331 stack_sp = stack_base + oldmark;
1332 if (flags & G_ARRAY)
1336 *++stack_sp = &sv_undef;
1341 if (op == (OP*)&myop)
1342 op = pp_entereval(ARGS);
1345 retval = stack_sp - (stack_base + oldmark);
1346 if (!(flags & G_KEEPERR))
1351 if (flags & G_DISCARD) {
1352 stack_sp = stack_base + oldmark;
1362 perl_eval_pv(char *p, I32 croak_on_error)
1365 SV* sv = newSVpv(p, 0);
1368 perl_eval_sv(sv, G_SCALAR);
1375 if (croak_on_error && SvTRUE(ERRSV))
1376 croak(SvPVx(ERRSV, na));
1381 /* Require a module. */
1384 perl_require_pv(char *pv)
1386 SV* sv = sv_newmortal();
1387 sv_setpv(sv, "require '");
1390 perl_eval_sv(sv, G_DISCARD);
1394 magicname(char *sym, char *name, I32 namlen)
1398 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1399 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1403 usage(char *name) /* XXX move this out into a module ? */
1406 /* This message really ought to be max 23 lines.
1407 * Removed -h because the user already knows that opton. Others? */
1409 static char *usage[] = {
1410 "-0[octal] specify record separator (\\0, if no argument)",
1411 "-a autosplit mode with -n or -p (splits $_ into @F)",
1412 "-c check syntax only (runs BEGIN and END blocks)",
1413 "-d[:debugger] run scripts under debugger",
1414 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1415 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1416 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1417 "-i[extension] edit <> files in place (make backup if extension supplied)",
1418 "-Idirectory specify @INC/#include directory (may be used more than once)",
1419 "-l[octal] enable line ending processing, specifies line terminator",
1420 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1421 "-n assume 'while (<>) { ... }' loop around your script",
1422 "-p assume loop like -n but print line also like sed",
1423 "-P run script through C preprocessor before compilation",
1424 "-s enable some switch parsing for switches after script name",
1425 "-S look for the script using PATH environment variable",
1426 "-T turn on tainting checks",
1427 "-u dump core after parsing script",
1428 "-U allow unsafe operations",
1429 "-v print version number and patchlevel of perl",
1430 "-V[:variable] print perl configuration information",
1431 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1432 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1438 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1440 printf("\n %s", *p++);
1443 /* This routine handles any switches that can be given during run */
1446 moreswitches(char *s)
1455 rschar = scan_oct(s, 4, &numlen);
1457 if (rschar & ~((U8)~0))
1459 else if (!rschar && numlen >= 2)
1460 nrs = newSVpv("", 0);
1463 nrs = newSVpv(&ch, 1);
1469 splitstr = savepv(s + 1);
1483 if (*s == ':' || *s == '=') {
1484 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1488 perldb = PERLDB_ALL;
1495 if (isALPHA(s[1])) {
1496 static char debopts[] = "psltocPmfrxuLHXD";
1499 for (s++; *s && (d = strchr(debopts,*s)); s++)
1500 debug |= 1 << (d - debopts);
1504 for (s++; isDIGIT(*s); s++) ;
1506 debug |= 0x80000000;
1508 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1509 for (s++; isALNUM(*s); s++) ;
1519 inplace = savepv(s+1);
1521 for (s = inplace; *s && !isSPACE(*s); s++) ;
1525 case 'I': /* -I handled both here and in parse_perl() */
1528 while (*s && isSPACE(*s))
1532 for (e = s; *e && !isSPACE(*e); e++) ;
1533 p = savepvn(s, e-s);
1539 croak("No space allowed after -I");
1549 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1559 ors = SvPV(nrs, orslen);
1560 ors = savepvn(ors, orslen);
1564 forbid_setid("-M"); /* XXX ? */
1567 forbid_setid("-m"); /* XXX ? */
1572 /* -M-foo == 'no foo' */
1573 if (*s == '-') { use = "no "; ++s; }
1574 sv = newSVpv(use,0);
1576 /* We allow -M'Module qw(Foo Bar)' */
1577 while(isALNUM(*s) || *s==':') ++s;
1579 sv_catpv(sv, start);
1580 if (*(start-1) == 'm') {
1582 croak("Can't use '%c' after -mname", *s);
1583 sv_catpv( sv, " ()");
1586 sv_catpvn(sv, start, s-start);
1587 sv_catpv(sv, " split(/,/,q{");
1592 if (preambleav == NULL)
1593 preambleav = newAV();
1594 av_push(preambleav, sv);
1597 croak("No space allowed after -%c", *(s-1));
1614 croak("Too late for \"-T\" option");
1626 #if defined(SUBVERSION) && SUBVERSION > 0
1627 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1628 PATCHLEVEL, SUBVERSION, ARCHNAME);
1630 printf("\nThis is perl, version %s built for %s",
1631 patchlevel, ARCHNAME);
1633 #if defined(LOCAL_PATCH_COUNT)
1634 if (LOCAL_PATCH_COUNT > 0)
1635 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1636 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1639 printf("\n\nCopyright 1987-1998, Larry Wall\n");
1641 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1644 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1645 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1998\n");
1648 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1649 "Version 5 port Copyright (c) 1994-1998, Andreas Kaiser, Ilya Zakharevich\n");
1652 printf("atariST series port, ++jrb bammi@cadence.com\n");
1655 Perl may be copied only under the terms of either the Artistic License or the\n\
1656 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1664 if (s[1] == '-') /* Additional switches on #! line. */
1675 #ifdef ALTERNATE_SHEBANG
1676 case 'S': /* OS/2 needs -S on "extproc" line. */
1684 croak("Can't emulate -%.1s on #! line",s);
1689 /* compliments of Tom Christiansen */
1691 /* unexec() can be found in the Gnu emacs distribution */
1702 prog = newSVpv(BIN_EXP);
1703 sv_catpv(prog, "/perl");
1704 file = newSVpv(origfilename);
1705 sv_catpv(file, ".perldump");
1707 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1709 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1710 SvPVX(prog), SvPVX(file));
1711 PerlProc_exit(status);
1714 # include <lib$routines.h>
1715 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1717 ABORT(); /* for use with undump */
1723 init_main_stash(void)
1728 /* Note that strtab is a rather special HV. Assumptions are made
1729 about not iterating on it, and not adding tie magic to it.
1730 It is properly deallocated in perl_destruct() */
1732 HvSHAREKEYS_off(strtab); /* mandatory */
1733 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1734 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1736 curstash = defstash = newHV();
1737 curstname = newSVpv("main",4);
1738 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1739 SvREFCNT_dec(GvHV(gv));
1740 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1742 HvNAME(defstash) = savepv("main");
1743 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1745 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1746 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1748 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1749 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1750 sv_setpvn(ERRSV, "", 0);
1751 curstash = defstash;
1752 compiling.cop_stash = defstash;
1753 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1754 globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
1755 /* We must init $/ before switches are processed. */
1756 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1760 open_script(char *scriptname, bool dosearch, SV *sv)
1763 char *xfound = Nullch;
1764 char *xfailed = Nullch;
1768 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1769 # define SEARCH_EXTS ".bat", ".cmd", NULL
1770 # define MAX_EXT_LEN 4
1773 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1774 # define MAX_EXT_LEN 4
1777 # define SEARCH_EXTS ".pl", ".com", NULL
1778 # define MAX_EXT_LEN 4
1780 /* additional extensions to try in each dir if scriptname not found */
1782 char *ext[] = { SEARCH_EXTS };
1783 int extidx = 0, i = 0;
1784 char *curext = Nullch;
1786 # define MAX_EXT_LEN 0
1790 * If dosearch is true and if scriptname does not contain path
1791 * delimiters, search the PATH for scriptname.
1793 * If SEARCH_EXTS is also defined, will look for each
1794 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1795 * while searching the PATH.
1797 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1798 * proceeds as follows:
1799 * If DOSISH or VMSISH:
1800 * + look for ./scriptname{,.foo,.bar}
1801 * + search the PATH for scriptname{,.foo,.bar}
1804 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1805 * this will not look in '.' if it's not in the PATH)
1809 # ifdef ALWAYS_DEFTYPES
1810 len = strlen(scriptname);
1811 if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
1812 int hasdir, idx = 0, deftypes = 1;
1815 hasdir = !dosearch || (strpbrk(scriptname,":[</") != Nullch) ;
1818 int hasdir, idx = 0, deftypes = 1;
1821 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1823 /* The first time through, just add SEARCH_EXTS to whatever we
1824 * already have, so we can check for default file types. */
1826 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1832 if ((strlen(tokenbuf) + strlen(scriptname)
1833 + MAX_EXT_LEN) >= sizeof tokenbuf)
1834 continue; /* don't search dir with too-long name */
1835 strcat(tokenbuf, scriptname);
1839 if (strEQ(scriptname, "-"))
1841 if (dosearch) { /* Look in '.' first. */
1842 char *cur = scriptname;
1844 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1846 if (strEQ(ext[i++],curext)) {
1847 extidx = -1; /* already has an ext */
1852 DEBUG_p(PerlIO_printf(Perl_debug_log,
1853 "Looking for %s\n",cur));
1854 if (Stat(cur,&statbuf) >= 0) {
1862 if (cur == scriptname) {
1863 len = strlen(scriptname);
1864 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1866 cur = strcpy(tokenbuf, scriptname);
1868 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1869 && strcpy(tokenbuf+len, ext[extidx++]));
1874 if (dosearch && !strchr(scriptname, '/')
1876 && !strchr(scriptname, '\\')
1878 && (s = PerlEnv_getenv("PATH"))) {
1881 bufend = s + strlen(s);
1882 while (s < bufend) {
1883 #if defined(atarist) || defined(DOSISH)
1888 && *s != ';'; len++, s++) {
1889 if (len < sizeof tokenbuf)
1892 if (len < sizeof tokenbuf)
1893 tokenbuf[len] = '\0';
1894 #else /* ! (atarist || DOSISH) */
1895 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1898 #endif /* ! (atarist || DOSISH) */
1901 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1902 continue; /* don't search dir with too-long name */
1904 #if defined(atarist) || defined(DOSISH)
1905 && tokenbuf[len - 1] != '/'
1906 && tokenbuf[len - 1] != '\\'
1909 tokenbuf[len++] = '/';
1910 if (len == 2 && tokenbuf[0] == '.')
1912 (void)strcpy(tokenbuf + len, scriptname);
1916 len = strlen(tokenbuf);
1917 if (extidx > 0) /* reset after previous loop */
1921 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1922 retval = Stat(tokenbuf,&statbuf);
1924 } while ( retval < 0 /* not there */
1925 && extidx>=0 && ext[extidx] /* try an extension? */
1926 && strcpy(tokenbuf+len, ext[extidx++])
1931 if (S_ISREG(statbuf.st_mode)
1932 && cando(S_IRUSR,TRUE,&statbuf)
1934 && cando(S_IXUSR,TRUE,&statbuf)
1938 xfound = tokenbuf; /* bingo! */
1942 xfailed = savepv(tokenbuf);
1945 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1947 seen_dot = 1; /* Disable message. */
1949 croak("Can't %s %s%s%s",
1950 (xfailed ? "execute" : "find"),
1951 (xfailed ? xfailed : scriptname),
1952 (xfailed ? "" : " on PATH"),
1953 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1956 scriptname = xfound;
1959 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1960 char *s = scriptname + 8;
1969 origfilename = savepv(e_tmpname ? "-e" : scriptname);
1970 curcop->cop_filegv = gv_fetchfile(origfilename);
1971 if (strEQ(origfilename,"-"))
1973 if (fdscript >= 0) {
1974 rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
1975 #if defined(HAS_FCNTL) && defined(F_SETFD)
1977 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
1980 else if (preprocess) {
1981 char *cpp_cfg = CPPSTDIN;
1982 SV *cpp = NEWSV(0,0);
1983 SV *cmd = NEWSV(0,0);
1985 if (strEQ(cpp_cfg, "cppstdin"))
1986 sv_catpvf(cpp, "%s/", BIN_EXP);
1987 sv_catpv(cpp, cpp_cfg);
1990 sv_catpv(sv,PRIVLIB_EXP);
1994 sed %s -e \"/^[^#]/b\" \
1995 -e \"/^#[ ]*include[ ]/b\" \
1996 -e \"/^#[ ]*define[ ]/b\" \
1997 -e \"/^#[ ]*if[ ]/b\" \
1998 -e \"/^#[ ]*ifdef[ ]/b\" \
1999 -e \"/^#[ ]*ifndef[ ]/b\" \
2000 -e \"/^#[ ]*else/b\" \
2001 -e \"/^#[ ]*elif[ ]/b\" \
2002 -e \"/^#[ ]*undef[ ]/b\" \
2003 -e \"/^#[ ]*endif/b\" \
2006 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2009 %s %s -e '/^[^#]/b' \
2010 -e '/^#[ ]*include[ ]/b' \
2011 -e '/^#[ ]*define[ ]/b' \
2012 -e '/^#[ ]*if[ ]/b' \
2013 -e '/^#[ ]*ifdef[ ]/b' \
2014 -e '/^#[ ]*ifndef[ ]/b' \
2015 -e '/^#[ ]*else/b' \
2016 -e '/^#[ ]*elif[ ]/b' \
2017 -e '/^#[ ]*undef[ ]/b' \
2018 -e '/^#[ ]*endif/b' \
2026 (doextract ? "-e '1,/^#/d\n'" : ""),
2028 scriptname, cpp, sv, CPPMINUS);
2030 #ifdef IAMSUID /* actually, this is caught earlier */
2031 if (euid != uid && !euid) { /* if running suidperl */
2033 (void)seteuid(uid); /* musn't stay setuid root */
2036 (void)setreuid((Uid_t)-1, uid);
2038 #ifdef HAS_SETRESUID
2039 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2045 if (geteuid() != uid)
2046 croak("Can't do seteuid!\n");
2048 #endif /* IAMSUID */
2049 rsfp = PerlProc_popen(SvPVX(cmd), "r");
2053 else if (!*scriptname) {
2054 forbid_setid("program input from stdin");
2055 rsfp = PerlIO_stdin();
2058 rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2059 #if defined(HAS_FCNTL) && defined(F_SETFD)
2061 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2069 #ifndef IAMSUID /* in case script is not readable before setuid */
2070 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2071 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2073 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2074 croak("Can't do setuid\n");
2078 croak("Can't open perl script \"%s\": %s\n",
2079 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2084 validate_suid(char *validarg, char *scriptname)
2088 /* do we need to emulate setuid on scripts? */
2090 /* This code is for those BSD systems that have setuid #! scripts disabled
2091 * in the kernel because of a security problem. Merely defining DOSUID
2092 * in perl will not fix that problem, but if you have disabled setuid
2093 * scripts in the kernel, this will attempt to emulate setuid and setgid
2094 * on scripts that have those now-otherwise-useless bits set. The setuid
2095 * root version must be called suidperl or sperlN.NNN. If regular perl
2096 * discovers that it has opened a setuid script, it calls suidperl with
2097 * the same argv that it had. If suidperl finds that the script it has
2098 * just opened is NOT setuid root, it sets the effective uid back to the
2099 * uid. We don't just make perl setuid root because that loses the
2100 * effective uid we had before invoking perl, if it was different from the
2103 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2104 * be defined in suidperl only. suidperl must be setuid root. The
2105 * Configure script will set this up for you if you want it.
2112 if (PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2113 croak("Can't stat script \"%s\"",origfilename);
2114 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2118 #ifndef HAS_SETREUID
2119 /* On this access check to make sure the directories are readable,
2120 * there is actually a small window that the user could use to make
2121 * filename point to an accessible directory. So there is a faint
2122 * chance that someone could execute a setuid script down in a
2123 * non-accessible directory. I don't know what to do about that.
2124 * But I don't think it's too important. The manual lies when
2125 * it says access() is useful in setuid programs.
2127 if (PerlLIO_access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2128 croak("Permission denied");
2130 /* If we can swap euid and uid, then we can determine access rights
2131 * with a simple stat of the file, and then compare device and
2132 * inode to make sure we did stat() on the same file we opened.
2133 * Then we just have to make sure he or she can execute it.
2136 struct stat tmpstatbuf;
2140 setreuid(euid,uid) < 0
2143 setresuid(euid,uid,(Uid_t)-1) < 0
2146 || getuid() != euid || geteuid() != uid)
2147 croak("Can't swap uid and euid"); /* really paranoid */
2148 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2149 croak("Permission denied"); /* testing full pathname here */
2150 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2151 tmpstatbuf.st_ino != statbuf.st_ino) {
2152 (void)PerlIO_close(rsfp);
2153 if (rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
2155 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2156 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2157 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2158 (long)statbuf.st_dev, (long)statbuf.st_ino,
2159 SvPVX(GvSV(curcop->cop_filegv)),
2160 (long)statbuf.st_uid, (long)statbuf.st_gid);
2161 (void)PerlProc_pclose(rsfp);
2163 croak("Permission denied\n");
2167 setreuid(uid,euid) < 0
2169 # if defined(HAS_SETRESUID)
2170 setresuid(uid,euid,(Uid_t)-1) < 0
2173 || getuid() != uid || geteuid() != euid)
2174 croak("Can't reswap uid and euid");
2175 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2176 croak("Permission denied\n");
2178 #endif /* HAS_SETREUID */
2179 #endif /* IAMSUID */
2181 if (!S_ISREG(statbuf.st_mode))
2182 croak("Permission denied");
2183 if (statbuf.st_mode & S_IWOTH)
2184 croak("Setuid/gid script is writable by world");
2185 doswitches = FALSE; /* -s is insecure in suid */
2187 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2188 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2189 croak("No #! line");
2190 s = SvPV(linestr,na)+2;
2192 while (!isSPACE(*s)) s++;
2193 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2194 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2195 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2196 croak("Not a perl script");
2197 while (*s == ' ' || *s == '\t') s++;
2199 * #! arg must be what we saw above. They can invoke it by
2200 * mentioning suidperl explicitly, but they may not add any strange
2201 * arguments beyond what #! says if they do invoke suidperl that way.
2203 len = strlen(validarg);
2204 if (strEQ(validarg," PHOOEY ") ||
2205 strnNE(s,validarg,len) || !isSPACE(s[len]))
2206 croak("Args must match #! line");
2209 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2210 euid == statbuf.st_uid)
2212 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2213 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2214 #endif /* IAMSUID */
2216 if (euid) { /* oops, we're not the setuid root perl */
2217 (void)PerlIO_close(rsfp);
2220 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2222 croak("Can't do setuid\n");
2225 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2227 (void)setegid(statbuf.st_gid);
2230 (void)setregid((Gid_t)-1,statbuf.st_gid);
2232 #ifdef HAS_SETRESGID
2233 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2235 setgid(statbuf.st_gid);
2239 if (getegid() != statbuf.st_gid)
2240 croak("Can't do setegid!\n");
2242 if (statbuf.st_mode & S_ISUID) {
2243 if (statbuf.st_uid != euid)
2245 (void)seteuid(statbuf.st_uid); /* all that for this */
2248 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2250 #ifdef HAS_SETRESUID
2251 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2253 setuid(statbuf.st_uid);
2257 if (geteuid() != statbuf.st_uid)
2258 croak("Can't do seteuid!\n");
2260 else if (uid) { /* oops, mustn't run as root */
2262 (void)seteuid((Uid_t)uid);
2265 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2267 #ifdef HAS_SETRESUID
2268 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2274 if (geteuid() != uid)
2275 croak("Can't do seteuid!\n");
2278 if (!cando(S_IXUSR,TRUE,&statbuf))
2279 croak("Permission denied\n"); /* they can't do this */
2282 else if (preprocess)
2283 croak("-P not allowed for setuid/setgid script\n");
2284 else if (fdscript >= 0)
2285 croak("fd script not allowed in suidperl\n");
2287 croak("Script is not setuid/setgid in suidperl\n");
2289 /* We absolutely must clear out any saved ids here, so we */
2290 /* exec the real perl, substituting fd script for scriptname. */
2291 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2292 PerlIO_rewind(rsfp);
2293 PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2294 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2295 if (!origargv[which])
2296 croak("Permission denied");
2297 origargv[which] = savepv(form("/dev/fd/%d/%s",
2298 PerlIO_fileno(rsfp), origargv[which]));
2299 #if defined(HAS_FCNTL) && defined(F_SETFD)
2300 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2302 PerlProc_execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2303 croak("Can't do setuid\n");
2304 #endif /* IAMSUID */
2306 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2307 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2309 PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2310 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2312 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2315 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2316 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2317 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2318 /* not set-id, must be wrapped */
2324 find_beginning(void)
2326 register char *s, *s2;
2328 /* skip forward in input to the real script? */
2332 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2333 croak("No Perl script found in input\n");
2334 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2335 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2337 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2339 while (*s == ' ' || *s == '\t') s++;
2341 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2342 if (strnEQ(s2-4,"perl",4))
2344 while (s = moreswitches(s)) ;
2346 if (cddir && PerlDir_chdir(cddir) < 0)
2347 croak("Can't chdir to %s",cddir);
2355 uid = (int)getuid();
2356 euid = (int)geteuid();
2357 gid = (int)getgid();
2358 egid = (int)getegid();
2363 tainting |= (uid && (euid != uid || egid != gid));
2367 forbid_setid(char *s)
2370 croak("No %s allowed while running setuid", s);
2372 croak("No %s allowed while running setgid", s);
2379 curstash = debstash;
2380 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2382 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2383 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2384 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2385 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2386 sv_setiv(DBsingle, 0);
2387 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2388 sv_setiv(DBtrace, 0);
2389 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2390 sv_setiv(DBsignal, 0);
2391 curstash = defstash;
2395 init_stacks(ARGSproto)
2398 mainstack = curstack; /* remember in case we switch stacks */
2399 AvREAL_off(curstack); /* not a real array */
2400 av_extend(curstack,127);
2402 stack_base = AvARRAY(curstack);
2403 stack_sp = stack_base;
2404 stack_max = stack_base + 127;
2406 cxstack_max = 8192 / sizeof(PERL_CONTEXT) - 2; /* Use most of 8K. */
2407 New(50,cxstack,cxstack_max + 1,PERL_CONTEXT);
2410 New(50,tmps_stack,128,SV*);
2416 * The following stacks almost certainly should be per-interpreter,
2417 * but for now they're not. XXX
2421 markstack_ptr = markstack;
2423 New(54,markstack,64,I32);
2424 markstack_ptr = markstack;
2425 markstack_max = markstack + 64;
2431 New(54,scopestack,32,I32);
2433 scopestack_max = 32;
2439 New(54,savestack,128,ANY);
2441 savestack_max = 128;
2447 New(54,retstack,16,OP*);
2458 Safefree(tmps_stack);
2465 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2474 subname = newSVpv("main",4);
2478 init_predump_symbols(void)
2484 sv_setpvn(perl_get_sv("\"", TRUE), " ", 1);
2485 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2486 GvMULTI_on(stdingv);
2487 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2488 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2490 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2492 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2494 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2496 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2498 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2500 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2501 GvMULTI_on(othergv);
2502 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2503 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2505 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2507 statname = NEWSV(66,0); /* last filename we did stat on */
2510 osname = savepv(OSNAME);
2514 init_postdump_symbols(register int argc, register char **argv, register char **env)
2521 argc--,argv++; /* skip name of script */
2523 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2526 if (argv[0][1] == '-') {
2530 if (s = strchr(argv[0], '=')) {
2532 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2535 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2538 toptarget = NEWSV(0,0);
2539 sv_upgrade(toptarget, SVt_PVFM);
2540 sv_setpvn(toptarget, "", 0);
2541 bodytarget = NEWSV(0,0);
2542 sv_upgrade(bodytarget, SVt_PVFM);
2543 sv_setpvn(bodytarget, "", 0);
2544 formtarget = bodytarget;
2547 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2548 sv_setpv(GvSV(tmpgv),origfilename);
2549 magicname("0", "0", 1);
2551 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2552 sv_setpv(GvSV(tmpgv),origargv[0]);
2553 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2555 (void)gv_AVadd(argvgv);
2556 av_clear(GvAVn(argvgv));
2557 for (; argc > 0; argc--,argv++) {
2558 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2561 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2565 hv_magic(hv, envgv, 'E');
2566 #ifndef VMS /* VMS doesn't have environ array */
2567 /* Note that if the supplied env parameter is actually a copy
2568 of the global environ then it may now point to free'd memory
2569 if the environment has been modified since. To avoid this
2570 problem we treat env==NULL as meaning 'use the default'
2575 environ[0] = Nullch;
2576 for (; *env; env++) {
2577 if (!(s = strchr(*env,'=')))
2580 #if defined(WIN32) || defined(MSDOS)
2583 sv = newSVpv(s--,0);
2584 (void)hv_store(hv, *env, s - *env, sv, 0);
2586 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2587 /* Sins of the RTL. See note in my_setenv(). */
2588 (void)PerlEnv_putenv(savepv(*env));
2592 #ifdef DYNAMIC_ENV_FETCH
2593 HvNAME(hv) = savepv(ENV_HV_NAME);
2597 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2598 sv_setiv(GvSV(tmpgv), (IV)getpid());
2607 s = PerlEnv_getenv("PERL5LIB");
2611 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
2613 /* Treat PERL5?LIB as a possible search list logical name -- the
2614 * "natural" VMS idiom for a Unix path string. We allow each
2615 * element to be a set of |-separated directories for compatibility.
2619 if (my_trnlnm("PERL5LIB",buf,0))
2620 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2622 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2626 /* Use the ~-expanded versions of APPLLIB (undocumented),
2627 ARCHLIB PRIVLIB SITEARCH and SITELIB
2630 incpush(APPLLIB_EXP, FALSE);
2634 incpush(ARCHLIB_EXP, FALSE);
2637 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2639 incpush(PRIVLIB_EXP, FALSE);
2642 incpush(SITEARCH_EXP, FALSE);
2645 incpush(SITELIB_EXP, FALSE);
2648 incpush(".", FALSE);
2652 # define PERLLIB_SEP ';'
2655 # define PERLLIB_SEP '|'
2657 # define PERLLIB_SEP ':'
2660 #ifndef PERLLIB_MANGLE
2661 # define PERLLIB_MANGLE(s,n) (s)
2665 incpush(char *p, int addsubdirs)
2667 SV *subdir = Nullsv;
2668 static char *archpat_auto;
2674 subdir = NEWSV(55,0);
2675 if (!archpat_auto) {
2676 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2677 + sizeof("//auto"));
2678 New(55, archpat_auto, len, char);
2679 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2681 for (len = sizeof(ARCHNAME) + 2;
2682 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2683 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2688 /* Break at all separators */
2690 SV *libdir = NEWSV(55,0);
2693 /* skip any consecutive separators */
2694 while ( *p == PERLLIB_SEP ) {
2695 /* Uncomment the next line for PATH semantics */
2696 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2700 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2701 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2706 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2707 p = Nullch; /* break out */
2711 * BEFORE pushing libdir onto @INC we may first push version- and
2712 * archname-specific sub-directories.
2715 struct stat tmpstatbuf;
2720 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2722 while (unix[len-1] == '/') len--; /* Cosmetic */
2723 sv_usepvn(libdir,unix,len);
2726 PerlIO_printf(PerlIO_stderr(),
2727 "Failed to unixify @INC element \"%s\"\n",
2730 /* .../archname/version if -d .../archname/version/auto */
2731 sv_setsv(subdir, libdir);
2732 sv_catpv(subdir, archpat_auto);
2733 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2734 S_ISDIR(tmpstatbuf.st_mode))
2735 av_push(GvAVn(incgv),
2736 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2738 /* .../archname if -d .../archname/auto */
2739 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2740 strlen(patchlevel) + 1, "", 0);
2741 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2742 S_ISDIR(tmpstatbuf.st_mode))
2743 av_push(GvAVn(incgv),
2744 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2747 /* finally push this lib directory on the end of @INC */
2748 av_push(GvAVn(incgv), libdir);
2751 SvREFCNT_dec(subdir);
2755 static struct perl_thread *
2758 struct perl_thread *thr;
2761 Newz(53, thr, 1, struct perl_thread);
2762 curcop = &compiling;
2763 thr->cvcache = newHV();
2764 thr->threadsv = newAV();
2765 /* thr->threadsvp is set when find_threadsv is called */
2766 thr->specific = newAV();
2767 thr->errhv = newHV();
2768 thr->flags = THRf_R_JOINABLE;
2769 MUTEX_INIT(&thr->mutex);
2770 /* Handcraft thrsv similarly to mess_sv */
2771 New(53, thrsv, 1, SV);
2772 Newz(53, xpv, 1, XPV);
2773 SvFLAGS(thrsv) = SVt_PV;
2774 SvANY(thrsv) = (void*)xpv;
2775 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2776 SvPVX(thrsv) = (char*)thr;
2777 SvCUR_set(thrsv, sizeof(thr));
2778 SvLEN_set(thrsv, sizeof(thr));
2779 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2781 curcop = &compiling;
2784 MUTEX_LOCK(&threads_mutex);
2789 MUTEX_UNLOCK(&threads_mutex);
2791 #ifdef HAVE_THREAD_INTERN
2792 init_thread_intern(thr);
2795 #ifdef SET_THREAD_SELF
2796 SET_THREAD_SELF(thr);
2798 thr->self = pthread_self();
2799 #endif /* SET_THREAD_SELF */
2803 * These must come after the SET_THR because sv_setpvn does
2804 * SvTAINT and the taint fields require dTHR.
2806 toptarget = NEWSV(0,0);
2807 sv_upgrade(toptarget, SVt_PVFM);
2808 sv_setpvn(toptarget, "", 0);
2809 bodytarget = NEWSV(0,0);
2810 sv_upgrade(bodytarget, SVt_PVFM);
2811 sv_setpvn(bodytarget, "", 0);
2812 formtarget = bodytarget;
2813 thr->errsv = newSVpv("", 0);
2814 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
2817 #endif /* USE_THREADS */
2820 call_list(I32 oldscope, AV *list)
2823 line_t oldline = curcop->cop_line;
2828 while (AvFILL(list) >= 0) {
2829 CV *cv = (CV*)av_shift(list);
2838 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2839 (void)SvPV(atsv, len);
2842 curcop = &compiling;
2843 curcop->cop_line = oldline;
2844 if (list == beginav)
2845 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2847 sv_catpv(atsv, "END failed--cleanup aborted");
2848 while (scopestack_ix > oldscope)
2850 croak("%s", SvPVX(atsv));
2858 /* my_exit() was called */
2859 while (scopestack_ix > oldscope)
2862 curstash = defstash;
2864 call_list(oldscope, endav);
2866 curcop = &compiling;
2867 curcop->cop_line = oldline;
2869 if (list == beginav)
2870 croak("BEGIN failed--compilation aborted");
2872 croak("END failed--cleanup aborted");
2878 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2883 curcop = &compiling;
2884 curcop->cop_line = oldline;
2897 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2898 thr, (unsigned long) status));
2899 #endif /* USE_THREADS */
2908 STATUS_NATIVE_SET(status);
2915 my_failure_exit(void)
2918 if (vaxc$errno & 1) {
2919 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2920 STATUS_NATIVE_SET(44);
2923 if (!vaxc$errno && errno) /* unlikely */
2924 STATUS_NATIVE_SET(44);
2926 STATUS_NATIVE_SET(vaxc$errno);
2930 STATUS_POSIX_SET(errno);
2931 else if (STATUS_POSIX == 0)
2932 STATUS_POSIX_SET(255);
2941 register PERL_CONTEXT *cx;
2950 (void)UNLINK(e_tmpname);
2951 Safefree(e_tmpname);
2955 if (cxstack_ix >= 0) {