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> */
34 dEXTCONST char rcsid[] = "perl.c\nPatch level: ###\n";
42 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
52 curcop = &compiling; \
59 laststype = OP_STAT; \
61 maxsysfd = MAXSYSFD; \
68 laststype = OP_STAT; \
72 static void find_beginning _((void));
73 static void forbid_setid _((char *));
74 static void incpush _((char *, int));
75 static void init_ids _((void));
76 static void init_debugger _((void));
77 static void init_lexer _((void));
78 static void init_main_stash _((void));
80 static struct perl_thread * init_main_thread _((void));
81 #endif /* USE_THREADS */
82 static void init_perllib _((void));
83 static void init_postdump_symbols _((int, char **, char **));
84 static void init_predump_symbols _((void));
85 static void my_exit_jump _((void)) __attribute__((noreturn));
86 static void nuke_stacks _((void));
87 static void open_script _((char *, bool, SV *));
88 static void usage _((char *));
89 static void validate_suid _((char *, char*));
91 static int fdscript = -1;
96 PerlInterpreter *sv_interp;
99 New(53, sv_interp, 1, PerlInterpreter);
104 perl_construct(register PerlInterpreter *sv_interp)
109 struct perl_thread *thr;
110 #endif /* FAKE_THREADS */
111 #endif /* USE_THREADS */
113 if (!(curinterp = sv_interp))
117 Zero(sv_interp, 1, PerlInterpreter);
120 /* Init the real globals (and main thread)? */
125 #ifdef ALLOC_THREAD_KEY
128 if (pthread_key_create(&thr_key, 0))
129 croak("panic: pthread_key_create");
131 MUTEX_INIT(&sv_mutex);
133 * Safe to use basic SV functions from now on (though
134 * not things like mortals or tainting yet).
136 MUTEX_INIT(&eval_mutex);
137 COND_INIT(&eval_cond);
138 MUTEX_INIT(&threads_mutex);
139 COND_INIT(&nthreads_cond);
140 #ifdef EMULATE_ATOMIC_REFCOUNTS
141 MUTEX_INIT(&svref_mutex);
142 #endif /* EMULATE_ATOMIC_REFCOUNTS */
144 thr = init_main_thread();
145 #endif /* USE_THREADS */
147 linestr = NEWSV(65,80);
148 sv_upgrade(linestr,SVt_PVIV);
150 if (!SvREADONLY(&sv_undef)) {
151 SvREADONLY_on(&sv_undef);
155 SvREADONLY_on(&sv_no);
157 sv_setpv(&sv_yes,Yes);
159 SvREADONLY_on(&sv_yes);
162 nrs = newSVpv("\n", 1);
163 rs = SvREFCNT_inc(nrs);
165 sighandlerp = sighandler;
170 * There is no way we can refer to them from Perl so close them to save
171 * space. The other alternative would be to provide STDAUX and STDPRN
174 (void)fclose(stdaux);
175 (void)fclose(stdprn);
182 perl_destruct_level = 1;
184 if(perl_destruct_level > 0)
189 lex_state = LEX_NOTPARSING;
191 start_env.je_prev = NULL;
192 start_env.je_ret = -1;
193 start_env.je_mustcatch = TRUE;
194 top_env = &start_env;
197 SET_NUMERIC_STANDARD();
198 #if defined(SUBVERSION) && SUBVERSION > 0
199 sprintf(patchlevel, "%7.5f", (double) 5
200 + ((double) PATCHLEVEL / (double) 1000)
201 + ((double) SUBVERSION / (double) 100000));
203 sprintf(patchlevel, "%5.3f", (double) 5 +
204 ((double) PATCHLEVEL / (double) 1000));
207 #if defined(LOCAL_PATCH_COUNT)
208 localpatches = local_patches; /* For possible -v */
211 PerlIO_init(); /* Hook to IO system */
213 fdpid = newAV(); /* for remembering popen pids by fd */
216 New(51,debname,128,char);
217 New(52,debdelim,128,char);
224 perl_destruct(register PerlInterpreter *sv_interp)
227 int destruct_level; /* 0=none, 1=full, 2=full with checks */
232 #endif /* USE_THREADS */
234 if (!(curinterp = sv_interp))
239 /* Pass 1 on any remaining threads: detach joinables, join zombies */
241 MUTEX_LOCK(&threads_mutex);
242 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
243 "perl_destruct: waiting for %d threads...\n",
245 for (t = thr->next; t != thr; t = t->next) {
246 MUTEX_LOCK(&t->mutex);
247 switch (ThrSTATE(t)) {
250 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
251 "perl_destruct: joining zombie %p\n", t));
252 ThrSETSTATE(t, THRf_DEAD);
253 MUTEX_UNLOCK(&t->mutex);
256 * The SvREFCNT_dec below may take a long time (e.g. av
257 * may contain an object scalar whose destructor gets
258 * called) so we have to unlock threads_mutex and start
261 MUTEX_UNLOCK(&threads_mutex);
263 SvREFCNT_dec((SV*)av);
264 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
265 "perl_destruct: joined zombie %p OK\n", t));
267 case THRf_R_JOINABLE:
268 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
269 "perl_destruct: detaching thread %p\n", t));
270 ThrSETSTATE(t, THRf_R_DETACHED);
272 * We unlock threads_mutex and t->mutex in the opposite order
273 * from which we locked them just so that DETACH won't
274 * deadlock if it panics. It's only a breach of good style
275 * not a bug since they are unlocks not locks.
277 MUTEX_UNLOCK(&threads_mutex);
279 MUTEX_UNLOCK(&t->mutex);
282 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
283 "perl_destruct: ignoring %p (state %u)\n",
285 MUTEX_UNLOCK(&t->mutex);
286 /* fall through and out */
289 /* We leave the above "Pass 1" loop with threads_mutex still locked */
291 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
294 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
295 "perl_destruct: final wait for %d threads\n",
297 COND_WAIT(&nthreads_cond, &threads_mutex);
299 /* At this point, we're the last thread */
300 MUTEX_UNLOCK(&threads_mutex);
301 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
302 MUTEX_DESTROY(&threads_mutex);
303 COND_DESTROY(&nthreads_cond);
304 #endif /* !defined(FAKE_THREADS) */
305 #endif /* USE_THREADS */
307 destruct_level = perl_destruct_level;
311 if (s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL")) {
313 if (destruct_level < i)
322 /* We must account for everything. */
324 /* Destroy the main CV and syntax tree */
326 curpad = AvARRAY(comppad);
332 SvREFCNT_dec(main_cv);
337 * Try to destruct global references. We do this first so that the
338 * destructors and destructees still exist. Some sv's might remain.
339 * Non-referenced objects are on their own.
346 /* unhook hooks which will soon be, or use, destroyed data */
347 SvREFCNT_dec(warnhook);
349 SvREFCNT_dec(diehook);
351 SvREFCNT_dec(parsehook);
354 if (destruct_level == 0){
356 DEBUG_P(debprofdump());
358 /* The exit() function will do everything that needs doing. */
362 /* loosen bonds of global variables */
365 (void)PerlIO_close(rsfp);
369 /* Filters for program text */
370 SvREFCNT_dec(rsfp_filters);
371 rsfp_filters = Nullav;
383 sawampersand = FALSE; /* must save all match strings */
384 sawstudy = FALSE; /* do fbm_instr on all strings */
399 /* magical thingies */
401 Safefree(ofs); /* $, */
404 Safefree(ors); /* $\ */
407 SvREFCNT_dec(nrs); /* $\ helper */
410 multiline = 0; /* $* */
412 SvREFCNT_dec(statname);
416 /* defgv, aka *_ should be taken care of elsewhere */
418 /* clean up after study() */
419 SvREFCNT_dec(lastscream);
421 Safefree(screamfirst);
423 Safefree(screamnext);
426 /* startup and shutdown function lists */
427 SvREFCNT_dec(beginav);
429 SvREFCNT_dec(initav);
434 /* shortcuts just get cleared */
444 /* reset so print() ends up where we expect */
447 /* Prepare to destruct main symbol table. */
454 if (destruct_level >= 2) {
455 if (scopestack_ix != 0)
456 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
457 (long)scopestack_ix);
458 if (savestack_ix != 0)
459 warn("Unbalanced saves: %ld more saves than restores\n",
461 if (tmps_floor != -1)
462 warn("Unbalanced tmps: %ld more allocs than frees\n",
463 (long)tmps_floor + 1);
464 if (cxstack_ix != -1)
465 warn("Unbalanced context: %ld more PUSHes than POPs\n",
466 (long)cxstack_ix + 1);
469 /* Now absolutely destruct everything, somehow or other, loops or no. */
471 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
472 while (sv_count != 0 && sv_count != last_sv_count) {
473 last_sv_count = sv_count;
476 SvFLAGS(strtab) &= ~SVTYPEMASK;
477 SvFLAGS(strtab) |= SVt_PVHV;
479 /* Destruct the global string table. */
481 /* Yell and reset the HeVAL() slots that are still holding refcounts,
482 * so that sv_free() won't fail on them.
491 array = HvARRAY(strtab);
495 warn("Unbalanced string table refcount: (%d) for \"%s\"",
496 HeVAL(hent) - Nullsv, HeKEY(hent));
497 HeVAL(hent) = Nullsv;
507 SvREFCNT_dec(strtab);
510 warn("Scalars leaked: %ld\n", (long)sv_count);
514 /* No SVs have survived, need to clean out */
518 Safefree(origfilename);
520 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
522 DEBUG_P(debprofdump());
524 MUTEX_DESTROY(&sv_mutex);
525 MUTEX_DESTROY(&eval_mutex);
526 COND_DESTROY(&eval_cond);
528 /* As the penultimate thing, free the non-arena SV for thrsv */
529 Safefree(SvPVX(thrsv));
530 Safefree(SvANY(thrsv));
533 #endif /* USE_THREADS */
535 /* As the absolutely last thing, free the non-arena SV for mess() */
538 /* we know that type >= SVt_PV */
540 Safefree(SvPVX(mess_sv));
541 Safefree(SvANY(mess_sv));
548 perl_free(PerlInterpreter *sv_interp)
550 if (!(curinterp = sv_interp))
556 perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
561 char *scriptname = NULL;
562 VOL bool dosearch = FALSE;
570 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
573 croak("suidperl is no longer needed since the kernel can now execute\n\
574 setuid perl scripts securely.\n");
578 if (!(curinterp = sv_interp))
581 #if defined(NeXT) && defined(__DYNAMIC__)
582 _dyld_lookup_and_bind
583 ("__environ", (unsigned long *) &environ_pointer, NULL);
588 #ifndef VMS /* VMS doesn't have environ array */
589 origenviron = environ;
595 /* Come here if running an undumped a.out. */
597 origfilename = savepv(argv[0]);
599 cxstack_ix = -1; /* start label stack again */
601 init_postdump_symbols(argc,argv,env);
606 curpad = AvARRAY(comppad);
611 SvREFCNT_dec(main_cv);
615 oldscope = scopestack_ix;
623 /* my_exit() was called */
624 while (scopestack_ix > oldscope)
629 call_list(oldscope, endav);
631 return STATUS_NATIVE_EXPORT;
634 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
638 sv_setpvn(linestr,"",0);
639 sv = newSVpv("",0); /* first used for -I flags */
643 for (argc--,argv++; argc > 0; argc--,argv++) {
644 if (argv[0][0] != '-' || !argv[0][1])
648 validarg = " PHOOEY ";
673 if (s = moreswitches(s))
683 if (euid != uid || egid != gid)
684 croak("No -e allowed in setuid scripts");
687 int oldumask = PerlLIO_umask(0177);
689 e_tmpname = savepv(TMPPATH);
691 e_tmpfd = PerlLIO_mkstemp(e_tmpname);
692 #else /* use mktemp() */
693 (void)PerlLIO_mktemp(e_tmpname);
695 croak("Cannot generate temporary filename");
696 # if defined(HAS_OPEN3) && defined(O_EXCL)
697 e_tmpfd = open(e_tmpname,
698 O_WRONLY | O_CREAT | O_EXCL,
701 (void)UNLINK(e_tmpname);
702 /* Yes, potential race. But at least we can say we tried. */
703 e_fp = PerlIO_open(e_tmpname,"w");
705 #endif /* ifdef HAS_MKSTEMP */
706 #if defined(HAS_MKSTEMP) || (defined(HAS_OPEN3) && defined(O_EXCL))
708 croak("Cannot create temporary file \"%s\"", e_tmpname);
709 e_fp = PerlIO_fdopen(e_tmpfd,"w");
712 croak("Cannot create temporary file \"%s\"", e_tmpname);
714 (void)PerlLIO_umask(oldumask);
720 PerlIO_puts(e_fp,argv[1]);
724 croak("No code specified for -e");
725 (void)PerlIO_putc(e_fp,'\n');
727 case 'I': /* -I handled both here and in moreswitches() */
729 if (!*++s && (s=argv[1]) != Nullch) {
732 while (s && isSPACE(*s))
736 for (e = s; *e && !isSPACE(*e); e++) ;
743 } /* XXX else croak? */
757 preambleav = newAV();
758 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
760 Sv = newSVpv("print myconfig();",0);
762 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
764 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
766 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
767 sv_catpv(Sv,"\" Compile-time options:");
769 sv_catpv(Sv," DEBUGGING");
772 sv_catpv(Sv," NO_EMBED");
775 sv_catpv(Sv," MULTIPLICITY");
777 sv_catpv(Sv,"\\n\",");
779 #if defined(LOCAL_PATCH_COUNT)
780 if (LOCAL_PATCH_COUNT > 0) {
782 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
783 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
785 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
789 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
792 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
794 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
799 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
800 print \" \\%ENV:\\n @env\\n\" if @env; \
801 print \" \\@INC:\\n @INC\\n\";");
804 Sv = newSVpv("config_vars(qw(",0);
809 av_push(preambleav, Sv);
810 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
821 if (!*++s || isSPACE(*s)) {
825 /* catch use of gnu style long options */
826 if (strEQ(s, "version")) {
830 if (strEQ(s, "help")) {
837 croak("Unrecognized switch: -%s (-h will show valid options)",s);
842 if (!tainting && (s = PerlEnv_getenv("PERL5OPT"))) {
853 if (!strchr("DIMUdmw", *s))
854 croak("Illegal switch in PERL5OPT: -%c", *s);
860 scriptname = argv[0];
862 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
864 warn("Did you forget to compile with -DMULTIPLICITY?");
866 croak("Can't write to temp file for -e: %s", Strerror(errno));
870 scriptname = e_tmpname;
872 else if (scriptname == Nullch) {
874 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
882 open_script(scriptname,dosearch,sv);
884 validate_suid(validarg, scriptname);
889 main_cv = compcv = (CV*)NEWSV(1104,0);
890 sv_upgrade((SV *)compcv, SVt_PVCV);
894 av_push(comppad, Nullsv);
895 curpad = AvARRAY(comppad);
896 comppad_name = newAV();
897 comppad_name_fill = 0;
898 min_intro_pending = 0;
901 av_store(comppad_name, 0, newSVpv("@_", 2));
902 curpad[0] = (SV*)newAV();
903 SvPADMY_on(curpad[0]); /* XXX Needed? */
905 New(666, CvMUTEXP(compcv), 1, perl_mutex);
906 MUTEX_INIT(CvMUTEXP(compcv));
907 #endif /* USE_THREADS */
909 comppadlist = newAV();
910 AvREAL_off(comppadlist);
911 av_store(comppadlist, 0, (SV*)comppad_name);
912 av_store(comppadlist, 1, (SV*)comppad);
913 CvPADLIST(compcv) = comppadlist;
915 boot_core_UNIVERSAL();
917 (*xsinit)(); /* in case linked C routines want magical variables */
918 #if defined(VMS) || defined(WIN32) || defined(DJGPP)
922 init_predump_symbols();
924 init_postdump_symbols(argc,argv,env);
928 /* now parse the script */
930 SETERRNO(0,SS$_NORMAL);
932 if (yyparse() || error_count) {
934 croak("%s had compilation errors.\n", origfilename);
936 croak("Execution of %s aborted due to compilation errors.\n",
940 curcop->cop_line = 0;
944 (void)UNLINK(e_tmpname);
950 /* now that script is parsed, we can modify record separator */
952 rs = SvREFCNT_inc(nrs);
953 sv_setsv(perl_get_sv("/", TRUE), rs);
964 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
965 dump_mstats("after compilation:");
975 perl_run(PerlInterpreter *sv_interp)
982 if (!(curinterp = sv_interp))
985 oldscope = scopestack_ix;
990 cxstack_ix = -1; /* start context stack again */
993 /* my_exit() was called */
994 while (scopestack_ix > oldscope)
999 call_list(oldscope, endav);
1001 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1002 dump_mstats("after execution: ");
1005 return STATUS_NATIVE_EXPORT;
1008 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1013 POPSTACK_TO(mainstack);
1017 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1018 sawampersand ? "Enabling" : "Omitting"));
1021 DEBUG_x(dump_all());
1022 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1024 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1025 (unsigned long) thr));
1026 #endif /* USE_THREADS */
1029 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1032 if (PERLDB_SINGLE && DBsingle)
1033 sv_setiv(DBsingle, 1);
1035 call_list(oldscope, initav);
1045 else if (main_start) {
1046 CvDEPTH(main_cv) = 1;
1057 perl_get_sv(char *name, I32 create)
1061 if (name[1] == '\0' && !isALPHA(name[0])) {
1062 PADOFFSET tmp = find_threadsv(name);
1063 if (tmp != NOT_IN_PAD) {
1065 return THREADSV(tmp);
1068 #endif /* USE_THREADS */
1069 gv = gv_fetchpv(name, create, SVt_PV);
1076 perl_get_av(char *name, I32 create)
1078 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1087 perl_get_hv(char *name, I32 create)
1089 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1098 perl_get_cv(char *name, I32 create)
1100 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1101 if (create && !GvCVu(gv))
1102 return newSUB(start_subparse(FALSE, 0),
1103 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1111 /* Be sure to refetch the stack pointer after calling these routines. */
1114 perl_call_argv(char *sub_name, I32 flags, register char **argv)
1116 /* See G_* flags in cop.h */
1117 /* null terminated arg list */
1124 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1129 return perl_call_pv(sub_name, flags);
1133 perl_call_pv(char *sub_name, I32 flags)
1134 /* name of the subroutine */
1135 /* See G_* flags in cop.h */
1137 return perl_call_sv((SV*)perl_get_cv(sub_name, TRUE), flags);
1141 perl_call_method(char *methname, I32 flags)
1142 /* name of the subroutine */
1143 /* See G_* flags in cop.h */
1149 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1152 return perl_call_sv(*stack_sp--, flags);
1155 /* May be called with any of a CV, a GV, or an SV containing the name. */
1157 perl_call_sv(SV *sv, I32 flags)
1159 /* See G_* flags in cop.h */
1162 LOGOP myop; /* fake syntax tree node */
1167 bool oldcatch = CATCH_GET;
1172 if (flags & G_DISCARD) {
1177 Zero(&myop, 1, LOGOP);
1178 myop.op_next = Nullop;
1179 if (!(flags & G_NOARGS))
1180 myop.op_flags |= OPf_STACKED;
1181 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1182 (flags & G_ARRAY) ? OPf_WANT_LIST :
1187 EXTEND(stack_sp, 1);
1190 oldscope = scopestack_ix;
1192 if (PERLDB_SUB && curstash != debstash
1193 /* Handle first BEGIN of -d. */
1194 && (DBcv || (DBcv = GvCV(DBsub)))
1195 /* Try harder, since this may have been a sighandler, thus
1196 * curstash may be meaningless. */
1197 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1198 op->op_private |= OPpENTERSUB_DB;
1200 if (flags & G_EVAL) {
1201 cLOGOP->op_other = op;
1203 /* we're trying to emulate pp_entertry() here */
1205 register PERL_CONTEXT *cx;
1206 I32 gimme = GIMME_V;
1211 push_return(op->op_next);
1212 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1214 eval_root = op; /* Only needed so that goto works right. */
1217 if (flags & G_KEEPERR)
1232 /* my_exit() was called */
1233 curstash = defstash;
1237 croak("Callback called exit");
1246 stack_sp = stack_base + oldmark;
1247 if (flags & G_ARRAY)
1251 *++stack_sp = &sv_undef;
1259 if (op == (OP*)&myop)
1260 op = pp_entersub(ARGS);
1263 retval = stack_sp - (stack_base + oldmark);
1264 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1268 if (flags & G_EVAL) {
1269 if (scopestack_ix > oldscope) {
1273 register PERL_CONTEXT *cx;
1285 CATCH_SET(oldcatch);
1287 if (flags & G_DISCARD) {
1288 stack_sp = stack_base + oldmark;
1297 /* Eval a string. The G_EVAL flag is always assumed. */
1300 perl_eval_sv(SV *sv, I32 flags)
1302 /* See G_* flags in cop.h */
1305 UNOP myop; /* fake syntax tree node */
1306 I32 oldmark = SP - stack_base;
1313 if (flags & G_DISCARD) {
1321 EXTEND(stack_sp, 1);
1323 oldscope = scopestack_ix;
1325 if (!(flags & G_NOARGS))
1326 myop.op_flags = OPf_STACKED;
1327 myop.op_next = Nullop;
1328 myop.op_type = OP_ENTEREVAL;
1329 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1330 (flags & G_ARRAY) ? OPf_WANT_LIST :
1332 if (flags & G_KEEPERR)
1333 myop.op_flags |= OPf_SPECIAL;
1343 /* my_exit() was called */
1344 curstash = defstash;
1348 croak("Callback called exit");
1357 stack_sp = stack_base + oldmark;
1358 if (flags & G_ARRAY)
1362 *++stack_sp = &sv_undef;
1367 if (op == (OP*)&myop)
1368 op = pp_entereval(ARGS);
1371 retval = stack_sp - (stack_base + oldmark);
1372 if (!(flags & G_KEEPERR))
1377 if (flags & G_DISCARD) {
1378 stack_sp = stack_base + oldmark;
1388 perl_eval_pv(char *p, I32 croak_on_error)
1391 SV* sv = newSVpv(p, 0);
1394 perl_eval_sv(sv, G_SCALAR);
1401 if (croak_on_error && SvTRUE(ERRSV))
1402 croak(SvPVx(ERRSV, na));
1407 /* Require a module. */
1410 perl_require_pv(char *pv)
1412 SV* sv = sv_newmortal();
1413 sv_setpv(sv, "require '");
1416 perl_eval_sv(sv, G_DISCARD);
1420 magicname(char *sym, char *name, I32 namlen)
1424 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1425 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1429 usage(char *name) /* XXX move this out into a module ? */
1432 /* This message really ought to be max 23 lines.
1433 * Removed -h because the user already knows that opton. Others? */
1435 static char *usage[] = {
1436 "-0[octal] specify record separator (\\0, if no argument)",
1437 "-a autosplit mode with -n or -p (splits $_ into @F)",
1438 "-c check syntax only (runs BEGIN and END blocks)",
1439 "-d[:debugger] run scripts under debugger",
1440 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1441 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1442 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1443 "-i[extension] edit <> files in place (make backup if extension supplied)",
1444 "-Idirectory specify @INC/#include directory (may be used more than once)",
1445 "-l[octal] enable line ending processing, specifies line terminator",
1446 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1447 "-n assume 'while (<>) { ... }' loop around your script",
1448 "-p assume loop like -n but print line also like sed",
1449 "-P run script through C preprocessor before compilation",
1450 "-s enable some switch parsing for switches after script name",
1451 "-S look for the script using PATH environment variable",
1452 "-T turn on tainting checks",
1453 "-u dump core after parsing script",
1454 "-U allow unsafe operations",
1455 "-v print version number and patchlevel of perl",
1456 "-V[:variable] print perl configuration information",
1457 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1458 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1464 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1466 printf("\n %s", *p++);
1469 /* This routine handles any switches that can be given during run */
1472 moreswitches(char *s)
1481 rschar = scan_oct(s, 4, &numlen);
1483 if (rschar & ~((U8)~0))
1485 else if (!rschar && numlen >= 2)
1486 nrs = newSVpv("", 0);
1489 nrs = newSVpv(&ch, 1);
1495 splitstr = savepv(s + 1);
1509 if (*s == ':' || *s == '=') {
1510 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1514 perldb = PERLDB_ALL;
1521 if (isALPHA(s[1])) {
1522 static char debopts[] = "psltocPmfrxuLHXD";
1525 for (s++; *s && (d = strchr(debopts,*s)); s++)
1526 debug |= 1 << (d - debopts);
1530 for (s++; isDIGIT(*s); s++) ;
1532 debug |= 0x80000000;
1534 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1535 for (s++; isALNUM(*s); s++) ;
1545 inplace = savepv(s+1);
1547 for (s = inplace; *s && !isSPACE(*s); s++) ;
1551 case 'I': /* -I handled both here and in parse_perl() */
1554 while (*s && isSPACE(*s))
1558 for (e = s; *e && !isSPACE(*e); e++) ;
1559 p = savepvn(s, e-s);
1565 croak("No space allowed after -I");
1575 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1585 ors = SvPV(nrs, orslen);
1586 ors = savepvn(ors, orslen);
1590 forbid_setid("-M"); /* XXX ? */
1593 forbid_setid("-m"); /* XXX ? */
1598 /* -M-foo == 'no foo' */
1599 if (*s == '-') { use = "no "; ++s; }
1600 sv = newSVpv(use,0);
1602 /* We allow -M'Module qw(Foo Bar)' */
1603 while(isALNUM(*s) || *s==':') ++s;
1605 sv_catpv(sv, start);
1606 if (*(start-1) == 'm') {
1608 croak("Can't use '%c' after -mname", *s);
1609 sv_catpv( sv, " ()");
1612 sv_catpvn(sv, start, s-start);
1613 sv_catpv(sv, " split(/,/,q{");
1618 if (preambleav == NULL)
1619 preambleav = newAV();
1620 av_push(preambleav, sv);
1623 croak("No space allowed after -%c", *(s-1));
1640 croak("Too late for \"-T\" option");
1652 #if defined(SUBVERSION) && SUBVERSION > 0
1653 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1654 PATCHLEVEL, SUBVERSION, ARCHNAME);
1656 printf("\nThis is perl, version %s built for %s",
1657 patchlevel, ARCHNAME);
1659 #if defined(LOCAL_PATCH_COUNT)
1660 if (LOCAL_PATCH_COUNT > 0)
1661 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1662 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1665 printf("\n\nCopyright 1987-1998, Larry Wall\n");
1667 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1670 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1671 printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1998\n");
1674 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1675 "Version 5 port Copyright (c) 1994-1998, Andreas Kaiser, Ilya Zakharevich\n");
1678 printf("atariST series port, ++jrb bammi@cadence.com\n");
1681 Perl may be copied only under the terms of either the Artistic License or the\n\
1682 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1690 if (s[1] == '-') /* Additional switches on #! line. */
1701 #ifdef ALTERNATE_SHEBANG
1702 case 'S': /* OS/2 needs -S on "extproc" line. */
1710 croak("Can't emulate -%.1s on #! line",s);
1715 /* compliments of Tom Christiansen */
1717 /* unexec() can be found in the Gnu emacs distribution */
1728 prog = newSVpv(BIN_EXP);
1729 sv_catpv(prog, "/perl");
1730 file = newSVpv(origfilename);
1731 sv_catpv(file, ".perldump");
1733 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1735 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1736 SvPVX(prog), SvPVX(file));
1737 PerlProc_exit(status);
1740 # include <lib$routines.h>
1741 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1743 ABORT(); /* for use with undump */
1749 init_main_stash(void)
1754 /* Note that strtab is a rather special HV. Assumptions are made
1755 about not iterating on it, and not adding tie magic to it.
1756 It is properly deallocated in perl_destruct() */
1758 HvSHAREKEYS_off(strtab); /* mandatory */
1759 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1760 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1762 curstash = defstash = newHV();
1763 curstname = newSVpv("main",4);
1764 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1765 SvREFCNT_dec(GvHV(gv));
1766 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1768 HvNAME(defstash) = savepv("main");
1769 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1771 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1772 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1774 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1775 sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
1776 sv_setpvn(ERRSV, "", 0);
1777 curstash = defstash;
1778 compiling.cop_stash = defstash;
1779 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1780 globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
1781 /* We must init $/ before switches are processed. */
1782 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1786 open_script(char *scriptname, bool dosearch, SV *sv)
1789 char *xfound = Nullch;
1790 char *xfailed = Nullch;
1794 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1795 # define SEARCH_EXTS ".bat", ".cmd", NULL
1796 # define MAX_EXT_LEN 4
1799 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1800 # define MAX_EXT_LEN 4
1803 # define SEARCH_EXTS ".pl", ".com", NULL
1804 # define MAX_EXT_LEN 4
1806 /* additional extensions to try in each dir if scriptname not found */
1808 char *ext[] = { SEARCH_EXTS };
1809 int extidx = 0, i = 0;
1810 char *curext = Nullch;
1812 # define MAX_EXT_LEN 0
1816 * If dosearch is true and if scriptname does not contain path
1817 * delimiters, search the PATH for scriptname.
1819 * If SEARCH_EXTS is also defined, will look for each
1820 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1821 * while searching the PATH.
1823 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1824 * proceeds as follows:
1825 * If DOSISH or VMSISH:
1826 * + look for ./scriptname{,.foo,.bar}
1827 * + search the PATH for scriptname{,.foo,.bar}
1830 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1831 * this will not look in '.' if it's not in the PATH)
1835 # ifdef ALWAYS_DEFTYPES
1836 len = strlen(scriptname);
1837 if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
1838 int hasdir, idx = 0, deftypes = 1;
1841 hasdir = !dosearch || (strpbrk(scriptname,":[</") != Nullch) ;
1844 int hasdir, idx = 0, deftypes = 1;
1847 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1849 /* The first time through, just add SEARCH_EXTS to whatever we
1850 * already have, so we can check for default file types. */
1852 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1858 if ((strlen(tokenbuf) + strlen(scriptname)
1859 + MAX_EXT_LEN) >= sizeof tokenbuf)
1860 continue; /* don't search dir with too-long name */
1861 strcat(tokenbuf, scriptname);
1865 if (strEQ(scriptname, "-"))
1867 if (dosearch) { /* Look in '.' first. */
1868 char *cur = scriptname;
1870 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1872 if (strEQ(ext[i++],curext)) {
1873 extidx = -1; /* already has an ext */
1878 DEBUG_p(PerlIO_printf(Perl_debug_log,
1879 "Looking for %s\n",cur));
1880 if (PerlLIO_stat(cur,&statbuf) >= 0) {
1888 if (cur == scriptname) {
1889 len = strlen(scriptname);
1890 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1892 cur = strcpy(tokenbuf, scriptname);
1894 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1895 && strcpy(tokenbuf+len, ext[extidx++]));
1900 if (dosearch && !strchr(scriptname, '/')
1902 && !strchr(scriptname, '\\')
1904 && (s = PerlEnv_getenv("PATH"))) {
1907 bufend = s + strlen(s);
1908 while (s < bufend) {
1909 #if defined(atarist) || defined(DOSISH)
1914 && *s != ';'; len++, s++) {
1915 if (len < sizeof tokenbuf)
1918 if (len < sizeof tokenbuf)
1919 tokenbuf[len] = '\0';
1920 #else /* ! (atarist || DOSISH) */
1921 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1924 #endif /* ! (atarist || DOSISH) */
1927 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1928 continue; /* don't search dir with too-long name */
1930 #if defined(atarist) || defined(DOSISH)
1931 && tokenbuf[len - 1] != '/'
1932 && tokenbuf[len - 1] != '\\'
1935 tokenbuf[len++] = '/';
1936 if (len == 2 && tokenbuf[0] == '.')
1938 (void)strcpy(tokenbuf + len, scriptname);
1942 len = strlen(tokenbuf);
1943 if (extidx > 0) /* reset after previous loop */
1947 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1948 retval = PerlLIO_stat(tokenbuf,&statbuf);
1950 } while ( retval < 0 /* not there */
1951 && extidx>=0 && ext[extidx] /* try an extension? */
1952 && strcpy(tokenbuf+len, ext[extidx++])
1957 if (S_ISREG(statbuf.st_mode)
1958 && cando(S_IRUSR,TRUE,&statbuf)
1960 && cando(S_IXUSR,TRUE,&statbuf)
1964 xfound = tokenbuf; /* bingo! */
1968 xfailed = savepv(tokenbuf);
1971 if (!xfound && !seen_dot && !xfailed && (PerlLIO_stat(scriptname,&statbuf) < 0))
1973 seen_dot = 1; /* Disable message. */
1975 croak("Can't %s %s%s%s",
1976 (xfailed ? "execute" : "find"),
1977 (xfailed ? xfailed : scriptname),
1978 (xfailed ? "" : " on PATH"),
1979 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1982 scriptname = xfound;
1985 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1986 char *s = scriptname + 8;
1995 origfilename = savepv(e_tmpname ? "-e" : scriptname);
1996 curcop->cop_filegv = gv_fetchfile(origfilename);
1997 if (strEQ(origfilename,"-"))
1999 if (fdscript >= 0) {
2000 rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
2001 #if defined(HAS_FCNTL) && defined(F_SETFD)
2003 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2006 else if (preprocess) {
2007 char *cpp_cfg = CPPSTDIN;
2008 SV *cpp = NEWSV(0,0);
2009 SV *cmd = NEWSV(0,0);
2011 if (strEQ(cpp_cfg, "cppstdin"))
2012 sv_catpvf(cpp, "%s/", BIN_EXP);
2013 sv_catpv(cpp, cpp_cfg);
2016 sv_catpv(sv,PRIVLIB_EXP);
2020 sed %s -e \"/^[^#]/b\" \
2021 -e \"/^#[ ]*include[ ]/b\" \
2022 -e \"/^#[ ]*define[ ]/b\" \
2023 -e \"/^#[ ]*if[ ]/b\" \
2024 -e \"/^#[ ]*ifdef[ ]/b\" \
2025 -e \"/^#[ ]*ifndef[ ]/b\" \
2026 -e \"/^#[ ]*else/b\" \
2027 -e \"/^#[ ]*elif[ ]/b\" \
2028 -e \"/^#[ ]*undef[ ]/b\" \
2029 -e \"/^#[ ]*endif/b\" \
2032 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2035 %s %s -e '/^[^#]/b' \
2036 -e '/^#[ ]*include[ ]/b' \
2037 -e '/^#[ ]*define[ ]/b' \
2038 -e '/^#[ ]*if[ ]/b' \
2039 -e '/^#[ ]*ifdef[ ]/b' \
2040 -e '/^#[ ]*ifndef[ ]/b' \
2041 -e '/^#[ ]*else/b' \
2042 -e '/^#[ ]*elif[ ]/b' \
2043 -e '/^#[ ]*undef[ ]/b' \
2044 -e '/^#[ ]*endif/b' \
2052 (doextract ? "-e '1,/^#/d\n'" : ""),
2054 scriptname, cpp, sv, CPPMINUS);
2056 #ifdef IAMSUID /* actually, this is caught earlier */
2057 if (euid != uid && !euid) { /* if running suidperl */
2059 (void)seteuid(uid); /* musn't stay setuid root */
2062 (void)setreuid((Uid_t)-1, uid);
2064 #ifdef HAS_SETRESUID
2065 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2071 if (geteuid() != uid)
2072 croak("Can't do seteuid!\n");
2074 #endif /* IAMSUID */
2075 rsfp = PerlProc_popen(SvPVX(cmd), "r");
2079 else if (!*scriptname) {
2080 forbid_setid("program input from stdin");
2081 rsfp = PerlIO_stdin();
2084 rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2085 #if defined(HAS_FCNTL) && defined(F_SETFD)
2087 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2095 #ifndef IAMSUID /* in case script is not readable before setuid */
2096 if (euid && PerlLIO_stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2097 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2099 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2100 croak("Can't do setuid\n");
2104 croak("Can't open perl script \"%s\": %s\n",
2105 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2110 validate_suid(char *validarg, char *scriptname)
2114 /* do we need to emulate setuid on scripts? */
2116 /* This code is for those BSD systems that have setuid #! scripts disabled
2117 * in the kernel because of a security problem. Merely defining DOSUID
2118 * in perl will not fix that problem, but if you have disabled setuid
2119 * scripts in the kernel, this will attempt to emulate setuid and setgid
2120 * on scripts that have those now-otherwise-useless bits set. The setuid
2121 * root version must be called suidperl or sperlN.NNN. If regular perl
2122 * discovers that it has opened a setuid script, it calls suidperl with
2123 * the same argv that it had. If suidperl finds that the script it has
2124 * just opened is NOT setuid root, it sets the effective uid back to the
2125 * uid. We don't just make perl setuid root because that loses the
2126 * effective uid we had before invoking perl, if it was different from the
2129 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2130 * be defined in suidperl only. suidperl must be setuid root. The
2131 * Configure script will set this up for you if you want it.
2138 if (PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2139 croak("Can't stat script \"%s\"",origfilename);
2140 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2144 #ifndef HAS_SETREUID
2145 /* On this access check to make sure the directories are readable,
2146 * there is actually a small window that the user could use to make
2147 * filename point to an accessible directory. So there is a faint
2148 * chance that someone could execute a setuid script down in a
2149 * non-accessible directory. I don't know what to do about that.
2150 * But I don't think it's too important. The manual lies when
2151 * it says access() is useful in setuid programs.
2153 if (PerlLIO_access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2154 croak("Permission denied");
2156 /* If we can swap euid and uid, then we can determine access rights
2157 * with a simple stat of the file, and then compare device and
2158 * inode to make sure we did stat() on the same file we opened.
2159 * Then we just have to make sure he or she can execute it.
2162 struct stat tmpstatbuf;
2166 setreuid(euid,uid) < 0
2169 setresuid(euid,uid,(Uid_t)-1) < 0
2172 || getuid() != euid || geteuid() != uid)
2173 croak("Can't swap uid and euid"); /* really paranoid */
2174 if (PerlLIO_stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2175 croak("Permission denied"); /* testing full pathname here */
2176 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2177 tmpstatbuf.st_ino != statbuf.st_ino) {
2178 (void)PerlIO_close(rsfp);
2179 if (rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
2181 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2182 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2183 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2184 (long)statbuf.st_dev, (long)statbuf.st_ino,
2185 SvPVX(GvSV(curcop->cop_filegv)),
2186 (long)statbuf.st_uid, (long)statbuf.st_gid);
2187 (void)PerlProc_pclose(rsfp);
2189 croak("Permission denied\n");
2193 setreuid(uid,euid) < 0
2195 # if defined(HAS_SETRESUID)
2196 setresuid(uid,euid,(Uid_t)-1) < 0
2199 || getuid() != uid || geteuid() != euid)
2200 croak("Can't reswap uid and euid");
2201 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2202 croak("Permission denied\n");
2204 #endif /* HAS_SETREUID */
2205 #endif /* IAMSUID */
2207 if (!S_ISREG(statbuf.st_mode))
2208 croak("Permission denied");
2209 if (statbuf.st_mode & S_IWOTH)
2210 croak("Setuid/gid script is writable by world");
2211 doswitches = FALSE; /* -s is insecure in suid */
2213 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2214 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2215 croak("No #! line");
2216 s = SvPV(linestr,na)+2;
2218 while (!isSPACE(*s)) s++;
2219 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2220 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2221 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2222 croak("Not a perl script");
2223 while (*s == ' ' || *s == '\t') s++;
2225 * #! arg must be what we saw above. They can invoke it by
2226 * mentioning suidperl explicitly, but they may not add any strange
2227 * arguments beyond what #! says if they do invoke suidperl that way.
2229 len = strlen(validarg);
2230 if (strEQ(validarg," PHOOEY ") ||
2231 strnNE(s,validarg,len) || !isSPACE(s[len]))
2232 croak("Args must match #! line");
2235 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2236 euid == statbuf.st_uid)
2238 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2239 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2240 #endif /* IAMSUID */
2242 if (euid) { /* oops, we're not the setuid root perl */
2243 (void)PerlIO_close(rsfp);
2246 PerlProc_execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2248 croak("Can't do setuid\n");
2251 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2253 (void)setegid(statbuf.st_gid);
2256 (void)setregid((Gid_t)-1,statbuf.st_gid);
2258 #ifdef HAS_SETRESGID
2259 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2261 setgid(statbuf.st_gid);
2265 if (getegid() != statbuf.st_gid)
2266 croak("Can't do setegid!\n");
2268 if (statbuf.st_mode & S_ISUID) {
2269 if (statbuf.st_uid != euid)
2271 (void)seteuid(statbuf.st_uid); /* all that for this */
2274 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2276 #ifdef HAS_SETRESUID
2277 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2279 setuid(statbuf.st_uid);
2283 if (geteuid() != statbuf.st_uid)
2284 croak("Can't do seteuid!\n");
2286 else if (uid) { /* oops, mustn't run as root */
2288 (void)seteuid((Uid_t)uid);
2291 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2293 #ifdef HAS_SETRESUID
2294 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2300 if (geteuid() != uid)
2301 croak("Can't do seteuid!\n");
2304 if (!cando(S_IXUSR,TRUE,&statbuf))
2305 croak("Permission denied\n"); /* they can't do this */
2308 else if (preprocess)
2309 croak("-P not allowed for setuid/setgid script\n");
2310 else if (fdscript >= 0)
2311 croak("fd script not allowed in suidperl\n");
2313 croak("Script is not setuid/setgid in suidperl\n");
2315 /* We absolutely must clear out any saved ids here, so we */
2316 /* exec the real perl, substituting fd script for scriptname. */
2317 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2318 PerlIO_rewind(rsfp);
2319 PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2320 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2321 if (!origargv[which])
2322 croak("Permission denied");
2323 origargv[which] = savepv(form("/dev/fd/%d/%s",
2324 PerlIO_fileno(rsfp), origargv[which]));
2325 #if defined(HAS_FCNTL) && defined(F_SETFD)
2326 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2328 PerlProc_execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2329 croak("Can't do setuid\n");
2330 #endif /* IAMSUID */
2332 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2333 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2335 PerlLIO_fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2336 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2338 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2341 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2342 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2343 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2344 /* not set-id, must be wrapped */
2350 find_beginning(void)
2352 register char *s, *s2;
2354 /* skip forward in input to the real script? */
2358 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2359 croak("No Perl script found in input\n");
2360 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2361 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2363 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2365 while (*s == ' ' || *s == '\t') s++;
2367 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2368 if (strnEQ(s2-4,"perl",4))
2370 while (s = moreswitches(s)) ;
2372 if (cddir && PerlDir_chdir(cddir) < 0)
2373 croak("Can't chdir to %s",cddir);
2381 uid = (int)getuid();
2382 euid = (int)geteuid();
2383 gid = (int)getgid();
2384 egid = (int)getegid();
2389 tainting |= (uid && (euid != uid || egid != gid));
2393 forbid_setid(char *s)
2396 croak("No %s allowed while running setuid", s);
2398 croak("No %s allowed while running setgid", s);
2405 curstash = debstash;
2406 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2408 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2409 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2410 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2411 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2412 sv_setiv(DBsingle, 0);
2413 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2414 sv_setiv(DBtrace, 0);
2415 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2416 sv_setiv(DBsignal, 0);
2417 curstash = defstash;
2420 #ifndef STRESS_REALLOC
2421 #define REASONABLE(size) (size)
2423 #define REASONABLE(size) (1) /* unreasonable */
2427 init_stacks(ARGSproto)
2429 /* start with 128-item stack and 8K cxstack */
2430 curstackinfo = new_stackinfo(REASONABLE(128),
2431 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
2432 curstackinfo->si_type = SI_MAIN;
2433 curstack = curstackinfo->si_stack;
2434 mainstack = curstack; /* remember in case we switch stacks */
2436 stack_base = AvARRAY(curstack);
2437 stack_sp = stack_base;
2438 stack_max = stack_base + AvMAX(curstack);
2440 New(50,tmps_stack,REASONABLE(128),SV*);
2443 tmps_max = REASONABLE(128);
2446 * The following stacks almost certainly should be per-interpreter,
2447 * but for now they're not. XXX
2451 markstack_ptr = markstack;
2453 New(54,markstack,REASONABLE(32),I32);
2454 markstack_ptr = markstack;
2455 markstack_max = markstack + REASONABLE(32);
2463 New(54,scopestack,REASONABLE(32),I32);
2465 scopestack_max = REASONABLE(32);
2471 New(54,savestack,REASONABLE(128),ANY);
2473 savestack_max = REASONABLE(128);
2479 New(54,retstack,REASONABLE(16),OP*);
2481 retstack_max = REASONABLE(16);
2491 while (curstackinfo->si_next)
2492 curstackinfo = curstackinfo->si_next;
2493 while (curstackinfo) {
2494 PERL_SI *p = curstackinfo->si_prev;
2495 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
2496 Safefree(curstackinfo->si_cxstack);
2497 Safefree(curstackinfo);
2500 Safefree(tmps_stack);
2507 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2516 subname = newSVpv("main",4);
2520 init_predump_symbols(void)
2526 sv_setpvn(perl_get_sv("\"", TRUE), " ", 1);
2527 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2528 GvMULTI_on(stdingv);
2529 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2530 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2532 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2534 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2536 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2538 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2540 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2542 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2543 GvMULTI_on(othergv);
2544 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2545 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2547 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2549 statname = NEWSV(66,0); /* last filename we did stat on */
2552 osname = savepv(OSNAME);
2556 init_postdump_symbols(register int argc, register char **argv, register char **env)
2563 argc--,argv++; /* skip name of script */
2565 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2568 if (argv[0][1] == '-') {
2572 if (s = strchr(argv[0], '=')) {
2574 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2577 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2580 toptarget = NEWSV(0,0);
2581 sv_upgrade(toptarget, SVt_PVFM);
2582 sv_setpvn(toptarget, "", 0);
2583 bodytarget = NEWSV(0,0);
2584 sv_upgrade(bodytarget, SVt_PVFM);
2585 sv_setpvn(bodytarget, "", 0);
2586 formtarget = bodytarget;
2589 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2590 sv_setpv(GvSV(tmpgv),origfilename);
2591 magicname("0", "0", 1);
2593 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2594 sv_setpv(GvSV(tmpgv),origargv[0]);
2595 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2597 (void)gv_AVadd(argvgv);
2598 av_clear(GvAVn(argvgv));
2599 for (; argc > 0; argc--,argv++) {
2600 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2603 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2607 hv_magic(hv, envgv, 'E');
2608 #ifndef VMS /* VMS doesn't have environ array */
2609 /* Note that if the supplied env parameter is actually a copy
2610 of the global environ then it may now point to free'd memory
2611 if the environment has been modified since. To avoid this
2612 problem we treat env==NULL as meaning 'use the default'
2617 environ[0] = Nullch;
2618 for (; *env; env++) {
2619 if (!(s = strchr(*env,'=')))
2622 #if defined(WIN32) || defined(MSDOS)
2625 sv = newSVpv(s--,0);
2626 (void)hv_store(hv, *env, s - *env, sv, 0);
2628 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2629 /* Sins of the RTL. See note in my_setenv(). */
2630 (void)PerlEnv_putenv(savepv(*env));
2634 #ifdef DYNAMIC_ENV_FETCH
2635 HvNAME(hv) = savepv(ENV_HV_NAME);
2639 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2640 sv_setiv(GvSV(tmpgv), (IV)getpid());
2649 s = PerlEnv_getenv("PERL5LIB");
2653 incpush(PerlEnv_getenv("PERLLIB"), FALSE);
2655 /* Treat PERL5?LIB as a possible search list logical name -- the
2656 * "natural" VMS idiom for a Unix path string. We allow each
2657 * element to be a set of |-separated directories for compatibility.
2661 if (my_trnlnm("PERL5LIB",buf,0))
2662 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2664 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2668 /* Use the ~-expanded versions of APPLLIB (undocumented),
2669 ARCHLIB PRIVLIB SITEARCH and SITELIB
2672 incpush(APPLLIB_EXP, FALSE);
2676 incpush(ARCHLIB_EXP, FALSE);
2679 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2681 incpush(PRIVLIB_EXP, FALSE);
2684 incpush(SITEARCH_EXP, FALSE);
2687 incpush(SITELIB_EXP, FALSE);
2690 incpush(".", FALSE);
2694 # define PERLLIB_SEP ';'
2697 # define PERLLIB_SEP '|'
2699 # define PERLLIB_SEP ':'
2702 #ifndef PERLLIB_MANGLE
2703 # define PERLLIB_MANGLE(s,n) (s)
2707 incpush(char *p, int addsubdirs)
2709 SV *subdir = Nullsv;
2710 static char *archpat_auto;
2716 subdir = NEWSV(55,0);
2717 if (!archpat_auto) {
2718 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2719 + sizeof("//auto"));
2720 New(55, archpat_auto, len, char);
2721 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2723 for (len = sizeof(ARCHNAME) + 2;
2724 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2725 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2730 /* Break at all separators */
2732 SV *libdir = NEWSV(55,0);
2735 /* skip any consecutive separators */
2736 while ( *p == PERLLIB_SEP ) {
2737 /* Uncomment the next line for PATH semantics */
2738 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2742 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2743 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2748 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2749 p = Nullch; /* break out */
2753 * BEFORE pushing libdir onto @INC we may first push version- and
2754 * archname-specific sub-directories.
2757 struct stat tmpstatbuf;
2762 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2764 while (unix[len-1] == '/') len--; /* Cosmetic */
2765 sv_usepvn(libdir,unix,len);
2768 PerlIO_printf(PerlIO_stderr(),
2769 "Failed to unixify @INC element \"%s\"\n",
2772 /* .../archname/version if -d .../archname/version/auto */
2773 sv_setsv(subdir, libdir);
2774 sv_catpv(subdir, archpat_auto);
2775 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2776 S_ISDIR(tmpstatbuf.st_mode))
2777 av_push(GvAVn(incgv),
2778 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2780 /* .../archname if -d .../archname/auto */
2781 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2782 strlen(patchlevel) + 1, "", 0);
2783 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2784 S_ISDIR(tmpstatbuf.st_mode))
2785 av_push(GvAVn(incgv),
2786 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2789 /* finally push this lib directory on the end of @INC */
2790 av_push(GvAVn(incgv), libdir);
2793 SvREFCNT_dec(subdir);
2797 static struct perl_thread *
2800 struct perl_thread *thr;
2803 Newz(53, thr, 1, struct perl_thread);
2804 curcop = &compiling;
2805 thr->cvcache = newHV();
2806 thr->threadsv = newAV();
2807 /* thr->threadsvp is set when find_threadsv is called */
2808 thr->specific = newAV();
2809 thr->errhv = newHV();
2810 thr->flags = THRf_R_JOINABLE;
2811 MUTEX_INIT(&thr->mutex);
2812 /* Handcraft thrsv similarly to mess_sv */
2813 New(53, thrsv, 1, SV);
2814 Newz(53, xpv, 1, XPV);
2815 SvFLAGS(thrsv) = SVt_PV;
2816 SvANY(thrsv) = (void*)xpv;
2817 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
2818 SvPVX(thrsv) = (char*)thr;
2819 SvCUR_set(thrsv, sizeof(thr));
2820 SvLEN_set(thrsv, sizeof(thr));
2821 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
2823 curcop = &compiling;
2826 MUTEX_LOCK(&threads_mutex);
2831 MUTEX_UNLOCK(&threads_mutex);
2833 #ifdef HAVE_THREAD_INTERN
2834 init_thread_intern(thr);
2837 #ifdef SET_THREAD_SELF
2838 SET_THREAD_SELF(thr);
2840 thr->self = pthread_self();
2841 #endif /* SET_THREAD_SELF */
2845 * These must come after the SET_THR because sv_setpvn does
2846 * SvTAINT and the taint fields require dTHR.
2848 toptarget = NEWSV(0,0);
2849 sv_upgrade(toptarget, SVt_PVFM);
2850 sv_setpvn(toptarget, "", 0);
2851 bodytarget = NEWSV(0,0);
2852 sv_upgrade(bodytarget, SVt_PVFM);
2853 sv_setpvn(bodytarget, "", 0);
2854 formtarget = bodytarget;
2855 thr->errsv = newSVpv("", 0);
2856 (void) find_threadsv("@"); /* Ensure $@ is initialised early */
2859 #endif /* USE_THREADS */
2862 call_list(I32 oldscope, AV *list)
2865 line_t oldline = curcop->cop_line;
2870 while (AvFILL(list) >= 0) {
2871 CV *cv = (CV*)av_shift(list);
2880 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2881 (void)SvPV(atsv, len);
2884 curcop = &compiling;
2885 curcop->cop_line = oldline;
2886 if (list == beginav)
2887 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2889 sv_catpv(atsv, "END failed--cleanup aborted");
2890 while (scopestack_ix > oldscope)
2892 croak("%s", SvPVX(atsv));
2900 /* my_exit() was called */
2901 while (scopestack_ix > oldscope)
2904 curstash = defstash;
2906 call_list(oldscope, endav);
2908 curcop = &compiling;
2909 curcop->cop_line = oldline;
2911 if (list == beginav)
2912 croak("BEGIN failed--compilation aborted");
2914 croak("END failed--cleanup aborted");
2920 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2925 curcop = &compiling;
2926 curcop->cop_line = oldline;
2939 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
2940 thr, (unsigned long) status));
2941 #endif /* USE_THREADS */
2950 STATUS_NATIVE_SET(status);
2957 my_failure_exit(void)
2960 if (vaxc$errno & 1) {
2961 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2962 STATUS_NATIVE_SET(44);
2965 if (!vaxc$errno && errno) /* unlikely */
2966 STATUS_NATIVE_SET(44);
2968 STATUS_NATIVE_SET(vaxc$errno);
2972 STATUS_POSIX_SET(errno);
2973 else if (STATUS_POSIX == 0)
2974 STATUS_POSIX_SET(255);
2983 register PERL_CONTEXT *cx;
2992 (void)UNLINK(e_tmpname);
2993 Safefree(e_tmpname);
2997 POPSTACK_TO(mainstack);
2998 if (cxstack_ix >= 0) {