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);
134 thr = init_main_thread();
135 #endif /* USE_THREADS */
137 linestr = NEWSV(65,80);
138 sv_upgrade(linestr,SVt_PVIV);
140 if (!SvREADONLY(&sv_undef)) {
141 SvREADONLY_on(&sv_undef);
145 SvREADONLY_on(&sv_no);
147 sv_setpv(&sv_yes,Yes);
149 SvREADONLY_on(&sv_yes);
152 nrs = newSVpv("\n", 1);
153 rs = SvREFCNT_inc(nrs);
155 sighandlerp = sighandler;
160 * There is no way we can refer to them from Perl so close them to save
161 * space. The other alternative would be to provide STDAUX and STDPRN
164 (void)fclose(stdaux);
165 (void)fclose(stdprn);
171 perl_destruct_level = 1;
173 if(perl_destruct_level > 0)
178 lex_state = LEX_NOTPARSING;
180 start_env.je_prev = NULL;
181 start_env.je_ret = -1;
182 start_env.je_mustcatch = TRUE;
183 top_env = &start_env;
186 SET_NUMERIC_STANDARD();
187 #if defined(SUBVERSION) && SUBVERSION > 0
188 sprintf(patchlevel, "%7.5f", (double) 5
189 + ((double) PATCHLEVEL / (double) 1000)
190 + ((double) SUBVERSION / (double) 100000));
192 sprintf(patchlevel, "%5.3f", (double) 5 +
193 ((double) PATCHLEVEL / (double) 1000));
196 #if defined(LOCAL_PATCH_COUNT)
197 localpatches = local_patches; /* For possible -v */
200 PerlIO_init(); /* Hook to IO system */
202 fdpid = newAV(); /* for remembering popen pids by fd */
206 New(51,debname,128,char);
207 New(52,debdelim,128,char);
214 perl_destruct(register PerlInterpreter *sv_interp)
217 int destruct_level; /* 0=none, 1=full, 2=full with checks */
222 #endif /* USE_THREADS */
224 if (!(curinterp = sv_interp))
229 /* Pass 1 on any remaining threads: detach joinables, join zombies */
231 MUTEX_LOCK(&threads_mutex);
232 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
233 "perl_destruct: waiting for %d threads...\n",
235 for (t = thr->next; t != thr; t = t->next) {
236 MUTEX_LOCK(&t->mutex);
237 switch (ThrSTATE(t)) {
240 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
241 "perl_destruct: joining zombie %p\n", t));
242 ThrSETSTATE(t, THRf_DEAD);
243 MUTEX_UNLOCK(&t->mutex);
246 * The SvREFCNT_dec below may take a long time (e.g. av
247 * may contain an object scalar whose destructor gets
248 * called) so we have to unlock threads_mutex and start
251 MUTEX_UNLOCK(&threads_mutex);
253 SvREFCNT_dec((SV*)av);
254 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
255 "perl_destruct: joined zombie %p OK\n", t));
257 case THRf_R_JOINABLE:
258 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
259 "perl_destruct: detaching thread %p\n", t));
260 ThrSETSTATE(t, THRf_R_DETACHED);
262 * We unlock threads_mutex and t->mutex in the opposite order
263 * from which we locked them just so that DETACH won't
264 * deadlock if it panics. It's only a breach of good style
265 * not a bug since they are unlocks not locks.
267 MUTEX_UNLOCK(&threads_mutex);
269 MUTEX_UNLOCK(&t->mutex);
272 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
273 "perl_destruct: ignoring %p (state %u)\n",
275 MUTEX_UNLOCK(&t->mutex);
276 /* fall through and out */
279 /* We leave the above "Pass 1" loop with threads_mutex still locked */
281 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
284 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
285 "perl_destruct: final wait for %d threads\n",
287 COND_WAIT(&nthreads_cond, &threads_mutex);
289 /* At this point, we're the last thread */
290 MUTEX_UNLOCK(&threads_mutex);
291 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
292 MUTEX_DESTROY(&threads_mutex);
293 COND_DESTROY(&nthreads_cond);
294 #endif /* !defined(FAKE_THREADS) */
295 #endif /* USE_THREADS */
297 destruct_level = perl_destruct_level;
301 if (s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL")) {
303 if (destruct_level < i)
312 /* We must account for everything. */
314 /* Destroy the main CV and syntax tree */
316 curpad = AvARRAY(comppad);
321 SvREFCNT_dec(main_cv);
326 * Try to destruct global references. We do this first so that the
327 * destructors and destructees still exist. Some sv's might remain.
328 * Non-referenced objects are on their own.
335 /* unhook hooks which will soon be, or use, destroyed data */
336 SvREFCNT_dec(warnhook);
338 SvREFCNT_dec(diehook);
340 SvREFCNT_dec(parsehook);
343 if (destruct_level == 0){
345 DEBUG_P(debprofdump());
347 /* The exit() function will do everything that needs doing. */
351 /* loosen bonds of global variables */
354 (void)PerlIO_close(rsfp);
358 /* Filters for program text */
359 SvREFCNT_dec(rsfp_filters);
360 rsfp_filters = Nullav;
372 sawampersand = FALSE; /* must save all match strings */
373 sawstudy = FALSE; /* do fbm_instr on all strings */
388 /* magical thingies */
390 Safefree(ofs); /* $, */
393 Safefree(ors); /* $\ */
396 SvREFCNT_dec(nrs); /* $\ helper */
399 multiline = 0; /* $* */
401 SvREFCNT_dec(statname);
405 /* defgv, aka *_ should be taken care of elsewhere */
407 /* clean up after study() */
408 SvREFCNT_dec(lastscream);
410 Safefree(screamfirst);
412 Safefree(screamnext);
415 /* startup and shutdown function lists */
416 SvREFCNT_dec(beginav);
418 SvREFCNT_dec(initav);
423 /* temp stack during pp_sort() */
424 SvREFCNT_dec(sortstack);
427 /* shortcuts just get cleared */
437 /* reset so print() ends up where we expect */
440 /* Prepare to destruct main symbol table. */
447 if (destruct_level >= 2) {
448 if (scopestack_ix != 0)
449 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
450 (long)scopestack_ix);
451 if (savestack_ix != 0)
452 warn("Unbalanced saves: %ld more saves than restores\n",
454 if (tmps_floor != -1)
455 warn("Unbalanced tmps: %ld more allocs than frees\n",
456 (long)tmps_floor + 1);
457 if (cxstack_ix != -1)
458 warn("Unbalanced context: %ld more PUSHes than POPs\n",
459 (long)cxstack_ix + 1);
462 /* Now absolutely destruct everything, somehow or other, loops or no. */
464 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
465 while (sv_count != 0 && sv_count != last_sv_count) {
466 last_sv_count = sv_count;
469 SvFLAGS(strtab) &= ~SVTYPEMASK;
470 SvFLAGS(strtab) |= SVt_PVHV;
472 /* Destruct the global string table. */
474 /* Yell and reset the HeVAL() slots that are still holding refcounts,
475 * so that sv_free() won't fail on them.
484 array = HvARRAY(strtab);
488 warn("Unbalanced string table refcount: (%d) for \"%s\"",
489 HeVAL(hent) - Nullsv, HeKEY(hent));
490 HeVAL(hent) = Nullsv;
500 SvREFCNT_dec(strtab);
503 warn("Scalars leaked: %ld\n", (long)sv_count);
507 /* No SVs have survived, need to clean out */
511 Safefree(origfilename);
513 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
515 DEBUG_P(debprofdump());
517 MUTEX_DESTROY(&sv_mutex);
518 MUTEX_DESTROY(&eval_mutex);
519 COND_DESTROY(&eval_cond);
521 /* As the penultimate thing, free the non-arena SV for thrsv */
522 Safefree(SvPVX(thrsv));
523 Safefree(SvANY(thrsv));
526 #endif /* USE_THREADS */
528 /* As the absolutely last thing, free the non-arena SV for mess() */
531 /* we know that type >= SVt_PV */
533 Safefree(SvPVX(mess_sv));
534 Safefree(SvANY(mess_sv));
541 perl_free(PerlInterpreter *sv_interp)
543 if (!(curinterp = sv_interp))
549 perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
554 char *scriptname = NULL;
555 VOL bool dosearch = FALSE;
562 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
565 croak("suidperl is no longer needed since the kernel can now execute\n\
566 setuid perl scripts securely.\n");
570 if (!(curinterp = sv_interp))
573 #if defined(NeXT) && defined(__DYNAMIC__)
574 _dyld_lookup_and_bind
575 ("__environ", (unsigned long *) &environ_pointer, NULL);
580 #ifndef VMS /* VMS doesn't have environ array */
581 origenviron = environ;
587 /* Come here if running an undumped a.out. */
589 origfilename = savepv(argv[0]);
591 cxstack_ix = -1; /* start label stack again */
593 init_postdump_symbols(argc,argv,env);
598 curpad = AvARRAY(comppad);
603 SvREFCNT_dec(main_cv);
607 oldscope = scopestack_ix;
615 /* my_exit() was called */
616 while (scopestack_ix > oldscope)
621 call_list(oldscope, endav);
623 return STATUS_NATIVE_EXPORT;
626 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
630 sv_setpvn(linestr,"",0);
631 sv = newSVpv("",0); /* first used for -I flags */
635 for (argc--,argv++; argc > 0; argc--,argv++) {
636 if (argv[0][0] != '-' || !argv[0][1])
640 validarg = " PHOOEY ";
665 if (s = moreswitches(s))
675 if (euid != uid || egid != gid)
676 croak("No -e allowed in setuid scripts");
678 e_tmpname = savepv(TMPPATH);
679 (void)PerlLIO_mktemp(e_tmpname);
681 croak("Can't mktemp()");
682 e_fp = PerlIO_open(e_tmpname,"w");
684 croak("Cannot open temporary file");
689 PerlIO_puts(e_fp,argv[1]);
693 croak("No code specified for -e");
694 (void)PerlIO_putc(e_fp,'\n');
696 case 'I': /* -I handled both here and in moreswitches() */
698 if (!*++s && (s=argv[1]) != Nullch) {
701 while (s && isSPACE(*s))
705 for (e = s; *e && !isSPACE(*e); e++) ;
712 } /* XXX else croak? */
726 preambleav = newAV();
727 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
729 Sv = newSVpv("print myconfig();",0);
731 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
733 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
735 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
736 sv_catpv(Sv,"\" Compile-time options:");
738 sv_catpv(Sv," DEBUGGING");
741 sv_catpv(Sv," NO_EMBED");
744 sv_catpv(Sv," MULTIPLICITY");
746 sv_catpv(Sv,"\\n\",");
748 #if defined(LOCAL_PATCH_COUNT)
749 if (LOCAL_PATCH_COUNT > 0) {
751 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
752 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
754 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
758 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
761 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
763 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
768 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
769 print \" \\%ENV:\\n @env\\n\" if @env; \
770 print \" \\@INC:\\n @INC\\n\";");
773 Sv = newSVpv("config_vars(qw(",0);
778 av_push(preambleav, Sv);
779 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
790 if (!*++s || isSPACE(*s)) {
794 /* catch use of gnu style long options */
795 if (strEQ(s, "version")) {
799 if (strEQ(s, "help")) {
806 croak("Unrecognized switch: -%s (-h will show valid options)",s);
811 if (!tainting && (s = PerlEnv_getenv("PERL5OPT"))) {
822 if (!strchr("DIMUdmw", *s))
823 croak("Illegal switch in PERL5OPT: -%c", *s);
829 scriptname = argv[0];
831 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
833 warn("Did you forget to compile with -DMULTIPLICITY?");
835 croak("Can't write to temp file for -e: %s", Strerror(errno));
839 scriptname = e_tmpname;
841 else if (scriptname == Nullch) {
843 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
851 open_script(scriptname,dosearch,sv);
853 validate_suid(validarg, scriptname);
858 main_cv = compcv = (CV*)NEWSV(1104,0);
859 sv_upgrade((SV *)compcv, SVt_PVCV);
863 av_push(comppad, Nullsv);
864 curpad = AvARRAY(comppad);
865 comppad_name = newAV();
866 comppad_name_fill = 0;
867 min_intro_pending = 0;
870 av_store(comppad_name, 0, newSVpv("@_", 2));
871 curpad[0] = (SV*)newAV();
872 SvPADMY_on(curpad[0]); /* XXX Needed? */
874 New(666, CvMUTEXP(compcv), 1, perl_mutex);
875 MUTEX_INIT(CvMUTEXP(compcv));
876 #endif /* USE_THREADS */
878 comppadlist = newAV();
879 AvREAL_off(comppadlist);
880 av_store(comppadlist, 0, (SV*)comppad_name);
881 av_store(comppadlist, 1, (SV*)comppad);
882 CvPADLIST(compcv) = comppadlist;
884 boot_core_UNIVERSAL();
886 (*xsinit)(); /* in case linked C routines want magical variables */
887 #if defined(VMS) || defined(WIN32) || defined(DJGPP)
891 init_predump_symbols();
893 init_postdump_symbols(argc,argv,env);
897 /* now parse the script */
899 SETERRNO(0,SS$_NORMAL);
901 if (yyparse() || error_count) {
903 croak("%s had compilation errors.\n", origfilename);
905 croak("Execution of %s aborted due to compilation errors.\n",
909 curcop->cop_line = 0;
913 (void)UNLINK(e_tmpname);
918 /* now that script is parsed, we can modify record separator */
920 rs = SvREFCNT_inc(nrs);
921 sv_setsv(perl_get_sv("/", TRUE), rs);
932 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
933 dump_mstats("after compilation:");
943 perl_run(PerlInterpreter *sv_interp)
950 if (!(curinterp = sv_interp))
953 oldscope = scopestack_ix;
958 cxstack_ix = -1; /* start context stack again */
961 /* my_exit() was called */
962 while (scopestack_ix > oldscope)
967 call_list(oldscope, endav);
969 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
970 dump_mstats("after execution: ");
973 return STATUS_NATIVE_EXPORT;
976 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
981 if (curstack != mainstack) {
983 SWITCHSTACK(curstack, mainstack);
988 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
989 sawampersand ? "Enabling" : "Omitting"));
993 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
995 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
996 (unsigned long) thr));
997 #endif /* USE_THREADS */
1000 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1003 if (PERLDB_SINGLE && DBsingle)
1004 sv_setiv(DBsingle, 1);
1006 call_list(oldscope, initav);
1016 else if (main_start) {
1017 CvDEPTH(main_cv) = 1;
1028 perl_get_sv(char *name, I32 create)
1032 if (name[1] == '\0' && !isALPHA(name[0])) {
1033 PADOFFSET tmp = find_threadsv(name);
1034 if (tmp != NOT_IN_PAD) {
1036 return THREADSV(tmp);
1039 #endif /* USE_THREADS */
1040 gv = gv_fetchpv(name, create, SVt_PV);
1047 perl_get_av(char *name, I32 create)
1049 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1058 perl_get_hv(char *name, I32 create)
1060 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1069 perl_get_cv(char *name, I32 create)
1071 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1072 if (create && !GvCVu(gv))
1073 return newSUB(start_subparse(FALSE, 0),
1074 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1082 /* Be sure to refetch the stack pointer after calling these routines. */
1085 perl_call_argv(char *sub_name, I32 flags, register char **argv)
1087 /* See G_* flags in cop.h */
1088 /* null terminated arg list */
1095 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1100 return perl_call_pv(sub_name, flags);
1104 perl_call_pv(char *sub_name, I32 flags)
1105 /* name of the subroutine */
1106 /* See G_* flags in cop.h */
1108 return perl_call_sv((SV*)perl_get_cv(sub_name, TRUE), flags);
1112 perl_call_method(char *methname, I32 flags)
1113 /* name of the subroutine */
1114 /* See G_* flags in cop.h */
1120 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1123 return perl_call_sv(*stack_sp--, flags);
1126 /* May be called with any of a CV, a GV, or an SV containing the name. */
1128 perl_call_sv(SV *sv, I32 flags)
1130 /* See G_* flags in cop.h */
1133 LOGOP myop; /* fake syntax tree node */
1139 bool oldcatch = CATCH_GET;
1144 if (flags & G_DISCARD) {
1149 Zero(&myop, 1, LOGOP);
1150 myop.op_next = Nullop;
1151 if (!(flags & G_NOARGS))
1152 myop.op_flags |= OPf_STACKED;
1153 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1154 (flags & G_ARRAY) ? OPf_WANT_LIST :
1159 EXTEND(stack_sp, 1);
1162 oldscope = scopestack_ix;
1164 if (PERLDB_SUB && curstash != debstash
1165 /* Handle first BEGIN of -d. */
1166 && (DBcv || (DBcv = GvCV(DBsub)))
1167 /* Try harder, since this may have been a sighandler, thus
1168 * curstash may be meaningless. */
1169 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1170 op->op_private |= OPpENTERSUB_DB;
1172 if (flags & G_EVAL) {
1173 cLOGOP->op_other = op;
1175 /* we're trying to emulate pp_entertry() here */
1177 register PERL_CONTEXT *cx;
1178 I32 gimme = GIMME_V;
1183 push_return(op->op_next);
1184 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1186 eval_root = op; /* Only needed so that goto works right. */
1189 if (flags & G_KEEPERR)
1204 /* my_exit() was called */
1205 curstash = defstash;
1209 croak("Callback called exit");
1218 stack_sp = stack_base + oldmark;
1219 if (flags & G_ARRAY)
1223 *++stack_sp = &sv_undef;
1231 if (op == (OP*)&myop)
1232 op = pp_entersub(ARGS);
1235 retval = stack_sp - (stack_base + oldmark);
1236 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1240 if (flags & G_EVAL) {
1241 if (scopestack_ix > oldscope) {
1245 register PERL_CONTEXT *cx;
1257 CATCH_SET(oldcatch);
1259 if (flags & G_DISCARD) {
1260 stack_sp = stack_base + oldmark;
1269 /* Eval a string. The G_EVAL flag is always assumed. */
1272 perl_eval_sv(SV *sv, I32 flags)
1274 /* See G_* flags in cop.h */
1277 UNOP myop; /* fake syntax tree node */
1279 I32 oldmark = sp - stack_base;
1286 if (flags & G_DISCARD) {
1294 EXTEND(stack_sp, 1);
1296 oldscope = scopestack_ix;
1298 if (!(flags & G_NOARGS))
1299 myop.op_flags = OPf_STACKED;
1300 myop.op_next = Nullop;
1301 myop.op_type = OP_ENTEREVAL;
1302 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1303 (flags & G_ARRAY) ? OPf_WANT_LIST :
1305 if (flags & G_KEEPERR)
1306 myop.op_flags |= OPf_SPECIAL;
1316 /* my_exit() was called */
1317 curstash = defstash;
1321 croak("Callback called exit");
1330 stack_sp = stack_base + oldmark;
1331 if (flags & G_ARRAY)
1335 *++stack_sp = &sv_undef;
1340 if (op == (OP*)&myop)
1341 op = pp_entereval(ARGS);
1344 retval = stack_sp - (stack_base + oldmark);
1345 if (!(flags & G_KEEPERR))
1350 if (flags & G_DISCARD) {
1351 stack_sp = stack_base + oldmark;
1361 perl_eval_pv(char *p, I32 croak_on_error)
1364 SV* sv = newSVpv(p, 0);
1367 perl_eval_sv(sv, G_SCALAR);
1374 if (croak_on_error && SvTRUE(ERRSV))
1375 croak(SvPVx(ERRSV, na));
1380 /* Require a module. */
1383 perl_require_pv(char *pv)
1385 SV* sv = sv_newmortal();
1386 sv_setpv(sv, "require '");
1389 perl_eval_sv(sv, G_DISCARD);
1393 magicname(char *sym, char *name, I32 namlen)
1397 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1398 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1402 usage(char *name) /* XXX move this out into a module ? */
1405 /* This message really ought to be max 23 lines.
1406 * Removed -h because the user already knows that opton. Others? */
1408 static char *usage[] = {
1409 "-0[octal] specify record separator (\\0, if no argument)",
1410 "-a autosplit mode with -n or -p (splits $_ into @F)",
1411 "-c check syntax only (runs BEGIN and END blocks)",
1412 "-d[:debugger] run scripts under debugger",
1413 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1414 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1415 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1416 "-i[extension] edit <> files in place (make backup if extension supplied)",
1417 "-Idirectory specify @INC/#include directory (may be used more than once)",
1418 "-l[octal] enable line ending processing, specifies line terminator",
1419 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1420 "-n assume 'while (<>) { ... }' loop around your script",
1421 "-p assume loop like -n but print line also like sed",
1422 "-P run script through C preprocessor before compilation",
1423 "-s enable some switch parsing for switches after script name",
1424 "-S look for the script using PATH environment variable",
1425 "-T turn on tainting checks",
1426 "-u dump core after parsing script",
1427 "-U allow unsafe operations",
1428 "-v print version number and patchlevel of perl",
1429 "-V[:variable] print perl configuration information",
1430 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1431 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1437 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1439 printf("\n %s", *p++);
1442 /* This routine handles any switches that can be given during run */
1445 moreswitches(char *s)
1454 rschar = scan_oct(s, 4, &numlen);
1456 if (rschar & ~((U8)~0))
1458 else if (!rschar && numlen >= 2)
1459 nrs = newSVpv("", 0);
1462 nrs = newSVpv(&ch, 1);
1468 splitstr = savepv(s + 1);
1482 if (*s == ':' || *s == '=') {
1483 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1487 perldb = PERLDB_ALL;
1494 if (isALPHA(s[1])) {
1495 static char debopts[] = "psltocPmfrxuLHXD";
1498 for (s++; *s && (d = strchr(debopts,*s)); s++)
1499 debug |= 1 << (d - debopts);
1503 for (s++; isDIGIT(*s); s++) ;
1505 debug |= 0x80000000;
1507 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1508 for (s++; isALNUM(*s); s++) ;
1518 inplace = savepv(s+1);
1520 for (s = inplace; *s && !isSPACE(*s); s++) ;
1524 case 'I': /* -I handled both here and in parse_perl() */
1527 while (*s && isSPACE(*s))
1531 for (e = s; *e && !isSPACE(*e); e++) ;
1532 p = savepvn(s, e-s);
1538 croak("No space allowed after -I");
1548 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1558 ors = SvPV(nrs, orslen);
1559 ors = savepvn(ors, orslen);
1563 forbid_setid("-M"); /* XXX ? */
1566 forbid_setid("-m"); /* XXX ? */
1571 /* -M-foo == 'no foo' */
1572 if (*s == '-') { use = "no "; ++s; }
1573 sv = newSVpv(use,0);
1575 /* We allow -M'Module qw(Foo Bar)' */
1576 while(isALNUM(*s) || *s==':') ++s;
1578 sv_catpv(sv, start);
1579 if (*(start-1) == 'm') {
1581 croak("Can't use '%c' after -mname", *s);
1582 sv_catpv( sv, " ()");
1585 sv_catpvn(sv, start, s-start);
1586 sv_catpv(sv, " split(/,/,q{");
1591 if (preambleav == NULL)
1592 preambleav = newAV();
1593 av_push(preambleav, sv);
1596 croak("No space allowed after -%c", *(s-1));
1613 croak("Too late for \"-T\" option");
1625 #if defined(SUBVERSION) && SUBVERSION > 0
1626 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1627 PATCHLEVEL, SUBVERSION, ARCHNAME);
1629 printf("\nThis is perl, version %s built for %s",
1630 patchlevel, ARCHNAME);
1632 #if defined(LOCAL_PATCH_COUNT)
1633 if (LOCAL_PATCH_COUNT > 0)
1634 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1635 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1638 printf("\n\nCopyright 1987-1998, Larry Wall\n");
1640 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1643 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1644 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1998\n");
1647 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1648 "Version 5 port Copyright (c) 1994-1998, Andreas Kaiser, Ilya Zakharevich\n");
1651 printf("atariST series port, ++jrb bammi@cadence.com\n");
1654 Perl may be copied only under the terms of either the Artistic License or the\n\
1655 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1663 if (s[1] == '-') /* Additional switches on #! line. */
1674 #ifdef ALTERNATE_SHEBANG
1675 case 'S': /* OS/2 needs -S on "extproc" line. */
1683 croak("Can't emulate -%.1s on #! line",s);
1688 /* compliments of Tom Christiansen */
1690 /* unexec() can be found in the Gnu emacs distribution */
1701 prog = newSVpv(BIN_EXP);
1702 sv_catpv(prog, "/perl");
1703 file = newSVpv(origfilename);
1704 sv_catpv(file, ".perldump");
1706 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1708 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1709 SvPVX(prog), SvPVX(file));
1710 PerlProc_exit(status);
1713 # include <lib$routines.h>
1714 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1716 ABORT(); /* for use with undump */
1722 init_main_stash(void)
1727 /* Note that strtab is a rather special HV. Assumptions are made
1728 about not iterating on it, and not adding tie magic to it.
1729 It is properly deallocated in perl_destruct() */
1731 HvSHAREKEYS_off(strtab); /* mandatory */
1732 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1733 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1735 curstash = defstash = newHV();
1736 curstname = newSVpv("main",4);
1737 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1738 SvREFCNT_dec(GvHV(gv));
1739 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1741 HvNAME(defstash) = savepv("main");
1742 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1744 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1745 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1747 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1748 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1749 sv_setpvn(ERRSV, "", 0);
1750 curstash = defstash;
1751 compiling.cop_stash = defstash;
1752 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1753 globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
1754 /* We must init $/ before switches are processed. */
1755 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1759 open_script(char *scriptname, bool dosearch, SV *sv)
1762 char *xfound = Nullch;
1763 char *xfailed = Nullch;
1767 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1768 # define SEARCH_EXTS ".bat", ".cmd", NULL
1769 # define MAX_EXT_LEN 4
1772 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1773 # define MAX_EXT_LEN 4
1776 # define SEARCH_EXTS ".pl", ".com", NULL
1777 # define MAX_EXT_LEN 4
1779 /* additional extensions to try in each dir if scriptname not found */
1781 char *ext[] = { SEARCH_EXTS };
1782 int extidx = 0, i = 0;
1783 char *curext = Nullch;
1785 # define MAX_EXT_LEN 0
1789 * If dosearch is true and if scriptname does not contain path
1790 * delimiters, search the PATH for scriptname.
1792 * If SEARCH_EXTS is also defined, will look for each
1793 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1794 * while searching the PATH.
1796 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1797 * proceeds as follows:
1798 * If DOSISH or VMSISH:
1799 * + look for ./scriptname{,.foo,.bar}
1800 * + search the PATH for scriptname{,.foo,.bar}
1803 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1804 * this will not look in '.' if it's not in the PATH)
1808 # ifdef ALWAYS_DEFTYPES
1809 len = strlen(scriptname);
1810 if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
1811 int hasdir, idx = 0, deftypes = 1;
1814 hasdir = !dosearch || (strpbrk(scriptname,":[</") != Nullch) ;
1817 int hasdir, idx = 0, deftypes = 1;
1820 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1822 /* The first time through, just add SEARCH_EXTS to whatever we
1823 * already have, so we can check for default file types. */
1825 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1831 if ((strlen(tokenbuf) + strlen(scriptname)
1832 + MAX_EXT_LEN) >= sizeof tokenbuf)
1833 continue; /* don't search dir with too-long name */
1834 strcat(tokenbuf, scriptname);
1838 if (strEQ(scriptname, "-"))
1840 if (dosearch) { /* Look in '.' first. */
1841 char *cur = scriptname;
1843 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1845 if (strEQ(ext[i++],curext)) {
1846 extidx = -1; /* already has an ext */
1851 DEBUG_p(PerlIO_printf(Perl_debug_log,
1852 "Looking for %s\n",cur));
1853 if (Stat(cur,&statbuf) >= 0) {
1861 if (cur == scriptname) {
1862 len = strlen(scriptname);
1863 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1865 cur = strcpy(tokenbuf, scriptname);
1867 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1868 && strcpy(tokenbuf+len, ext[extidx++]));
1873 if (dosearch && !strchr(scriptname, '/')
1875 && !strchr(scriptname, '\\')
1877 && (s = PerlEnv_getenv("PATH"))) {
1880 bufend = s + strlen(s);
1881 while (s < bufend) {
1882 #if defined(atarist) || defined(DOSISH)
1887 && *s != ';'; len++, s++) {
1888 if (len < sizeof tokenbuf)
1891 if (len < sizeof tokenbuf)
1892 tokenbuf[len] = '\0';
1893 #else /* ! (atarist || DOSISH) */
1894 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1897 #endif /* ! (atarist || DOSISH) */
1900 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1901 continue; /* don't search dir with too-long name */
1903 #if defined(atarist) || defined(DOSISH)
1904 && tokenbuf[len - 1] != '/'
1905 && tokenbuf[len - 1] != '\\'
1908 tokenbuf[len++] = '/';
1909 if (len == 2 && tokenbuf[0] == '.')
1911 (void)strcpy(tokenbuf + len, scriptname);
1915 len = strlen(tokenbuf);
1916 if (extidx > 0) /* reset after previous loop */
1920 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1921 retval = Stat(tokenbuf,&statbuf);
1923 } while ( retval < 0 /* not there */
1924 && extidx>=0 && ext[extidx] /* try an extension? */
1925 && strcpy(tokenbuf+len, ext[extidx++])
1930 if (S_ISREG(statbuf.st_mode)
1931 && cando(S_IRUSR,TRUE,&statbuf)
1933 && cando(S_IXUSR,TRUE,&statbuf)
1937 xfound = tokenbuf; /* bingo! */
1941 xfailed = savepv(tokenbuf);
1944 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1946 seen_dot = 1; /* Disable message. */
1948 croak("Can't %s %s%s%s",
1949 (xfailed ? "execute" : "find"),
1950 (xfailed ? xfailed : scriptname),
1951 (xfailed ? "" : " on PATH"),
1952 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1955 scriptname = xfound;
1958 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1959 char *s = scriptname + 8;
1968 origfilename = savepv(e_tmpname ? "-e" : scriptname);
1969 curcop->cop_filegv = gv_fetchfile(origfilename);
1970 if (strEQ(origfilename,"-"))
1972 if (fdscript >= 0) {
1973 rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
1974 #if defined(HAS_FCNTL) && defined(F_SETFD)
1976 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
1979 else if (preprocess) {
1980 char *cpp_cfg = CPPSTDIN;
1981 SV *cpp = NEWSV(0,0);
1982 SV *cmd = NEWSV(0,0);
1984 if (strEQ(cpp_cfg, "cppstdin"))
1985 sv_catpvf(cpp, "%s/", BIN_EXP);
1986 sv_catpv(cpp, cpp_cfg);
1989 sv_catpv(sv,PRIVLIB_EXP);
1993 sed %s -e \"/^[^#]/b\" \
1994 -e \"/^#[ ]*include[ ]/b\" \
1995 -e \"/^#[ ]*define[ ]/b\" \
1996 -e \"/^#[ ]*if[ ]/b\" \
1997 -e \"/^#[ ]*ifdef[ ]/b\" \
1998 -e \"/^#[ ]*ifndef[ ]/b\" \
1999 -e \"/^#[ ]*else/b\" \
2000 -e \"/^#[ ]*elif[ ]/b\" \
2001 -e \"/^#[ ]*undef[ ]/b\" \
2002 -e \"/^#[ ]*endif/b\" \
2005 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2008 %s %s -e '/^[^#]/b' \
2009 -e '/^#[ ]*include[ ]/b' \
2010 -e '/^#[ ]*define[ ]/b' \
2011 -e '/^#[ ]*if[ ]/b' \
2012 -e '/^#[ ]*ifdef[ ]/b' \
2013 -e '/^#[ ]*ifndef[ ]/b' \
2014 -e '/^#[ ]*else/b' \
2015 -e '/^#[ ]*elif[ ]/b' \
2016 -e '/^#[ ]*undef[ ]/b' \
2017 -e '/^#[ ]*endif/b' \
2025 (doextract ? "-e '1,/^#/d\n'" : ""),
2027 scriptname, cpp, sv, CPPMINUS);
2029 #ifdef IAMSUID /* actually, this is caught earlier */
2030 if (euid != uid && !euid) { /* if running suidperl */
2032 (void)seteuid(uid); /* musn't stay setuid root */
2035 (void)setreuid((Uid_t)-1, uid);
2037 #ifdef HAS_SETRESUID
2038 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2044 if (geteuid() != uid)
2045 croak("Can't do seteuid!\n");
2047 #endif /* IAMSUID */
2048 rsfp = PerlProc_popen(SvPVX(cmd), "r");
2052 else if (!*scriptname) {
2053 forbid_setid("program input from stdin");
2054 rsfp = PerlIO_stdin();
2057 rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2058 #if defined(HAS_FCNTL) && defined(F_SETFD)
2060 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2068 #ifndef IAMSUID /* in case script is not readable before setuid */
2069 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2070 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2072 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2073 croak("Can't do setuid\n");
2077 croak("Can't open perl script \"%s\": %s\n",
2078 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2083 validate_suid(char *validarg, char *scriptname)
2087 /* do we need to emulate setuid on scripts? */
2089 /* This code is for those BSD systems that have setuid #! scripts disabled
2090 * in the kernel because of a security problem. Merely defining DOSUID
2091 * in perl will not fix that problem, but if you have disabled setuid
2092 * scripts in the kernel, this will attempt to emulate setuid and setgid
2093 * on scripts that have those now-otherwise-useless bits set. The setuid
2094 * root version must be called suidperl or sperlN.NNN. If regular perl
2095 * discovers that it has opened a setuid script, it calls suidperl with
2096 * the same argv that it had. If suidperl finds that the script it has
2097 * just opened is NOT setuid root, it sets the effective uid back to the
2098 * uid. We don't just make perl setuid root because that loses the
2099 * effective uid we had before invoking perl, if it was different from the
2102 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2103 * be defined in suidperl only. suidperl must be setuid root. The
2104 * Configure script will set this up for you if you want it.
2111 if (PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2112 croak("Can't stat script \"%s\"",origfilename);
2113 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2117 #ifndef HAS_SETREUID
2118 /* On this access check to make sure the directories are readable,
2119 * there is actually a small window that the user could use to make
2120 * filename point to an accessible directory. So there is a faint
2121 * chance that someone could execute a setuid script down in a
2122 * non-accessible directory. I don't know what to do about that.
2123 * But I don't think it's too important. The manual lies when
2124 * it says access() is useful in setuid programs.
2126 if (PerlLIO_access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2127 croak("Permission denied");
2129 /* If we can swap euid and uid, then we can determine access rights
2130 * with a simple stat of the file, and then compare device and
2131 * inode to make sure we did stat() on the same file we opened.
2132 * Then we just have to make sure he or she can execute it.
2135 struct stat tmpstatbuf;
2139 setreuid(euid,uid) < 0
2142 setresuid(euid,uid,(Uid_t)-1) < 0
2145 || getuid() != euid || geteuid() != uid)
2146 croak("Can't swap uid and euid"); /* really paranoid */
2147 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2148 croak("Permission denied"); /* testing full pathname here */
2149 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2150 tmpstatbuf.st_ino != statbuf.st_ino) {
2151 (void)PerlIO_close(rsfp);
2152 if (rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
2154 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2155 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2156 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2157 (long)statbuf.st_dev, (long)statbuf.st_ino,
2158 SvPVX(GvSV(curcop->cop_filegv)),
2159 (long)statbuf.st_uid, (long)statbuf.st_gid);
2160 (void)PerlProc_pclose(rsfp);
2162 croak("Permission denied\n");
2166 setreuid(uid,euid) < 0
2168 # if defined(HAS_SETRESUID)
2169 setresuid(uid,euid,(Uid_t)-1) < 0
2172 || getuid() != uid || geteuid() != euid)
2173 croak("Can't reswap uid and euid");
2174 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2175 croak("Permission denied\n");
2177 #endif /* HAS_SETREUID */
2178 #endif /* IAMSUID */
2180 if (!S_ISREG(statbuf.st_mode))
2181 croak("Permission denied");
2182 if (statbuf.st_mode & S_IWOTH)
2183 croak("Setuid/gid script is writable by world");
2184 doswitches = FALSE; /* -s is insecure in suid */
2186 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2187 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2188 croak("No #! line");
2189 s = SvPV(linestr,na)+2;
2191 while (!isSPACE(*s)) s++;
2192 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2193 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2194 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2195 croak("Not a perl script");
2196 while (*s == ' ' || *s == '\t') s++;
2198 * #! arg must be what we saw above. They can invoke it by
2199 * mentioning suidperl explicitly, but they may not add any strange
2200 * arguments beyond what #! says if they do invoke suidperl that way.
2202 len = strlen(validarg);
2203 if (strEQ(validarg," PHOOEY ") ||
2204 strnNE(s,validarg,len) || !isSPACE(s[len]))
2205 croak("Args must match #! line");
2208 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2209 euid == statbuf.st_uid)
2211 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2212 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2213 #endif /* IAMSUID */
2215 if (euid) { /* oops, we're not the setuid root perl */
2216 (void)PerlIO_close(rsfp);
2219 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2221 croak("Can't do setuid\n");
2224 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2226 (void)setegid(statbuf.st_gid);
2229 (void)setregid((Gid_t)-1,statbuf.st_gid);
2231 #ifdef HAS_SETRESGID
2232 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2234 setgid(statbuf.st_gid);
2238 if (getegid() != statbuf.st_gid)
2239 croak("Can't do setegid!\n");
2241 if (statbuf.st_mode & S_ISUID) {
2242 if (statbuf.st_uid != euid)
2244 (void)seteuid(statbuf.st_uid); /* all that for this */
2247 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2249 #ifdef HAS_SETRESUID
2250 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2252 setuid(statbuf.st_uid);
2256 if (geteuid() != statbuf.st_uid)
2257 croak("Can't do seteuid!\n");
2259 else if (uid) { /* oops, mustn't run as root */
2261 (void)seteuid((Uid_t)uid);
2264 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2266 #ifdef HAS_SETRESUID
2267 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2273 if (geteuid() != uid)
2274 croak("Can't do seteuid!\n");
2277 if (!cando(S_IXUSR,TRUE,&statbuf))
2278 croak("Permission denied\n"); /* they can't do this */
2281 else if (preprocess)
2282 croak("-P not allowed for setuid/setgid script\n");
2283 else if (fdscript >= 0)
2284 croak("fd script not allowed in suidperl\n");
2286 croak("Script is not setuid/setgid in suidperl\n");
2288 /* We absolutely must clear out any saved ids here, so we */
2289 /* exec the real perl, substituting fd script for scriptname. */
2290 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2291 PerlIO_rewind(rsfp);
2292 PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2293 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2294 if (!origargv[which])
2295 croak("Permission denied");
2296 origargv[which] = savepv(form("/dev/fd/%d/%s",
2297 PerlIO_fileno(rsfp), origargv[which]));
2298 #if defined(HAS_FCNTL) && defined(F_SETFD)
2299 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2301 PerlProc_execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2302 croak("Can't do setuid\n");
2303 #endif /* IAMSUID */
2305 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2306 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2308 PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2309 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2311 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2314 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2315 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2316 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2317 /* not set-id, must be wrapped */
2323 find_beginning(void)
2325 register char *s, *s2;
2327 /* skip forward in input to the real script? */
2331 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2332 croak("No Perl script found in input\n");
2333 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2334 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2336 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2338 while (*s == ' ' || *s == '\t') s++;
2340 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2341 if (strnEQ(s2-4,"perl",4))
2343 while (s = moreswitches(s)) ;
2345 if (cddir && PerlDir_chdir(cddir) < 0)
2346 croak("Can't chdir to %s",cddir);
2354 uid = (int)getuid();
2355 euid = (int)geteuid();
2356 gid = (int)getgid();
2357 egid = (int)getegid();
2362 tainting |= (uid && (euid != uid || egid != gid));
2366 forbid_setid(char *s)
2369 croak("No %s allowed while running setuid", s);
2371 croak("No %s allowed while running setgid", s);
2378 curstash = debstash;
2379 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2381 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2382 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2383 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2384 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2385 sv_setiv(DBsingle, 0);
2386 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2387 sv_setiv(DBtrace, 0);
2388 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2389 sv_setiv(DBsignal, 0);
2390 curstash = defstash;
2394 init_stacks(ARGSproto)
2397 mainstack = curstack; /* remember in case we switch stacks */
2398 AvREAL_off(curstack); /* not a real array */
2399 av_extend(curstack,127);
2401 stack_base = AvARRAY(curstack);
2402 stack_sp = stack_base;
2403 stack_max = stack_base + 127;
2405 cxstack_max = 8192 / sizeof(PERL_CONTEXT) - 2; /* Use most of 8K. */
2406 New(50,cxstack,cxstack_max + 1,PERL_CONTEXT);
2409 New(50,tmps_stack,128,SV*);
2415 * The following stacks almost certainly should be per-interpreter,
2416 * but for now they're not. XXX
2420 markstack_ptr = markstack;
2422 New(54,markstack,64,I32);
2423 markstack_ptr = markstack;
2424 markstack_max = markstack + 64;
2430 New(54,scopestack,32,I32);
2432 scopestack_max = 32;
2438 New(54,savestack,128,ANY);
2440 savestack_max = 128;
2446 New(54,retstack,16,OP*);
2457 Safefree(tmps_stack);
2464 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2473 subname = newSVpv("main",4);
2477 init_predump_symbols(void)
2483 sv_setpvn(perl_get_sv("\"", TRUE), " ", 1);
2484 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2485 GvMULTI_on(stdingv);
2486 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2487 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2489 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2491 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2493 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2495 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2497 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2499 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2500 GvMULTI_on(othergv);
2501 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2502 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2504 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2506 statname = NEWSV(66,0); /* last filename we did stat on */
2509 osname = savepv(OSNAME);
2513 init_postdump_symbols(register int argc, register char **argv, register char **env)
2520 argc--,argv++; /* skip name of script */
2522 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2525 if (argv[0][1] == '-') {
2529 if (s = strchr(argv[0], '=')) {
2531 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2534 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2537 toptarget = NEWSV(0,0);
2538 sv_upgrade(toptarget, SVt_PVFM);
2539 sv_setpvn(toptarget, "", 0);
2540 bodytarget = NEWSV(0,0);
2541 sv_upgrade(bodytarget, SVt_PVFM);
2542 sv_setpvn(bodytarget, "", 0);
2543 formtarget = bodytarget;
2546 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2547 sv_setpv(GvSV(tmpgv),origfilename);
2548 magicname("0", "0", 1);
2550 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2551 sv_setpv(GvSV(tmpgv),origargv[0]);
2552 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2554 (void)gv_AVadd(argvgv);
2555 av_clear(GvAVn(argvgv));
2556 for (; argc > 0; argc--,argv++) {
2557 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2560 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2564 hv_magic(hv, envgv, 'E');
2565 #ifndef VMS /* VMS doesn't have environ array */
2566 /* Note that if the supplied env parameter is actually a copy
2567 of the global environ then it may now point to free'd memory
2568 if the environment has been modified since. To avoid this
2569 problem we treat env==NULL as meaning 'use the default'
2574 environ[0] = Nullch;
2575 for (; *env; env++) {
2576 if (!(s = strchr(*env,'=')))
2579 #if defined(WIN32) || defined(MSDOS)
2582 sv = newSVpv(s--,0);
2583 (void)hv_store(hv, *env, s - *env, sv, 0);
2585 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2586 /* Sins of the RTL. See note in my_setenv(). */
2587 (void)PerlEnv_putenv(savepv(*env));
2591 #ifdef DYNAMIC_ENV_FETCH
2592 HvNAME(hv) = savepv(ENV_HV_NAME);
2596 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2597 sv_setiv(GvSV(tmpgv), (IV)getpid());
2606 s = PerlEnv_getenv("PERL5LIB");
2610 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
2612 /* Treat PERL5?LIB as a possible search list logical name -- the
2613 * "natural" VMS idiom for a Unix path string. We allow each
2614 * element to be a set of |-separated directories for compatibility.
2618 if (my_trnlnm("PERL5LIB",buf,0))
2619 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2621 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2625 /* Use the ~-expanded versions of APPLLIB (undocumented),
2626 ARCHLIB PRIVLIB SITEARCH and SITELIB
2629 incpush(APPLLIB_EXP, FALSE);
2633 incpush(ARCHLIB_EXP, FALSE);
2636 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2638 incpush(PRIVLIB_EXP, FALSE);
2641 incpush(SITEARCH_EXP, FALSE);
2644 incpush(SITELIB_EXP, FALSE);
2647 incpush(".", FALSE);
2651 # define PERLLIB_SEP ';'
2654 # define PERLLIB_SEP '|'
2656 # define PERLLIB_SEP ':'
2659 #ifndef PERLLIB_MANGLE
2660 # define PERLLIB_MANGLE(s,n) (s)
2664 incpush(char *p, int addsubdirs)
2666 SV *subdir = Nullsv;
2667 static char *archpat_auto;
2673 subdir = NEWSV(55,0);
2674 if (!archpat_auto) {
2675 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2676 + sizeof("//auto"));
2677 New(55, archpat_auto, len, char);
2678 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2680 for (len = sizeof(ARCHNAME) + 2;
2681 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2682 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2687 /* Break at all separators */
2689 SV *libdir = NEWSV(55,0);
2692 /* skip any consecutive separators */
2693 while ( *p == PERLLIB_SEP ) {
2694 /* Uncomment the next line for PATH semantics */
2695 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2699 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2700 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2705 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2706 p = Nullch; /* break out */
2710 * BEFORE pushing libdir onto @INC we may first push version- and
2711 * archname-specific sub-directories.
2714 struct stat tmpstatbuf;
2719 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2721 while (unix[len-1] == '/') len--; /* Cosmetic */
2722 sv_usepvn(libdir,unix,len);
2725 PerlIO_printf(PerlIO_stderr(),
2726 "Failed to unixify @INC element \"%s\"\n",
2729 /* .../archname/version if -d .../archname/version/auto */
2730 sv_setsv(subdir, libdir);
2731 sv_catpv(subdir, archpat_auto);
2732 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2733 S_ISDIR(tmpstatbuf.st_mode))
2734 av_push(GvAVn(incgv),
2735 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2737 /* .../archname if -d .../archname/auto */
2738 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2739 strlen(patchlevel) + 1, "", 0);
2740 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2741 S_ISDIR(tmpstatbuf.st_mode))
2742 av_push(GvAVn(incgv),
2743 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2746 /* finally push this lib directory on the end of @INC */
2747 av_push(GvAVn(incgv), libdir);
2750 SvREFCNT_dec(subdir);
2754 static struct perl_thread *
2757 struct perl_thread *thr;
2760 Newz(53, thr, 1, struct perl_thread);
2761 curcop = &compiling;
2762 thr->cvcache = newHV();
2763 thr->threadsv = newAV();
2764 /* thr->threadsvp is set when find_threadsv is called */
2765 thr->specific = newAV();
2766 thr->errhv = newHV();
2767 thr->flags = THRf_R_JOINABLE;
2768 MUTEX_INIT(&thr->mutex);
2769 /* Handcraft thrsv similarly to mess_sv */
2770 New(53, thrsv, 1, SV);
2771 Newz(53, xpv, 1, XPV);
2772 SvFLAGS(thrsv) = SVt_PV;
2773 SvANY(thrsv) = (void*)xpv;
2774 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2775 SvPVX(thrsv) = (char*)thr;
2776 SvCUR_set(thrsv, sizeof(thr));
2777 SvLEN_set(thrsv, sizeof(thr));
2778 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2780 curcop = &compiling;
2783 MUTEX_LOCK(&threads_mutex);
2788 MUTEX_UNLOCK(&threads_mutex);
2790 #ifdef HAVE_THREAD_INTERN
2791 init_thread_intern(thr);
2794 #ifdef SET_THREAD_SELF
2795 SET_THREAD_SELF(thr);
2797 thr->self = pthread_self();
2798 #endif /* SET_THREAD_SELF */
2802 * These must come after the SET_THR because sv_setpvn does
2803 * SvTAINT and the taint fields require dTHR.
2805 toptarget = NEWSV(0,0);
2806 sv_upgrade(toptarget, SVt_PVFM);
2807 sv_setpvn(toptarget, "", 0);
2808 bodytarget = NEWSV(0,0);
2809 sv_upgrade(bodytarget, SVt_PVFM);
2810 sv_setpvn(bodytarget, "", 0);
2811 formtarget = bodytarget;
2812 thr->errsv = newSVpv("", 0);
2813 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
2816 #endif /* USE_THREADS */
2819 call_list(I32 oldscope, AV *list)
2822 line_t oldline = curcop->cop_line;
2827 while (AvFILL(list) >= 0) {
2828 CV *cv = (CV*)av_shift(list);
2837 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2838 (void)SvPV(atsv, len);
2841 curcop = &compiling;
2842 curcop->cop_line = oldline;
2843 if (list == beginav)
2844 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2846 sv_catpv(atsv, "END failed--cleanup aborted");
2847 while (scopestack_ix > oldscope)
2849 croak("%s", SvPVX(atsv));
2857 /* my_exit() was called */
2858 while (scopestack_ix > oldscope)
2861 curstash = defstash;
2863 call_list(oldscope, endav);
2865 curcop = &compiling;
2866 curcop->cop_line = oldline;
2868 if (list == beginav)
2869 croak("BEGIN failed--compilation aborted");
2871 croak("END failed--cleanup aborted");
2877 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2882 curcop = &compiling;
2883 curcop->cop_line = oldline;
2896 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2897 thr, (unsigned long) status));
2898 #endif /* USE_THREADS */
2907 STATUS_NATIVE_SET(status);
2914 my_failure_exit(void)
2917 if (vaxc$errno & 1) {
2918 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2919 STATUS_NATIVE_SET(44);
2922 if (!vaxc$errno && errno) /* unlikely */
2923 STATUS_NATIVE_SET(44);
2925 STATUS_NATIVE_SET(vaxc$errno);
2929 STATUS_POSIX_SET(errno);
2930 else if (STATUS_POSIX == 0)
2931 STATUS_POSIX_SET(255);
2940 register PERL_CONTEXT *cx;
2949 (void)UNLINK(e_tmpname);
2950 Safefree(e_tmpname);
2954 if (cxstack_ix >= 0) {