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;
566 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
569 croak("suidperl is no longer needed since the kernel can now execute\n\
570 setuid perl scripts securely.\n");
574 if (!(curinterp = sv_interp))
577 #if defined(NeXT) && defined(__DYNAMIC__)
578 _dyld_lookup_and_bind
579 ("__environ", (unsigned long *) &environ_pointer, NULL);
584 #ifndef VMS /* VMS doesn't have environ array */
585 origenviron = environ;
591 /* Come here if running an undumped a.out. */
593 origfilename = savepv(argv[0]);
595 cxstack_ix = -1; /* start label stack again */
597 init_postdump_symbols(argc,argv,env);
602 curpad = AvARRAY(comppad);
607 SvREFCNT_dec(main_cv);
611 oldscope = scopestack_ix;
619 /* my_exit() was called */
620 while (scopestack_ix > oldscope)
625 call_list(oldscope, endav);
627 return STATUS_NATIVE_EXPORT;
630 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
634 sv_setpvn(linestr,"",0);
635 sv = newSVpv("",0); /* first used for -I flags */
639 for (argc--,argv++; argc > 0; argc--,argv++) {
640 if (argv[0][0] != '-' || !argv[0][1])
644 validarg = " PHOOEY ";
669 if (s = moreswitches(s))
679 if (euid != uid || egid != gid)
680 croak("No -e allowed in setuid scripts");
682 e_tmpname = savepv(TMPPATH);
684 e_tmpfd = PerlLIO_mkstemp(e_tmpname);
687 croak("Can't mkstemp() temporary file \"%s\"", e_tmpname);
688 e_fp = PerlIO_fdopen(e_tmpfd,"w");
689 #else /* use mktemp() */
690 (void)PerlLIO_mktemp(e_tmpname);
692 croak("Can't mktemp() temporary file \"%s\"", e_tmpname);
693 e_fp = PerlIO_open(e_tmpname,"w");
694 #endif /* HAS_MKSTEMP */
696 croak("Cannot open temporary file \"%s\"", e_tmpname);
701 PerlIO_puts(e_fp,argv[1]);
705 croak("No code specified for -e");
706 (void)PerlIO_putc(e_fp,'\n');
708 case 'I': /* -I handled both here and in moreswitches() */
710 if (!*++s && (s=argv[1]) != Nullch) {
713 while (s && isSPACE(*s))
717 for (e = s; *e && !isSPACE(*e); e++) ;
724 } /* XXX else croak? */
738 preambleav = newAV();
739 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
741 Sv = newSVpv("print myconfig();",0);
743 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
745 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
747 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
748 sv_catpv(Sv,"\" Compile-time options:");
750 sv_catpv(Sv," DEBUGGING");
753 sv_catpv(Sv," NO_EMBED");
756 sv_catpv(Sv," MULTIPLICITY");
758 sv_catpv(Sv,"\\n\",");
760 #if defined(LOCAL_PATCH_COUNT)
761 if (LOCAL_PATCH_COUNT > 0) {
763 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
764 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
766 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
770 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
773 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
775 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
780 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
781 print \" \\%ENV:\\n @env\\n\" if @env; \
782 print \" \\@INC:\\n @INC\\n\";");
785 Sv = newSVpv("config_vars(qw(",0);
790 av_push(preambleav, Sv);
791 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
802 if (!*++s || isSPACE(*s)) {
806 /* catch use of gnu style long options */
807 if (strEQ(s, "version")) {
811 if (strEQ(s, "help")) {
818 croak("Unrecognized switch: -%s (-h will show valid options)",s);
823 if (!tainting && (s = PerlEnv_getenv("PERL5OPT"))) {
834 if (!strchr("DIMUdmw", *s))
835 croak("Illegal switch in PERL5OPT: -%c", *s);
841 scriptname = argv[0];
843 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
845 warn("Did you forget to compile with -DMULTIPLICITY?");
847 croak("Can't write to temp file for -e: %s", Strerror(errno));
851 scriptname = e_tmpname;
853 else if (scriptname == Nullch) {
855 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
863 open_script(scriptname,dosearch,sv);
865 validate_suid(validarg, scriptname);
870 main_cv = compcv = (CV*)NEWSV(1104,0);
871 sv_upgrade((SV *)compcv, SVt_PVCV);
875 av_push(comppad, Nullsv);
876 curpad = AvARRAY(comppad);
877 comppad_name = newAV();
878 comppad_name_fill = 0;
879 min_intro_pending = 0;
882 av_store(comppad_name, 0, newSVpv("@_", 2));
883 curpad[0] = (SV*)newAV();
884 SvPADMY_on(curpad[0]); /* XXX Needed? */
886 New(666, CvMUTEXP(compcv), 1, perl_mutex);
887 MUTEX_INIT(CvMUTEXP(compcv));
888 #endif /* USE_THREADS */
890 comppadlist = newAV();
891 AvREAL_off(comppadlist);
892 av_store(comppadlist, 0, (SV*)comppad_name);
893 av_store(comppadlist, 1, (SV*)comppad);
894 CvPADLIST(compcv) = comppadlist;
896 boot_core_UNIVERSAL();
898 (*xsinit)(); /* in case linked C routines want magical variables */
899 #if defined(VMS) || defined(WIN32) || defined(DJGPP)
903 init_predump_symbols();
905 init_postdump_symbols(argc,argv,env);
909 /* now parse the script */
911 SETERRNO(0,SS$_NORMAL);
913 if (yyparse() || error_count) {
915 croak("%s had compilation errors.\n", origfilename);
917 croak("Execution of %s aborted due to compilation errors.\n",
921 curcop->cop_line = 0;
925 (void)UNLINK(e_tmpname);
931 /* now that script is parsed, we can modify record separator */
933 rs = SvREFCNT_inc(nrs);
934 sv_setsv(perl_get_sv("/", TRUE), rs);
945 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
946 dump_mstats("after compilation:");
956 perl_run(PerlInterpreter *sv_interp)
963 if (!(curinterp = sv_interp))
966 oldscope = scopestack_ix;
971 cxstack_ix = -1; /* start context stack again */
974 /* my_exit() was called */
975 while (scopestack_ix > oldscope)
980 call_list(oldscope, endav);
982 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
983 dump_mstats("after execution: ");
986 return STATUS_NATIVE_EXPORT;
989 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
994 if (curstack != mainstack) {
996 SWITCHSTACK(curstack, mainstack);
1001 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1002 sawampersand ? "Enabling" : "Omitting"));
1005 DEBUG_x(dump_all());
1006 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1008 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1009 (unsigned long) thr));
1010 #endif /* USE_THREADS */
1013 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1016 if (PERLDB_SINGLE && DBsingle)
1017 sv_setiv(DBsingle, 1);
1019 call_list(oldscope, initav);
1029 else if (main_start) {
1030 CvDEPTH(main_cv) = 1;
1041 perl_get_sv(char *name, I32 create)
1045 if (name[1] == '\0' && !isALPHA(name[0])) {
1046 PADOFFSET tmp = find_threadsv(name);
1047 if (tmp != NOT_IN_PAD) {
1049 return THREADSV(tmp);
1052 #endif /* USE_THREADS */
1053 gv = gv_fetchpv(name, create, SVt_PV);
1060 perl_get_av(char *name, I32 create)
1062 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1071 perl_get_hv(char *name, I32 create)
1073 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1082 perl_get_cv(char *name, I32 create)
1084 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1085 if (create && !GvCVu(gv))
1086 return newSUB(start_subparse(FALSE, 0),
1087 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1095 /* Be sure to refetch the stack pointer after calling these routines. */
1098 perl_call_argv(char *sub_name, I32 flags, register char **argv)
1100 /* See G_* flags in cop.h */
1101 /* null terminated arg list */
1108 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1113 return perl_call_pv(sub_name, flags);
1117 perl_call_pv(char *sub_name, I32 flags)
1118 /* name of the subroutine */
1119 /* See G_* flags in cop.h */
1121 return perl_call_sv((SV*)perl_get_cv(sub_name, TRUE), flags);
1125 perl_call_method(char *methname, I32 flags)
1126 /* name of the subroutine */
1127 /* See G_* flags in cop.h */
1133 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1136 return perl_call_sv(*stack_sp--, flags);
1139 /* May be called with any of a CV, a GV, or an SV containing the name. */
1141 perl_call_sv(SV *sv, I32 flags)
1143 /* See G_* flags in cop.h */
1146 LOGOP myop; /* fake syntax tree node */
1152 bool oldcatch = CATCH_GET;
1157 if (flags & G_DISCARD) {
1162 Zero(&myop, 1, LOGOP);
1163 myop.op_next = Nullop;
1164 if (!(flags & G_NOARGS))
1165 myop.op_flags |= OPf_STACKED;
1166 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1167 (flags & G_ARRAY) ? OPf_WANT_LIST :
1172 EXTEND(stack_sp, 1);
1175 oldscope = scopestack_ix;
1177 if (PERLDB_SUB && curstash != debstash
1178 /* Handle first BEGIN of -d. */
1179 && (DBcv || (DBcv = GvCV(DBsub)))
1180 /* Try harder, since this may have been a sighandler, thus
1181 * curstash may be meaningless. */
1182 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1183 op->op_private |= OPpENTERSUB_DB;
1185 if (flags & G_EVAL) {
1186 cLOGOP->op_other = op;
1188 /* we're trying to emulate pp_entertry() here */
1190 register PERL_CONTEXT *cx;
1191 I32 gimme = GIMME_V;
1196 push_return(op->op_next);
1197 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1199 eval_root = op; /* Only needed so that goto works right. */
1202 if (flags & G_KEEPERR)
1217 /* my_exit() was called */
1218 curstash = defstash;
1222 croak("Callback called exit");
1231 stack_sp = stack_base + oldmark;
1232 if (flags & G_ARRAY)
1236 *++stack_sp = &sv_undef;
1244 if (op == (OP*)&myop)
1245 op = pp_entersub(ARGS);
1248 retval = stack_sp - (stack_base + oldmark);
1249 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1253 if (flags & G_EVAL) {
1254 if (scopestack_ix > oldscope) {
1258 register PERL_CONTEXT *cx;
1270 CATCH_SET(oldcatch);
1272 if (flags & G_DISCARD) {
1273 stack_sp = stack_base + oldmark;
1282 /* Eval a string. The G_EVAL flag is always assumed. */
1285 perl_eval_sv(SV *sv, I32 flags)
1287 /* See G_* flags in cop.h */
1290 UNOP myop; /* fake syntax tree node */
1292 I32 oldmark = sp - stack_base;
1299 if (flags & G_DISCARD) {
1307 EXTEND(stack_sp, 1);
1309 oldscope = scopestack_ix;
1311 if (!(flags & G_NOARGS))
1312 myop.op_flags = OPf_STACKED;
1313 myop.op_next = Nullop;
1314 myop.op_type = OP_ENTEREVAL;
1315 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1316 (flags & G_ARRAY) ? OPf_WANT_LIST :
1318 if (flags & G_KEEPERR)
1319 myop.op_flags |= OPf_SPECIAL;
1329 /* my_exit() was called */
1330 curstash = defstash;
1334 croak("Callback called exit");
1343 stack_sp = stack_base + oldmark;
1344 if (flags & G_ARRAY)
1348 *++stack_sp = &sv_undef;
1353 if (op == (OP*)&myop)
1354 op = pp_entereval(ARGS);
1357 retval = stack_sp - (stack_base + oldmark);
1358 if (!(flags & G_KEEPERR))
1363 if (flags & G_DISCARD) {
1364 stack_sp = stack_base + oldmark;
1374 perl_eval_pv(char *p, I32 croak_on_error)
1377 SV* sv = newSVpv(p, 0);
1380 perl_eval_sv(sv, G_SCALAR);
1387 if (croak_on_error && SvTRUE(ERRSV))
1388 croak(SvPVx(ERRSV, na));
1393 /* Require a module. */
1396 perl_require_pv(char *pv)
1398 SV* sv = sv_newmortal();
1399 sv_setpv(sv, "require '");
1402 perl_eval_sv(sv, G_DISCARD);
1406 magicname(char *sym, char *name, I32 namlen)
1410 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1411 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1415 usage(char *name) /* XXX move this out into a module ? */
1418 /* This message really ought to be max 23 lines.
1419 * Removed -h because the user already knows that opton. Others? */
1421 static char *usage[] = {
1422 "-0[octal] specify record separator (\\0, if no argument)",
1423 "-a autosplit mode with -n or -p (splits $_ into @F)",
1424 "-c check syntax only (runs BEGIN and END blocks)",
1425 "-d[:debugger] run scripts under debugger",
1426 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1427 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1428 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1429 "-i[extension] edit <> files in place (make backup if extension supplied)",
1430 "-Idirectory specify @INC/#include directory (may be used more than once)",
1431 "-l[octal] enable line ending processing, specifies line terminator",
1432 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1433 "-n assume 'while (<>) { ... }' loop around your script",
1434 "-p assume loop like -n but print line also like sed",
1435 "-P run script through C preprocessor before compilation",
1436 "-s enable some switch parsing for switches after script name",
1437 "-S look for the script using PATH environment variable",
1438 "-T turn on tainting checks",
1439 "-u dump core after parsing script",
1440 "-U allow unsafe operations",
1441 "-v print version number and patchlevel of perl",
1442 "-V[:variable] print perl configuration information",
1443 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1444 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1450 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1452 printf("\n %s", *p++);
1455 /* This routine handles any switches that can be given during run */
1458 moreswitches(char *s)
1467 rschar = scan_oct(s, 4, &numlen);
1469 if (rschar & ~((U8)~0))
1471 else if (!rschar && numlen >= 2)
1472 nrs = newSVpv("", 0);
1475 nrs = newSVpv(&ch, 1);
1481 splitstr = savepv(s + 1);
1495 if (*s == ':' || *s == '=') {
1496 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1500 perldb = PERLDB_ALL;
1507 if (isALPHA(s[1])) {
1508 static char debopts[] = "psltocPmfrxuLHXD";
1511 for (s++; *s && (d = strchr(debopts,*s)); s++)
1512 debug |= 1 << (d - debopts);
1516 for (s++; isDIGIT(*s); s++) ;
1518 debug |= 0x80000000;
1520 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1521 for (s++; isALNUM(*s); s++) ;
1531 inplace = savepv(s+1);
1533 for (s = inplace; *s && !isSPACE(*s); s++) ;
1537 case 'I': /* -I handled both here and in parse_perl() */
1540 while (*s && isSPACE(*s))
1544 for (e = s; *e && !isSPACE(*e); e++) ;
1545 p = savepvn(s, e-s);
1551 croak("No space allowed after -I");
1561 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1571 ors = SvPV(nrs, orslen);
1572 ors = savepvn(ors, orslen);
1576 forbid_setid("-M"); /* XXX ? */
1579 forbid_setid("-m"); /* XXX ? */
1584 /* -M-foo == 'no foo' */
1585 if (*s == '-') { use = "no "; ++s; }
1586 sv = newSVpv(use,0);
1588 /* We allow -M'Module qw(Foo Bar)' */
1589 while(isALNUM(*s) || *s==':') ++s;
1591 sv_catpv(sv, start);
1592 if (*(start-1) == 'm') {
1594 croak("Can't use '%c' after -mname", *s);
1595 sv_catpv( sv, " ()");
1598 sv_catpvn(sv, start, s-start);
1599 sv_catpv(sv, " split(/,/,q{");
1604 if (preambleav == NULL)
1605 preambleav = newAV();
1606 av_push(preambleav, sv);
1609 croak("No space allowed after -%c", *(s-1));
1626 croak("Too late for \"-T\" option");
1638 #if defined(SUBVERSION) && SUBVERSION > 0
1639 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1640 PATCHLEVEL, SUBVERSION, ARCHNAME);
1642 printf("\nThis is perl, version %s built for %s",
1643 patchlevel, ARCHNAME);
1645 #if defined(LOCAL_PATCH_COUNT)
1646 if (LOCAL_PATCH_COUNT > 0)
1647 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1648 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1651 printf("\n\nCopyright 1987-1998, Larry Wall\n");
1653 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1656 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1657 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1998\n");
1660 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1661 "Version 5 port Copyright (c) 1994-1998, Andreas Kaiser, Ilya Zakharevich\n");
1664 printf("atariST series port, ++jrb bammi@cadence.com\n");
1667 Perl may be copied only under the terms of either the Artistic License or the\n\
1668 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1676 if (s[1] == '-') /* Additional switches on #! line. */
1687 #ifdef ALTERNATE_SHEBANG
1688 case 'S': /* OS/2 needs -S on "extproc" line. */
1696 croak("Can't emulate -%.1s on #! line",s);
1701 /* compliments of Tom Christiansen */
1703 /* unexec() can be found in the Gnu emacs distribution */
1714 prog = newSVpv(BIN_EXP);
1715 sv_catpv(prog, "/perl");
1716 file = newSVpv(origfilename);
1717 sv_catpv(file, ".perldump");
1719 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1721 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1722 SvPVX(prog), SvPVX(file));
1723 PerlProc_exit(status);
1726 # include <lib$routines.h>
1727 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1729 ABORT(); /* for use with undump */
1735 init_main_stash(void)
1740 /* Note that strtab is a rather special HV. Assumptions are made
1741 about not iterating on it, and not adding tie magic to it.
1742 It is properly deallocated in perl_destruct() */
1744 HvSHAREKEYS_off(strtab); /* mandatory */
1745 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1746 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1748 curstash = defstash = newHV();
1749 curstname = newSVpv("main",4);
1750 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1751 SvREFCNT_dec(GvHV(gv));
1752 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1754 HvNAME(defstash) = savepv("main");
1755 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1757 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1758 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1760 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1761 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1762 sv_setpvn(ERRSV, "", 0);
1763 curstash = defstash;
1764 compiling.cop_stash = defstash;
1765 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1766 globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
1767 /* We must init $/ before switches are processed. */
1768 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1772 open_script(char *scriptname, bool dosearch, SV *sv)
1775 char *xfound = Nullch;
1776 char *xfailed = Nullch;
1780 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1781 # define SEARCH_EXTS ".bat", ".cmd", NULL
1782 # define MAX_EXT_LEN 4
1785 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1786 # define MAX_EXT_LEN 4
1789 # define SEARCH_EXTS ".pl", ".com", NULL
1790 # define MAX_EXT_LEN 4
1792 /* additional extensions to try in each dir if scriptname not found */
1794 char *ext[] = { SEARCH_EXTS };
1795 int extidx = 0, i = 0;
1796 char *curext = Nullch;
1798 # define MAX_EXT_LEN 0
1802 * If dosearch is true and if scriptname does not contain path
1803 * delimiters, search the PATH for scriptname.
1805 * If SEARCH_EXTS is also defined, will look for each
1806 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1807 * while searching the PATH.
1809 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1810 * proceeds as follows:
1811 * If DOSISH or VMSISH:
1812 * + look for ./scriptname{,.foo,.bar}
1813 * + search the PATH for scriptname{,.foo,.bar}
1816 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1817 * this will not look in '.' if it's not in the PATH)
1821 # ifdef ALWAYS_DEFTYPES
1822 len = strlen(scriptname);
1823 if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
1824 int hasdir, idx = 0, deftypes = 1;
1827 hasdir = !dosearch || (strpbrk(scriptname,":[</") != Nullch) ;
1830 int hasdir, idx = 0, deftypes = 1;
1833 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1835 /* The first time through, just add SEARCH_EXTS to whatever we
1836 * already have, so we can check for default file types. */
1838 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1844 if ((strlen(tokenbuf) + strlen(scriptname)
1845 + MAX_EXT_LEN) >= sizeof tokenbuf)
1846 continue; /* don't search dir with too-long name */
1847 strcat(tokenbuf, scriptname);
1851 if (strEQ(scriptname, "-"))
1853 if (dosearch) { /* Look in '.' first. */
1854 char *cur = scriptname;
1856 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1858 if (strEQ(ext[i++],curext)) {
1859 extidx = -1; /* already has an ext */
1864 DEBUG_p(PerlIO_printf(Perl_debug_log,
1865 "Looking for %s\n",cur));
1866 if (Stat(cur,&statbuf) >= 0) {
1874 if (cur == scriptname) {
1875 len = strlen(scriptname);
1876 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1878 cur = strcpy(tokenbuf, scriptname);
1880 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1881 && strcpy(tokenbuf+len, ext[extidx++]));
1886 if (dosearch && !strchr(scriptname, '/')
1888 && !strchr(scriptname, '\\')
1890 && (s = PerlEnv_getenv("PATH"))) {
1893 bufend = s + strlen(s);
1894 while (s < bufend) {
1895 #if defined(atarist) || defined(DOSISH)
1900 && *s != ';'; len++, s++) {
1901 if (len < sizeof tokenbuf)
1904 if (len < sizeof tokenbuf)
1905 tokenbuf[len] = '\0';
1906 #else /* ! (atarist || DOSISH) */
1907 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1910 #endif /* ! (atarist || DOSISH) */
1913 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1914 continue; /* don't search dir with too-long name */
1916 #if defined(atarist) || defined(DOSISH)
1917 && tokenbuf[len - 1] != '/'
1918 && tokenbuf[len - 1] != '\\'
1921 tokenbuf[len++] = '/';
1922 if (len == 2 && tokenbuf[0] == '.')
1924 (void)strcpy(tokenbuf + len, scriptname);
1928 len = strlen(tokenbuf);
1929 if (extidx > 0) /* reset after previous loop */
1933 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1934 retval = Stat(tokenbuf,&statbuf);
1936 } while ( retval < 0 /* not there */
1937 && extidx>=0 && ext[extidx] /* try an extension? */
1938 && strcpy(tokenbuf+len, ext[extidx++])
1943 if (S_ISREG(statbuf.st_mode)
1944 && cando(S_IRUSR,TRUE,&statbuf)
1946 && cando(S_IXUSR,TRUE,&statbuf)
1950 xfound = tokenbuf; /* bingo! */
1954 xfailed = savepv(tokenbuf);
1957 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1959 seen_dot = 1; /* Disable message. */
1961 croak("Can't %s %s%s%s",
1962 (xfailed ? "execute" : "find"),
1963 (xfailed ? xfailed : scriptname),
1964 (xfailed ? "" : " on PATH"),
1965 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1968 scriptname = xfound;
1971 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1972 char *s = scriptname + 8;
1981 origfilename = savepv(e_tmpname ? "-e" : scriptname);
1982 curcop->cop_filegv = gv_fetchfile(origfilename);
1983 if (strEQ(origfilename,"-"))
1985 if (fdscript >= 0) {
1986 rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
1987 #if defined(HAS_FCNTL) && defined(F_SETFD)
1989 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
1992 else if (preprocess) {
1993 char *cpp_cfg = CPPSTDIN;
1994 SV *cpp = NEWSV(0,0);
1995 SV *cmd = NEWSV(0,0);
1997 if (strEQ(cpp_cfg, "cppstdin"))
1998 sv_catpvf(cpp, "%s/", BIN_EXP);
1999 sv_catpv(cpp, cpp_cfg);
2002 sv_catpv(sv,PRIVLIB_EXP);
2006 sed %s -e \"/^[^#]/b\" \
2007 -e \"/^#[ ]*include[ ]/b\" \
2008 -e \"/^#[ ]*define[ ]/b\" \
2009 -e \"/^#[ ]*if[ ]/b\" \
2010 -e \"/^#[ ]*ifdef[ ]/b\" \
2011 -e \"/^#[ ]*ifndef[ ]/b\" \
2012 -e \"/^#[ ]*else/b\" \
2013 -e \"/^#[ ]*elif[ ]/b\" \
2014 -e \"/^#[ ]*undef[ ]/b\" \
2015 -e \"/^#[ ]*endif/b\" \
2018 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2021 %s %s -e '/^[^#]/b' \
2022 -e '/^#[ ]*include[ ]/b' \
2023 -e '/^#[ ]*define[ ]/b' \
2024 -e '/^#[ ]*if[ ]/b' \
2025 -e '/^#[ ]*ifdef[ ]/b' \
2026 -e '/^#[ ]*ifndef[ ]/b' \
2027 -e '/^#[ ]*else/b' \
2028 -e '/^#[ ]*elif[ ]/b' \
2029 -e '/^#[ ]*undef[ ]/b' \
2030 -e '/^#[ ]*endif/b' \
2038 (doextract ? "-e '1,/^#/d\n'" : ""),
2040 scriptname, cpp, sv, CPPMINUS);
2042 #ifdef IAMSUID /* actually, this is caught earlier */
2043 if (euid != uid && !euid) { /* if running suidperl */
2045 (void)seteuid(uid); /* musn't stay setuid root */
2048 (void)setreuid((Uid_t)-1, uid);
2050 #ifdef HAS_SETRESUID
2051 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2057 if (geteuid() != uid)
2058 croak("Can't do seteuid!\n");
2060 #endif /* IAMSUID */
2061 rsfp = PerlProc_popen(SvPVX(cmd), "r");
2065 else if (!*scriptname) {
2066 forbid_setid("program input from stdin");
2067 rsfp = PerlIO_stdin();
2070 rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2071 #if defined(HAS_FCNTL) && defined(F_SETFD)
2073 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2081 #ifndef IAMSUID /* in case script is not readable before setuid */
2082 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2083 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2085 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2086 croak("Can't do setuid\n");
2090 croak("Can't open perl script \"%s\": %s\n",
2091 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2096 validate_suid(char *validarg, char *scriptname)
2100 /* do we need to emulate setuid on scripts? */
2102 /* This code is for those BSD systems that have setuid #! scripts disabled
2103 * in the kernel because of a security problem. Merely defining DOSUID
2104 * in perl will not fix that problem, but if you have disabled setuid
2105 * scripts in the kernel, this will attempt to emulate setuid and setgid
2106 * on scripts that have those now-otherwise-useless bits set. The setuid
2107 * root version must be called suidperl or sperlN.NNN. If regular perl
2108 * discovers that it has opened a setuid script, it calls suidperl with
2109 * the same argv that it had. If suidperl finds that the script it has
2110 * just opened is NOT setuid root, it sets the effective uid back to the
2111 * uid. We don't just make perl setuid root because that loses the
2112 * effective uid we had before invoking perl, if it was different from the
2115 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2116 * be defined in suidperl only. suidperl must be setuid root. The
2117 * Configure script will set this up for you if you want it.
2124 if (PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2125 croak("Can't stat script \"%s\"",origfilename);
2126 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2130 #ifndef HAS_SETREUID
2131 /* On this access check to make sure the directories are readable,
2132 * there is actually a small window that the user could use to make
2133 * filename point to an accessible directory. So there is a faint
2134 * chance that someone could execute a setuid script down in a
2135 * non-accessible directory. I don't know what to do about that.
2136 * But I don't think it's too important. The manual lies when
2137 * it says access() is useful in setuid programs.
2139 if (PerlLIO_access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2140 croak("Permission denied");
2142 /* If we can swap euid and uid, then we can determine access rights
2143 * with a simple stat of the file, and then compare device and
2144 * inode to make sure we did stat() on the same file we opened.
2145 * Then we just have to make sure he or she can execute it.
2148 struct stat tmpstatbuf;
2152 setreuid(euid,uid) < 0
2155 setresuid(euid,uid,(Uid_t)-1) < 0
2158 || getuid() != euid || geteuid() != uid)
2159 croak("Can't swap uid and euid"); /* really paranoid */
2160 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2161 croak("Permission denied"); /* testing full pathname here */
2162 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2163 tmpstatbuf.st_ino != statbuf.st_ino) {
2164 (void)PerlIO_close(rsfp);
2165 if (rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
2167 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2168 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2169 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2170 (long)statbuf.st_dev, (long)statbuf.st_ino,
2171 SvPVX(GvSV(curcop->cop_filegv)),
2172 (long)statbuf.st_uid, (long)statbuf.st_gid);
2173 (void)PerlProc_pclose(rsfp);
2175 croak("Permission denied\n");
2179 setreuid(uid,euid) < 0
2181 # if defined(HAS_SETRESUID)
2182 setresuid(uid,euid,(Uid_t)-1) < 0
2185 || getuid() != uid || geteuid() != euid)
2186 croak("Can't reswap uid and euid");
2187 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2188 croak("Permission denied\n");
2190 #endif /* HAS_SETREUID */
2191 #endif /* IAMSUID */
2193 if (!S_ISREG(statbuf.st_mode))
2194 croak("Permission denied");
2195 if (statbuf.st_mode & S_IWOTH)
2196 croak("Setuid/gid script is writable by world");
2197 doswitches = FALSE; /* -s is insecure in suid */
2199 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2200 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2201 croak("No #! line");
2202 s = SvPV(linestr,na)+2;
2204 while (!isSPACE(*s)) s++;
2205 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2206 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2207 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2208 croak("Not a perl script");
2209 while (*s == ' ' || *s == '\t') s++;
2211 * #! arg must be what we saw above. They can invoke it by
2212 * mentioning suidperl explicitly, but they may not add any strange
2213 * arguments beyond what #! says if they do invoke suidperl that way.
2215 len = strlen(validarg);
2216 if (strEQ(validarg," PHOOEY ") ||
2217 strnNE(s,validarg,len) || !isSPACE(s[len]))
2218 croak("Args must match #! line");
2221 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2222 euid == statbuf.st_uid)
2224 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2225 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2226 #endif /* IAMSUID */
2228 if (euid) { /* oops, we're not the setuid root perl */
2229 (void)PerlIO_close(rsfp);
2232 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2234 croak("Can't do setuid\n");
2237 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2239 (void)setegid(statbuf.st_gid);
2242 (void)setregid((Gid_t)-1,statbuf.st_gid);
2244 #ifdef HAS_SETRESGID
2245 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2247 setgid(statbuf.st_gid);
2251 if (getegid() != statbuf.st_gid)
2252 croak("Can't do setegid!\n");
2254 if (statbuf.st_mode & S_ISUID) {
2255 if (statbuf.st_uid != euid)
2257 (void)seteuid(statbuf.st_uid); /* all that for this */
2260 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2262 #ifdef HAS_SETRESUID
2263 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2265 setuid(statbuf.st_uid);
2269 if (geteuid() != statbuf.st_uid)
2270 croak("Can't do seteuid!\n");
2272 else if (uid) { /* oops, mustn't run as root */
2274 (void)seteuid((Uid_t)uid);
2277 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2279 #ifdef HAS_SETRESUID
2280 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2286 if (geteuid() != uid)
2287 croak("Can't do seteuid!\n");
2290 if (!cando(S_IXUSR,TRUE,&statbuf))
2291 croak("Permission denied\n"); /* they can't do this */
2294 else if (preprocess)
2295 croak("-P not allowed for setuid/setgid script\n");
2296 else if (fdscript >= 0)
2297 croak("fd script not allowed in suidperl\n");
2299 croak("Script is not setuid/setgid in suidperl\n");
2301 /* We absolutely must clear out any saved ids here, so we */
2302 /* exec the real perl, substituting fd script for scriptname. */
2303 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2304 PerlIO_rewind(rsfp);
2305 PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2306 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2307 if (!origargv[which])
2308 croak("Permission denied");
2309 origargv[which] = savepv(form("/dev/fd/%d/%s",
2310 PerlIO_fileno(rsfp), origargv[which]));
2311 #if defined(HAS_FCNTL) && defined(F_SETFD)
2312 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2314 PerlProc_execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2315 croak("Can't do setuid\n");
2316 #endif /* IAMSUID */
2318 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2319 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2321 PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2322 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2324 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2327 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2328 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2329 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2330 /* not set-id, must be wrapped */
2336 find_beginning(void)
2338 register char *s, *s2;
2340 /* skip forward in input to the real script? */
2344 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2345 croak("No Perl script found in input\n");
2346 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2347 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2349 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2351 while (*s == ' ' || *s == '\t') s++;
2353 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2354 if (strnEQ(s2-4,"perl",4))
2356 while (s = moreswitches(s)) ;
2358 if (cddir && PerlDir_chdir(cddir) < 0)
2359 croak("Can't chdir to %s",cddir);
2367 uid = (int)getuid();
2368 euid = (int)geteuid();
2369 gid = (int)getgid();
2370 egid = (int)getegid();
2375 tainting |= (uid && (euid != uid || egid != gid));
2379 forbid_setid(char *s)
2382 croak("No %s allowed while running setuid", s);
2384 croak("No %s allowed while running setgid", s);
2391 curstash = debstash;
2392 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2394 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2395 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2396 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2397 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2398 sv_setiv(DBsingle, 0);
2399 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2400 sv_setiv(DBtrace, 0);
2401 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2402 sv_setiv(DBsignal, 0);
2403 curstash = defstash;
2407 init_stacks(ARGSproto)
2410 mainstack = curstack; /* remember in case we switch stacks */
2411 AvREAL_off(curstack); /* not a real array */
2412 av_extend(curstack,127);
2414 stack_base = AvARRAY(curstack);
2415 stack_sp = stack_base;
2416 stack_max = stack_base + 127;
2418 cxstack_max = 8192 / sizeof(PERL_CONTEXT) - 2; /* Use most of 8K. */
2419 New(50,cxstack,cxstack_max + 1,PERL_CONTEXT);
2422 New(50,tmps_stack,128,SV*);
2428 * The following stacks almost certainly should be per-interpreter,
2429 * but for now they're not. XXX
2433 markstack_ptr = markstack;
2435 New(54,markstack,64,I32);
2436 markstack_ptr = markstack;
2437 markstack_max = markstack + 64;
2443 New(54,scopestack,32,I32);
2445 scopestack_max = 32;
2451 New(54,savestack,128,ANY);
2453 savestack_max = 128;
2459 New(54,retstack,16,OP*);
2470 Safefree(tmps_stack);
2477 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2486 subname = newSVpv("main",4);
2490 init_predump_symbols(void)
2496 sv_setpvn(perl_get_sv("\"", TRUE), " ", 1);
2497 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2498 GvMULTI_on(stdingv);
2499 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2500 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2502 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2504 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2506 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2508 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2510 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2512 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2513 GvMULTI_on(othergv);
2514 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2515 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2517 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2519 statname = NEWSV(66,0); /* last filename we did stat on */
2522 osname = savepv(OSNAME);
2526 init_postdump_symbols(register int argc, register char **argv, register char **env)
2533 argc--,argv++; /* skip name of script */
2535 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2538 if (argv[0][1] == '-') {
2542 if (s = strchr(argv[0], '=')) {
2544 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2547 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2550 toptarget = NEWSV(0,0);
2551 sv_upgrade(toptarget, SVt_PVFM);
2552 sv_setpvn(toptarget, "", 0);
2553 bodytarget = NEWSV(0,0);
2554 sv_upgrade(bodytarget, SVt_PVFM);
2555 sv_setpvn(bodytarget, "", 0);
2556 formtarget = bodytarget;
2559 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2560 sv_setpv(GvSV(tmpgv),origfilename);
2561 magicname("0", "0", 1);
2563 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2564 sv_setpv(GvSV(tmpgv),origargv[0]);
2565 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2567 (void)gv_AVadd(argvgv);
2568 av_clear(GvAVn(argvgv));
2569 for (; argc > 0; argc--,argv++) {
2570 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2573 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2577 hv_magic(hv, envgv, 'E');
2578 #ifndef VMS /* VMS doesn't have environ array */
2579 /* Note that if the supplied env parameter is actually a copy
2580 of the global environ then it may now point to free'd memory
2581 if the environment has been modified since. To avoid this
2582 problem we treat env==NULL as meaning 'use the default'
2587 environ[0] = Nullch;
2588 for (; *env; env++) {
2589 if (!(s = strchr(*env,'=')))
2592 #if defined(WIN32) || defined(MSDOS)
2595 sv = newSVpv(s--,0);
2596 (void)hv_store(hv, *env, s - *env, sv, 0);
2598 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2599 /* Sins of the RTL. See note in my_setenv(). */
2600 (void)PerlEnv_putenv(savepv(*env));
2604 #ifdef DYNAMIC_ENV_FETCH
2605 HvNAME(hv) = savepv(ENV_HV_NAME);
2609 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2610 sv_setiv(GvSV(tmpgv), (IV)getpid());
2619 s = PerlEnv_getenv("PERL5LIB");
2623 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
2625 /* Treat PERL5?LIB as a possible search list logical name -- the
2626 * "natural" VMS idiom for a Unix path string. We allow each
2627 * element to be a set of |-separated directories for compatibility.
2631 if (my_trnlnm("PERL5LIB",buf,0))
2632 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2634 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2638 /* Use the ~-expanded versions of APPLLIB (undocumented),
2639 ARCHLIB PRIVLIB SITEARCH and SITELIB
2642 incpush(APPLLIB_EXP, FALSE);
2646 incpush(ARCHLIB_EXP, FALSE);
2649 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2651 incpush(PRIVLIB_EXP, FALSE);
2654 incpush(SITEARCH_EXP, FALSE);
2657 incpush(SITELIB_EXP, FALSE);
2660 incpush(".", FALSE);
2664 # define PERLLIB_SEP ';'
2667 # define PERLLIB_SEP '|'
2669 # define PERLLIB_SEP ':'
2672 #ifndef PERLLIB_MANGLE
2673 # define PERLLIB_MANGLE(s,n) (s)
2677 incpush(char *p, int addsubdirs)
2679 SV *subdir = Nullsv;
2680 static char *archpat_auto;
2686 subdir = NEWSV(55,0);
2687 if (!archpat_auto) {
2688 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2689 + sizeof("//auto"));
2690 New(55, archpat_auto, len, char);
2691 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2693 for (len = sizeof(ARCHNAME) + 2;
2694 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2695 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2700 /* Break at all separators */
2702 SV *libdir = NEWSV(55,0);
2705 /* skip any consecutive separators */
2706 while ( *p == PERLLIB_SEP ) {
2707 /* Uncomment the next line for PATH semantics */
2708 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2712 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2713 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2718 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2719 p = Nullch; /* break out */
2723 * BEFORE pushing libdir onto @INC we may first push version- and
2724 * archname-specific sub-directories.
2727 struct stat tmpstatbuf;
2732 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2734 while (unix[len-1] == '/') len--; /* Cosmetic */
2735 sv_usepvn(libdir,unix,len);
2738 PerlIO_printf(PerlIO_stderr(),
2739 "Failed to unixify @INC element \"%s\"\n",
2742 /* .../archname/version if -d .../archname/version/auto */
2743 sv_setsv(subdir, libdir);
2744 sv_catpv(subdir, archpat_auto);
2745 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2746 S_ISDIR(tmpstatbuf.st_mode))
2747 av_push(GvAVn(incgv),
2748 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2750 /* .../archname if -d .../archname/auto */
2751 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2752 strlen(patchlevel) + 1, "", 0);
2753 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2754 S_ISDIR(tmpstatbuf.st_mode))
2755 av_push(GvAVn(incgv),
2756 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2759 /* finally push this lib directory on the end of @INC */
2760 av_push(GvAVn(incgv), libdir);
2763 SvREFCNT_dec(subdir);
2767 static struct perl_thread *
2770 struct perl_thread *thr;
2773 Newz(53, thr, 1, struct perl_thread);
2774 curcop = &compiling;
2775 thr->cvcache = newHV();
2776 thr->threadsv = newAV();
2777 /* thr->threadsvp is set when find_threadsv is called */
2778 thr->specific = newAV();
2779 thr->errhv = newHV();
2780 thr->flags = THRf_R_JOINABLE;
2781 MUTEX_INIT(&thr->mutex);
2782 /* Handcraft thrsv similarly to mess_sv */
2783 New(53, thrsv, 1, SV);
2784 Newz(53, xpv, 1, XPV);
2785 SvFLAGS(thrsv) = SVt_PV;
2786 SvANY(thrsv) = (void*)xpv;
2787 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2788 SvPVX(thrsv) = (char*)thr;
2789 SvCUR_set(thrsv, sizeof(thr));
2790 SvLEN_set(thrsv, sizeof(thr));
2791 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2793 curcop = &compiling;
2796 MUTEX_LOCK(&threads_mutex);
2801 MUTEX_UNLOCK(&threads_mutex);
2803 #ifdef HAVE_THREAD_INTERN
2804 init_thread_intern(thr);
2807 #ifdef SET_THREAD_SELF
2808 SET_THREAD_SELF(thr);
2810 thr->self = pthread_self();
2811 #endif /* SET_THREAD_SELF */
2815 * These must come after the SET_THR because sv_setpvn does
2816 * SvTAINT and the taint fields require dTHR.
2818 toptarget = NEWSV(0,0);
2819 sv_upgrade(toptarget, SVt_PVFM);
2820 sv_setpvn(toptarget, "", 0);
2821 bodytarget = NEWSV(0,0);
2822 sv_upgrade(bodytarget, SVt_PVFM);
2823 sv_setpvn(bodytarget, "", 0);
2824 formtarget = bodytarget;
2825 thr->errsv = newSVpv("", 0);
2826 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
2829 #endif /* USE_THREADS */
2832 call_list(I32 oldscope, AV *list)
2835 line_t oldline = curcop->cop_line;
2840 while (AvFILL(list) >= 0) {
2841 CV *cv = (CV*)av_shift(list);
2850 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2851 (void)SvPV(atsv, len);
2854 curcop = &compiling;
2855 curcop->cop_line = oldline;
2856 if (list == beginav)
2857 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2859 sv_catpv(atsv, "END failed--cleanup aborted");
2860 while (scopestack_ix > oldscope)
2862 croak("%s", SvPVX(atsv));
2870 /* my_exit() was called */
2871 while (scopestack_ix > oldscope)
2874 curstash = defstash;
2876 call_list(oldscope, endav);
2878 curcop = &compiling;
2879 curcop->cop_line = oldline;
2881 if (list == beginav)
2882 croak("BEGIN failed--compilation aborted");
2884 croak("END failed--cleanup aborted");
2890 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2895 curcop = &compiling;
2896 curcop->cop_line = oldline;
2909 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2910 thr, (unsigned long) status));
2911 #endif /* USE_THREADS */
2920 STATUS_NATIVE_SET(status);
2927 my_failure_exit(void)
2930 if (vaxc$errno & 1) {
2931 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2932 STATUS_NATIVE_SET(44);
2935 if (!vaxc$errno && errno) /* unlikely */
2936 STATUS_NATIVE_SET(44);
2938 STATUS_NATIVE_SET(vaxc$errno);
2942 STATUS_POSIX_SET(errno);
2943 else if (STATUS_POSIX == 0)
2944 STATUS_POSIX_SET(255);
2953 register PERL_CONTEXT *cx;
2962 (void)UNLINK(e_tmpname);
2963 Safefree(e_tmpname);
2967 if (cxstack_ix >= 0) {