3 * Copyright (c) 1987-1997 Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
16 #include "patchlevel.h"
18 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
23 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
24 char *getenv _((char *)); /* Usually in <stdlib.h> */
27 dEXTCONST char rcsid[] = "perl.c\nPatch level: ###\n";
35 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
45 curcop = &compiling; \
52 laststype = OP_STAT; \
54 maxsysfd = MAXSYSFD; \
61 laststype = OP_STAT; \
65 static void find_beginning _((void));
66 static void forbid_setid _((char *));
67 static void incpush _((char *, int));
68 static void init_ids _((void));
69 static void init_debugger _((void));
70 static void init_lexer _((void));
71 static void init_main_stash _((void));
72 static void init_perllib _((void));
73 static void init_postdump_symbols _((int, char **, char **));
74 static void init_predump_symbols _((void));
75 static void my_exit_jump _((void)) __attribute__((noreturn));
76 static void nuke_stacks _((void));
77 static void open_script _((char *, bool, SV *));
79 static void thread_destruct _((void *));
80 #endif /* USE_THREADS */
81 static void usage _((char *));
82 static void validate_suid _((char *, char*));
84 static int fdscript = -1;
86 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
87 #include <asm/sigcontext.h>
89 catch_sigsegv(int signo, struct sigcontext_struct sc)
91 signal(SIGSEGV, SIG_DFL);
92 fprintf(stderr, "Segmentation fault dereferencing 0x%lx\n"
93 "return_address = 0x%lx, eip = 0x%lx\n",
94 sc.cr2, __builtin_return_address(0), sc.eip);
95 fprintf(stderr, "thread = 0x%lx\n", (unsigned long)THR);
102 PerlInterpreter *sv_interp;
105 New(53, sv_interp, 1, PerlInterpreter);
110 perl_construct( sv_interp )
111 register PerlInterpreter *sv_interp;
113 #if defined(USE_THREADS) && !defined(FAKE_THREADS)
117 if (!(curinterp = sv_interp))
121 Zero(sv_interp, 1, PerlInterpreter);
124 /* Init the real globals? */
127 #ifdef NEED_PTHREAD_INIT
129 #endif /* NEED_PTHREAD_INIT */
130 New(53, thr, 1, struct thread);
131 MUTEX_INIT(&malloc_mutex);
132 MUTEX_INIT(&sv_mutex);
133 MUTEX_INIT(&eval_mutex);
134 COND_INIT(&eval_cond);
135 MUTEX_INIT(&nthreads_mutex);
136 COND_INIT(&nthreads_cond);
143 thr->next = thr->prev = thr->next_run = thr->prev_run = thr;
147 self = pthread_self();
148 if (pthread_key_create(&thr_key, thread_destruct))
149 croak("panic: pthread_key_create");
150 if (pthread_setspecific(thr_key, (void *) thr))
151 croak("panic: pthread_setspecific");
152 #endif /* FAKE_THREADS */
153 #endif /* USE_THREADS */
155 linestr = NEWSV(65,80);
156 sv_upgrade(linestr,SVt_PVIV);
158 if (!SvREADONLY(&sv_undef)) {
159 SvREADONLY_on(&sv_undef);
163 SvREADONLY_on(&sv_no);
165 sv_setpv(&sv_yes,Yes);
167 SvREADONLY_on(&sv_yes);
170 nrs = newSVpv("\n", 1);
171 rs = SvREFCNT_inc(nrs);
173 sighandlerp = sighandler;
178 * There is no way we can refer to them from Perl so close them to save
179 * space. The other alternative would be to provide STDAUX and STDPRN
182 (void)fclose(stdaux);
183 (void)fclose(stdprn);
189 perl_destruct_level = 1;
191 if(perl_destruct_level > 0)
197 start_env.je_prev = NULL;
198 start_env.je_ret = -1;
199 start_env.je_mustcatch = TRUE;
200 top_env = &start_env;
203 SET_NUMERIC_STANDARD();
204 #if defined(SUBVERSION) && SUBVERSION > 0
205 sprintf(patchlevel, "%7.5f", (double) 5
206 + ((double) PATCHLEVEL / (double) 1000)
207 + ((double) SUBVERSION / (double) 100000));
209 sprintf(patchlevel, "%5.3f", (double) 5 +
210 ((double) PATCHLEVEL / (double) 1000));
213 #if defined(LOCAL_PATCH_COUNT)
214 localpatches = local_patches; /* For possible -v */
217 PerlIO_init(); /* Hook to IO system */
219 fdpid = newAV(); /* for remembering popen pids by fd */
223 New(51,debname,128,char);
224 New(52,debdelim,128,char);
235 struct thread *thr = (struct thread *) arg;
237 * Decrement the global thread count and signal anyone listening.
238 * The only official thread listening is the original thread while
239 * in perl_destruct. It waits until it's the only thread and then
240 * performs END blocks and other process clean-ups.
242 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "thread_destruct: 0x%lx\n", (unsigned long) thr));
245 MUTEX_LOCK(&nthreads_mutex);
247 COND_BROADCAST(&nthreads_cond);
248 MUTEX_UNLOCK(&nthreads_mutex);
250 #endif /* USE_THREADS */
253 perl_destruct(sv_interp)
254 register PerlInterpreter *sv_interp;
257 int destruct_level; /* 0=none, 1=full, 2=full with checks */
261 if (!(curinterp = sv_interp))
266 /* Wait until all user-created threads go away */
267 MUTEX_LOCK(&nthreads_mutex);
270 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: waiting for %d threads\n",
272 COND_WAIT(&nthreads_cond, &nthreads_mutex);
274 /* At this point, we're the last thread */
275 MUTEX_UNLOCK(&nthreads_mutex);
276 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
277 MUTEX_DESTROY(&nthreads_mutex);
278 COND_DESTROY(&nthreads_cond);
279 #endif /* !defined(FAKE_THREADS) */
280 #endif /* USE_THREADS */
282 destruct_level = perl_destruct_level;
286 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
288 if (destruct_level < i)
297 /* We must account for everything. */
299 /* Destroy the main CV and syntax tree */
301 curpad = AvARRAY(comppad);
306 SvREFCNT_dec(main_cv);
311 * Try to destruct global references. We do this first so that the
312 * destructors and destructees still exist. Some sv's might remain.
313 * Non-referenced objects are on their own.
320 /* unhook hooks which will soon be, or use, destroyed data */
321 SvREFCNT_dec(warnhook);
323 SvREFCNT_dec(diehook);
325 SvREFCNT_dec(parsehook);
328 if (destruct_level == 0){
330 DEBUG_P(debprofdump());
332 /* The exit() function will do everything that needs doing. */
336 /* loosen bonds of global variables */
339 (void)PerlIO_close(rsfp);
343 /* Filters for program text */
344 SvREFCNT_dec(rsfp_filters);
345 rsfp_filters = Nullav;
357 sawampersand = FALSE; /* must save all match strings */
358 sawstudy = FALSE; /* do fbm_instr on all strings */
373 /* magical thingies */
375 Safefree(ofs); /* $, */
378 Safefree(ors); /* $\ */
381 SvREFCNT_dec(nrs); /* $\ helper */
384 multiline = 0; /* $* */
386 SvREFCNT_dec(statname);
390 /* defgv, aka *_ should be taken care of elsewhere */
392 #if 0 /* just about all regexp stuff, seems to be ok */
394 /* shortcuts to regexp stuff */
399 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
401 regprecomp = NULL; /* uncompiled string. */
402 regparse = NULL; /* Input-scan pointer. */
403 regxend = NULL; /* End of input for compile */
404 regnpar = 0; /* () count. */
405 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
406 regsize = 0; /* Code size. */
407 regnaughty = 0; /* How bad is this pattern? */
408 regsawback = 0; /* Did we see \1, ...? */
410 reginput = NULL; /* String-input pointer. */
411 regbol = NULL; /* Beginning of input, for ^ check. */
412 regeol = NULL; /* End of input, for $ check. */
413 regstartp = (char **)NULL; /* Pointer to startp array. */
414 regendp = (char **)NULL; /* Ditto for endp. */
415 reglastparen = 0; /* Similarly for lastparen. */
416 regtill = NULL; /* How far we are required to go. */
417 regflags = 0; /* are we folding, multilining? */
418 regprev = (char)NULL; /* char before regbol, \n if none */
422 /* clean up after study() */
423 SvREFCNT_dec(lastscream);
425 Safefree(screamfirst);
427 Safefree(screamnext);
430 /* startup and shutdown function lists */
431 SvREFCNT_dec(beginav);
433 SvREFCNT_dec(initav);
438 /* temp stack during pp_sort() */
439 SvREFCNT_dec(sortstack);
442 /* shortcuts just get cleared */
452 /* reset so print() ends up where we expect */
455 /* Prepare to destruct main symbol table. */
462 if (destruct_level >= 2) {
463 if (scopestack_ix != 0)
464 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
465 (long)scopestack_ix);
466 if (savestack_ix != 0)
467 warn("Unbalanced saves: %ld more saves than restores\n",
469 if (tmps_floor != -1)
470 warn("Unbalanced tmps: %ld more allocs than frees\n",
471 (long)tmps_floor + 1);
472 if (cxstack_ix != -1)
473 warn("Unbalanced context: %ld more PUSHes than POPs\n",
474 (long)cxstack_ix + 1);
477 /* Now absolutely destruct everything, somehow or other, loops or no. */
479 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
480 while (sv_count != 0 && sv_count != last_sv_count) {
481 last_sv_count = sv_count;
484 SvFLAGS(strtab) &= ~SVTYPEMASK;
485 SvFLAGS(strtab) |= SVt_PVHV;
487 /* Destruct the global string table. */
489 /* Yell and reset the HeVAL() slots that are still holding refcounts,
490 * so that sv_free() won't fail on them.
499 array = HvARRAY(strtab);
503 warn("Unbalanced string table refcount: (%d) for \"%s\"",
504 HeVAL(hent) - Nullsv, HeKEY(hent));
505 HeVAL(hent) = Nullsv;
515 SvREFCNT_dec(strtab);
518 warn("Scalars leaked: %ld\n", (long)sv_count);
522 /* No SVs have survived, need to clean out */
526 Safefree(origfilename);
528 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
530 DEBUG_P(debprofdump());
532 MUTEX_DESTROY(&sv_mutex);
533 MUTEX_DESTROY(&malloc_mutex);
534 MUTEX_DESTROY(&eval_mutex);
535 COND_DESTROY(&eval_cond);
536 #endif /* USE_THREADS */
538 /* As the absolutely last thing, free the non-arena SV for mess() */
541 /* we know that type >= SVt_PV */
543 Safefree(SvPVX(mess_sv));
544 Safefree(SvANY(mess_sv));
552 PerlInterpreter *sv_interp;
554 if (!(curinterp = sv_interp))
560 perl_parse(sv_interp, xsinit, argc, argv, env)
561 PerlInterpreter *sv_interp;
562 void (*xsinit)_((void));
570 char *scriptname = NULL;
571 VOL bool dosearch = FALSE;
578 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
581 croak("suidperl is no longer needed since the kernel can now execute\n\
582 setuid perl scripts securely.\n");
586 if (!(curinterp = sv_interp))
589 #if defined(NeXT) && defined(__DYNAMIC__)
590 _dyld_lookup_and_bind
591 ("__environ", (unsigned long *) &environ_pointer, NULL);
596 #ifndef VMS /* VMS doesn't have environ array */
597 origenviron = environ;
603 /* Come here if running an undumped a.out. */
605 origfilename = savepv(argv[0]);
607 cxstack_ix = -1; /* start label stack again */
609 init_postdump_symbols(argc,argv,env);
614 curpad = AvARRAY(comppad);
619 SvREFCNT_dec(main_cv);
623 oldscope = scopestack_ix;
631 /* my_exit() was called */
632 while (scopestack_ix > oldscope)
637 call_list(oldscope, endav);
639 return STATUS_NATIVE_EXPORT;
642 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
646 sv_setpvn(linestr,"",0);
647 sv = newSVpv("",0); /* first used for -I flags */
651 for (argc--,argv++; argc > 0; argc--,argv++) {
652 if (argv[0][0] != '-' || !argv[0][1])
656 validarg = " PHOOEY ";
681 if (s = moreswitches(s))
691 if (euid != uid || egid != gid)
692 croak("No -e allowed in setuid scripts");
694 e_tmpname = savepv(TMPPATH);
695 (void)mktemp(e_tmpname);
697 croak("Can't mktemp()");
698 e_fp = PerlIO_open(e_tmpname,"w");
700 croak("Cannot open temporary file");
705 PerlIO_puts(e_fp,argv[1]);
709 croak("No code specified for -e");
710 (void)PerlIO_putc(e_fp,'\n');
721 incpush(argv[1], TRUE);
722 sv_catpv(sv,argv[1]);
739 preambleav = newAV();
740 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
742 Sv = newSVpv("print myconfig();",0);
744 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
746 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
748 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
749 sv_catpv(Sv,"\" Compile-time options:");
751 sv_catpv(Sv," DEBUGGING");
754 sv_catpv(Sv," NO_EMBED");
757 sv_catpv(Sv," MULTIPLICITY");
759 sv_catpv(Sv,"\\n\",");
761 #if defined(LOCAL_PATCH_COUNT)
762 if (LOCAL_PATCH_COUNT > 0) {
764 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
765 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
767 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
771 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
774 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
776 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
781 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
782 print \" \\%ENV:\\n @env\\n\" if @env; \
783 print \" \\@INC:\\n @INC\\n\";");
786 Sv = newSVpv("config_vars(qw(",0);
791 av_push(preambleav, Sv);
792 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
801 if (*++s) { /* catch use of gnu style long options */
802 if (strEQ(s, "version")) {
806 if (strEQ(s, "help")) {
810 croak("Unrecognized switch: --%s (-h will show valid options)",s);
817 croak("Unrecognized switch: -%s (-h will show valid options)",s);
822 if (!tainting && (s = getenv("PERL5OPT"))) {
833 if (!strchr("DIMUdmw", *s))
834 croak("Illegal switch in PERL5OPT: -%c", *s);
840 scriptname = argv[0];
842 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
844 warn("Did you forget to compile with -DMULTIPLICITY?");
846 croak("Can't write to temp file for -e: %s", Strerror(errno));
850 scriptname = e_tmpname;
852 else if (scriptname == Nullch) {
854 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
862 open_script(scriptname,dosearch,sv);
864 validate_suid(validarg, scriptname);
869 main_cv = compcv = (CV*)NEWSV(1104,0);
870 sv_upgrade((SV *)compcv, SVt_PVCV);
874 av_push(comppad, Nullsv);
875 curpad = AvARRAY(comppad);
876 comppad_name = newAV();
877 comppad_name_fill = 0;
878 min_intro_pending = 0;
881 av_store(comppad_name, 0, newSVpv("@_", 2));
882 curpad[0] = (SV*)newAV();
883 SvPADMY_on(curpad[0]); /* XXX Needed? */
885 New(666, CvMUTEXP(compcv), 1, perl_mutex);
886 MUTEX_INIT(CvMUTEXP(compcv));
887 #endif /* USE_THREADS */
889 comppadlist = newAV();
890 AvREAL_off(comppadlist);
891 av_store(comppadlist, 0, (SV*)comppad_name);
892 av_store(comppadlist, 1, (SV*)comppad);
893 CvPADLIST(compcv) = comppadlist;
895 boot_core_UNIVERSAL();
897 (*xsinit)(); /* in case linked C routines want magical variables */
898 #if defined(VMS) || defined(WIN32)
902 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
903 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
906 init_predump_symbols();
908 init_postdump_symbols(argc,argv,env);
912 /* now parse the script */
915 if (yyparse() || error_count) {
917 croak("%s had compilation errors.\n", origfilename);
919 croak("Execution of %s aborted due to compilation errors.\n",
923 curcop->cop_line = 0;
927 (void)UNLINK(e_tmpname);
932 /* now that script is parsed, we can modify record separator */
934 rs = SvREFCNT_inc(nrs);
935 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
947 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
948 dump_mstats("after compilation:");
959 PerlInterpreter *sv_interp;
966 if (!(curinterp = sv_interp))
969 oldscope = scopestack_ix;
974 cxstack_ix = -1; /* start context stack again */
977 /* my_exit() was called */
978 while (scopestack_ix > oldscope)
983 call_list(oldscope, endav);
985 if (getenv("PERL_DEBUG_MSTATS"))
986 dump_mstats("after execution: ");
989 return STATUS_NATIVE_EXPORT;
992 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
997 if (curstack != mainstack) {
999 SWITCHSTACK(curstack, mainstack);
1004 DEBUG_r(PerlIO_printf(PerlIO_stderr(), "%s $` $& $' support.\n",
1005 sawampersand ? "Enabling" : "Omitting"));
1008 DEBUG_x(dump_all());
1009 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1011 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1012 (unsigned long) thr));
1013 #endif /* USE_THREADS */
1016 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1019 if (PERLDB_SINGLE && DBsingle)
1020 sv_setiv(DBsingle, 1);
1022 call_list(oldscope, initav);
1032 else if (main_start) {
1033 CvDEPTH(main_cv) = 1;
1044 perl_get_sv(name, create)
1048 GV* gv = gv_fetchpv(name, create, SVt_PV);
1055 perl_get_av(name, create)
1059 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1068 perl_get_hv(name, create)
1072 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1081 perl_get_cv(name, create)
1085 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1086 if (create && !GvCVu(gv))
1087 return newSUB(start_subparse(FALSE, 0),
1088 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1096 /* Be sure to refetch the stack pointer after calling these routines. */
1099 perl_call_argv(subname, flags, argv)
1101 I32 flags; /* See G_* flags in cop.h */
1102 register char **argv; /* null terminated arg list */
1110 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1115 return perl_call_pv(subname, flags);
1119 perl_call_pv(subname, flags)
1120 char *subname; /* name of the subroutine */
1121 I32 flags; /* See G_* flags in cop.h */
1123 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1127 perl_call_method(methname, flags)
1128 char *methname; /* name of the subroutine */
1129 I32 flags; /* See G_* flags in cop.h */
1136 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1139 return perl_call_sv(*stack_sp--, flags);
1142 /* May be called with any of a CV, a GV, or an SV containing the name. */
1144 perl_call_sv(sv, flags)
1146 I32 flags; /* See G_* flags in cop.h */
1149 LOGOP myop; /* fake syntax tree node */
1155 bool oldcatch = CATCH_GET;
1160 if (flags & G_DISCARD) {
1165 Zero(&myop, 1, LOGOP);
1166 myop.op_next = Nullop;
1167 if (!(flags & G_NOARGS))
1168 myop.op_flags |= OPf_STACKED;
1169 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1170 (flags & G_ARRAY) ? OPf_WANT_LIST :
1175 EXTEND(stack_sp, 1);
1178 oldscope = scopestack_ix;
1180 if (PERLDB_SUB && curstash != debstash
1181 /* Handle first BEGIN of -d. */
1182 && (DBcv || (DBcv = GvCV(DBsub)))
1183 /* Try harder, since this may have been a sighandler, thus
1184 * curstash may be meaningless. */
1185 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1186 op->op_private |= OPpENTERSUB_DB;
1188 if (flags & G_EVAL) {
1189 cLOGOP->op_other = op;
1191 /* we're trying to emulate pp_entertry() here */
1193 register CONTEXT *cx;
1194 I32 gimme = GIMME_V;
1199 push_return(op->op_next);
1200 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1202 eval_root = op; /* Only needed so that goto works right. */
1205 if (flags & G_KEEPERR)
1208 sv_setpv(GvSV(errgv),"");
1220 /* my_exit() was called */
1221 curstash = defstash;
1225 croak("Callback called exit");
1234 stack_sp = stack_base + oldmark;
1235 if (flags & G_ARRAY)
1239 *++stack_sp = &sv_undef;
1247 if (op == (OP*)&myop)
1248 op = pp_entersub(ARGS);
1251 retval = stack_sp - (stack_base + oldmark);
1252 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1253 sv_setpv(GvSV(errgv),"");
1256 if (flags & G_EVAL) {
1257 if (scopestack_ix > oldscope) {
1261 register CONTEXT *cx;
1273 CATCH_SET(oldcatch);
1275 if (flags & G_DISCARD) {
1276 stack_sp = stack_base + oldmark;
1285 /* Eval a string. The G_EVAL flag is always assumed. */
1288 perl_eval_sv(sv, flags)
1290 I32 flags; /* See G_* flags in cop.h */
1293 UNOP myop; /* fake syntax tree node */
1295 I32 oldmark = sp - stack_base;
1302 if (flags & G_DISCARD) {
1310 EXTEND(stack_sp, 1);
1312 oldscope = scopestack_ix;
1314 if (!(flags & G_NOARGS))
1315 myop.op_flags = OPf_STACKED;
1316 myop.op_next = Nullop;
1317 myop.op_type = OP_ENTEREVAL;
1318 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1319 (flags & G_ARRAY) ? OPf_WANT_LIST :
1321 if (flags & G_KEEPERR)
1322 myop.op_flags |= OPf_SPECIAL;
1332 /* my_exit() was called */
1333 curstash = defstash;
1337 croak("Callback called exit");
1346 stack_sp = stack_base + oldmark;
1347 if (flags & G_ARRAY)
1351 *++stack_sp = &sv_undef;
1356 if (op == (OP*)&myop)
1357 op = pp_entereval(ARGS);
1360 retval = stack_sp - (stack_base + oldmark);
1361 if (!(flags & G_KEEPERR))
1362 sv_setpv(GvSV(errgv),"");
1366 if (flags & G_DISCARD) {
1367 stack_sp = stack_base + oldmark;
1377 perl_eval_pv(p, croak_on_error)
1383 SV* sv = newSVpv(p, 0);
1386 perl_eval_sv(sv, G_SCALAR);
1393 if (croak_on_error && SvTRUE(GvSV(errgv)))
1394 croak(SvPVx(GvSV(errgv), na));
1399 /* Require a module. */
1405 SV* sv = sv_newmortal();
1406 sv_setpv(sv, "require '");
1409 perl_eval_sv(sv, G_DISCARD);
1413 magicname(sym,name,namlen)
1420 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1421 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1425 usage(name) /* XXX move this out into a module ? */
1428 /* This message really ought to be max 23 lines.
1429 * Removed -h because the user already knows that opton. Others? */
1430 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1431 printf("\n -0[octal] specify record separator (\\0, if no argument)");
1432 printf("\n -a autosplit mode with -n or -p (splits $_ into @F)");
1433 printf("\n -c check syntax only (runs BEGIN and END blocks)");
1434 printf("\n -d[:debugger] run scripts under debugger");
1435 printf("\n -D[number/list] set debugging flags (argument is a bit mask or flags)");
1436 printf("\n -e 'command' one line of script. Several -e's allowed. Omit [programfile].");
1437 printf("\n -F/pattern/ split() pattern for autosplit (-a). The //'s are optional.");
1438 printf("\n -i[extension] edit <> files in place (make backup if extension supplied)");
1439 printf("\n -Idirectory specify @INC/#include directory (may be used more than once)");
1440 printf("\n -l[octal] enable line ending processing, specifies line terminator");
1441 printf("\n -[mM][-]module.. executes `use/no module...' before executing your script.");
1442 printf("\n -n assume 'while (<>) { ... }' loop around your script");
1443 printf("\n -p assume loop like -n but print line also like sed");
1444 printf("\n -P run script through C preprocessor before compilation");
1445 printf("\n -s enable some switch parsing for switches after script name");
1446 printf("\n -S look for the script using PATH environment variable");
1447 printf("\n -T turn on tainting checks");
1448 printf("\n -u dump core after parsing script");
1449 printf("\n -U allow unsafe operations");
1450 printf("\n -v print version number and patchlevel of perl");
1451 printf("\n -V[:variable] print perl configuration information");
1452 printf("\n -w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.");
1453 printf("\n -x[directory] strip off text before #!perl line and perhaps cd to directory\n");
1456 /* This routine handles any switches that can be given during run */
1467 rschar = scan_oct(s, 4, &numlen);
1469 if (rschar & ~((U8)~0))
1471 else if (!rschar && numlen >= 2)
1472 nrs = newSVpv("", 0);
1475 nrs = newSVpv(&ch, 1);
1480 splitstr = savepv(s + 1);
1494 if (*s == ':' || *s == '=') {
1495 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1499 perldb = PERLDB_ALL;
1506 if (isALPHA(s[1])) {
1507 static char debopts[] = "psltocPmfrxuLHXD";
1510 for (s++; *s && (d = strchr(debopts,*s)); s++)
1511 debug |= 1 << (d - debopts);
1515 for (s++; isDIGIT(*s); s++) ;
1517 debug |= 0x80000000;
1519 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1520 for (s++; isALNUM(*s); s++) ;
1530 inplace = savepv(s+1);
1532 for (s = inplace; *s && !isSPACE(*s); s++) ;
1539 for (e = s; *e && !isSPACE(*e); e++) ;
1540 p = savepvn(s, e-s);
1547 croak("No space allowed after -I");
1557 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1566 ors = SvPV(nrs, orslen);
1567 ors = savepvn(ors, orslen);
1571 forbid_setid("-M"); /* XXX ? */
1574 forbid_setid("-m"); /* XXX ? */
1579 /* -M-foo == 'no foo' */
1580 if (*s == '-') { use = "no "; ++s; }
1581 sv = newSVpv(use,0);
1583 /* We allow -M'Module qw(Foo Bar)' */
1584 while(isALNUM(*s) || *s==':') ++s;
1586 sv_catpv(sv, start);
1587 if (*(start-1) == 'm') {
1589 croak("Can't use '%c' after -mname", *s);
1590 sv_catpv( sv, " ()");
1593 sv_catpvn(sv, start, s-start);
1594 sv_catpv(sv, " split(/,/,q{");
1599 if (preambleav == NULL)
1600 preambleav = newAV();
1601 av_push(preambleav, sv);
1604 croak("No space allowed after -%c", *(s-1));
1621 croak("Too late for \"-T\" option");
1633 #if defined(SUBVERSION) && SUBVERSION > 0
1634 printf("\nThis is perl, version 5.%03d_%02d", PATCHLEVEL, SUBVERSION);
1636 printf("\nThis is perl, version %s",patchlevel);
1639 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1641 printf("\n\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1644 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1647 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1648 "Version 5 port Copyright (c) 1994-1997, 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. */
1671 #ifdef ALTERNATE_SHEBANG
1672 case 'S': /* OS/2 needs -S on "extproc" line. */
1680 croak("Can't emulate -%.1s on #! line",s);
1685 /* compliments of Tom Christiansen */
1687 /* unexec() can be found in the Gnu emacs distribution */
1698 prog = newSVpv(BIN_EXP);
1699 sv_catpv(prog, "/perl");
1700 file = newSVpv(origfilename);
1701 sv_catpv(file, ".perldump");
1703 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1705 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1706 SvPVX(prog), SvPVX(file));
1710 # include <lib$routines.h>
1711 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1713 ABORT(); /* for use with undump */
1724 /* Note that strtab is a rather special HV. Assumptions are made
1725 about not iterating on it, and not adding tie magic to it.
1726 It is properly deallocated in perl_destruct() */
1728 HvSHAREKEYS_off(strtab); /* mandatory */
1729 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1730 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1732 curstash = defstash = newHV();
1733 curstname = newSVpv("main",4);
1734 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1735 SvREFCNT_dec(GvHV(gv));
1736 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1738 HvNAME(defstash) = savepv("main");
1739 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1741 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1742 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1744 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1745 sv_grow(GvSV(errgv), 240); /* Preallocate - for immediate signals. */
1746 sv_setpvn(GvSV(errgv), "", 0);
1747 curstash = defstash;
1748 compiling.cop_stash = defstash;
1749 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1750 /* We must init $/ before switches are processed. */
1751 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1754 #ifdef CAN_PROTOTYPE
1756 open_script(char *scriptname, bool dosearch, SV *sv)
1759 open_script(scriptname,dosearch,sv)
1766 char *xfound = Nullch;
1767 char *xfailed = Nullch;
1771 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1772 # define SEARCH_EXTS ".bat", ".cmd", NULL
1773 # define MAX_EXT_LEN 4
1776 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1777 # define MAX_EXT_LEN 4
1780 # define SEARCH_EXTS ".pl", ".com", NULL
1781 # define MAX_EXT_LEN 4
1783 /* additional extensions to try in each dir if scriptname not found */
1785 char *ext[] = { SEARCH_EXTS };
1786 int extidx = 0, i = 0;
1787 char *curext = Nullch;
1789 # define MAX_EXT_LEN 0
1793 * If dosearch is true and if scriptname does not contain path
1794 * delimiters, search the PATH for scriptname.
1796 * If SEARCH_EXTS is also defined, will look for each
1797 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1798 * while searching the PATH.
1800 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1801 * proceeds as follows:
1803 * + look for ./scriptname{,.foo,.bar}
1804 * + search the PATH for scriptname{,.foo,.bar}
1807 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1808 * this will not look in '.' if it's not in the PATH)
1813 int hasdir, idx = 0, deftypes = 1;
1816 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1817 /* The first time through, just add SEARCH_EXTS to whatever we
1818 * already have, so we can check for default file types. */
1820 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1826 if ((strlen(tokenbuf) + strlen(scriptname)
1827 + MAX_EXT_LEN) >= sizeof tokenbuf)
1828 continue; /* don't search dir with too-long name */
1829 strcat(tokenbuf, scriptname);
1833 if (strEQ(scriptname, "-"))
1835 if (dosearch) { /* Look in '.' first. */
1836 char *cur = scriptname;
1838 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1840 if (strEQ(ext[i++],curext)) {
1841 extidx = -1; /* already has an ext */
1846 DEBUG_p(PerlIO_printf(Perl_debug_log,
1847 "Looking for %s\n",cur));
1848 if (Stat(cur,&statbuf) >= 0) {
1856 if (cur == scriptname) {
1857 len = strlen(scriptname);
1858 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1860 cur = strcpy(tokenbuf, scriptname);
1862 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1863 && strcpy(tokenbuf+len, ext[extidx++]));
1868 if (dosearch && !strchr(scriptname, '/')
1870 && !strchr(scriptname, '\\')
1872 && (s = getenv("PATH"))) {
1875 bufend = s + strlen(s);
1876 while (s < bufend) {
1877 #if defined(atarist) || defined(DOSISH)
1882 && *s != ';'; len++, s++) {
1883 if (len < sizeof tokenbuf)
1886 if (len < sizeof tokenbuf)
1887 tokenbuf[len] = '\0';
1888 #else /* ! (atarist || DOSISH) */
1889 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1892 #endif /* ! (atarist || DOSISH) */
1895 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1896 continue; /* don't search dir with too-long name */
1898 #if defined(atarist) || defined(DOSISH)
1899 && tokenbuf[len - 1] != '/'
1900 && tokenbuf[len - 1] != '\\'
1903 tokenbuf[len++] = '/';
1904 if (len == 2 && tokenbuf[0] == '.')
1906 (void)strcpy(tokenbuf + len, scriptname);
1910 len = strlen(tokenbuf);
1911 if (extidx > 0) /* reset after previous loop */
1915 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
1916 retval = Stat(tokenbuf,&statbuf);
1918 } while ( retval < 0 /* not there */
1919 && extidx>=0 && ext[extidx] /* try an extension? */
1920 && strcpy(tokenbuf+len, ext[extidx++])
1925 if (S_ISREG(statbuf.st_mode)
1926 && cando(S_IRUSR,TRUE,&statbuf)
1928 && cando(S_IXUSR,TRUE,&statbuf)
1932 xfound = tokenbuf; /* bingo! */
1936 xfailed = savepv(tokenbuf);
1939 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
1941 seen_dot = 1; /* Disable message. */
1943 croak("Can't %s %s%s%s",
1944 (xfailed ? "execute" : "find"),
1945 (xfailed ? xfailed : scriptname),
1946 (xfailed ? "" : " on PATH"),
1947 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
1950 scriptname = xfound;
1953 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
1954 char *s = scriptname + 8;
1963 origfilename = savepv(e_tmpname ? "-e" : scriptname);
1964 curcop->cop_filegv = gv_fetchfile(origfilename);
1965 if (strEQ(origfilename,"-"))
1967 if (fdscript >= 0) {
1968 rsfp = PerlIO_fdopen(fdscript,"r");
1969 #if defined(HAS_FCNTL) && defined(F_SETFD)
1971 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
1974 else if (preprocess) {
1975 char *cpp_cfg = CPPSTDIN;
1976 SV *cpp = NEWSV(0,0);
1977 SV *cmd = NEWSV(0,0);
1979 if (strEQ(cpp_cfg, "cppstdin"))
1980 sv_catpvf(cpp, "%s/", BIN_EXP);
1981 sv_catpv(cpp, cpp_cfg);
1984 sv_catpv(sv,PRIVLIB_EXP);
1988 sed %s -e \"/^[^#]/b\" \
1989 -e \"/^#[ ]*include[ ]/b\" \
1990 -e \"/^#[ ]*define[ ]/b\" \
1991 -e \"/^#[ ]*if[ ]/b\" \
1992 -e \"/^#[ ]*ifdef[ ]/b\" \
1993 -e \"/^#[ ]*ifndef[ ]/b\" \
1994 -e \"/^#[ ]*else/b\" \
1995 -e \"/^#[ ]*elif[ ]/b\" \
1996 -e \"/^#[ ]*undef[ ]/b\" \
1997 -e \"/^#[ ]*endif/b\" \
2000 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2003 %s %s -e '/^[^#]/b' \
2004 -e '/^#[ ]*include[ ]/b' \
2005 -e '/^#[ ]*define[ ]/b' \
2006 -e '/^#[ ]*if[ ]/b' \
2007 -e '/^#[ ]*ifdef[ ]/b' \
2008 -e '/^#[ ]*ifndef[ ]/b' \
2009 -e '/^#[ ]*else/b' \
2010 -e '/^#[ ]*elif[ ]/b' \
2011 -e '/^#[ ]*undef[ ]/b' \
2012 -e '/^#[ ]*endif/b' \
2020 (doextract ? "-e '1,/^#/d\n'" : ""),
2022 scriptname, cpp, sv, CPPMINUS);
2024 #ifdef IAMSUID /* actually, this is caught earlier */
2025 if (euid != uid && !euid) { /* if running suidperl */
2027 (void)seteuid(uid); /* musn't stay setuid root */
2030 (void)setreuid((Uid_t)-1, uid);
2032 #ifdef HAS_SETRESUID
2033 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2039 if (geteuid() != uid)
2040 croak("Can't do seteuid!\n");
2042 #endif /* IAMSUID */
2043 rsfp = my_popen(SvPVX(cmd), "r");
2047 else if (!*scriptname) {
2048 forbid_setid("program input from stdin");
2049 rsfp = PerlIO_stdin();
2052 rsfp = PerlIO_open(scriptname,"r");
2053 #if defined(HAS_FCNTL) && defined(F_SETFD)
2055 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2063 #ifndef IAMSUID /* in case script is not readable before setuid */
2064 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2065 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2067 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2068 croak("Can't do setuid\n");
2072 croak("Can't open perl script \"%s\": %s\n",
2073 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2078 validate_suid(validarg, scriptname)
2084 /* do we need to emulate setuid on scripts? */
2086 /* This code is for those BSD systems that have setuid #! scripts disabled
2087 * in the kernel because of a security problem. Merely defining DOSUID
2088 * in perl will not fix that problem, but if you have disabled setuid
2089 * scripts in the kernel, this will attempt to emulate setuid and setgid
2090 * on scripts that have those now-otherwise-useless bits set. The setuid
2091 * root version must be called suidperl or sperlN.NNN. If regular perl
2092 * discovers that it has opened a setuid script, it calls suidperl with
2093 * the same argv that it had. If suidperl finds that the script it has
2094 * just opened is NOT setuid root, it sets the effective uid back to the
2095 * uid. We don't just make perl setuid root because that loses the
2096 * effective uid we had before invoking perl, if it was different from the
2099 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2100 * be defined in suidperl only. suidperl must be setuid root. The
2101 * Configure script will set this up for you if you want it.
2107 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2108 croak("Can't stat script \"%s\"",origfilename);
2109 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2113 #ifndef HAS_SETREUID
2114 /* On this access check to make sure the directories are readable,
2115 * there is actually a small window that the user could use to make
2116 * filename point to an accessible directory. So there is a faint
2117 * chance that someone could execute a setuid script down in a
2118 * non-accessible directory. I don't know what to do about that.
2119 * But I don't think it's too important. The manual lies when
2120 * it says access() is useful in setuid programs.
2122 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2123 croak("Permission denied");
2125 /* If we can swap euid and uid, then we can determine access rights
2126 * with a simple stat of the file, and then compare device and
2127 * inode to make sure we did stat() on the same file we opened.
2128 * Then we just have to make sure he or she can execute it.
2131 struct stat tmpstatbuf;
2135 setreuid(euid,uid) < 0
2138 setresuid(euid,uid,(Uid_t)-1) < 0
2141 || getuid() != euid || geteuid() != uid)
2142 croak("Can't swap uid and euid"); /* really paranoid */
2143 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2144 croak("Permission denied"); /* testing full pathname here */
2145 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2146 tmpstatbuf.st_ino != statbuf.st_ino) {
2147 (void)PerlIO_close(rsfp);
2148 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2150 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2151 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2152 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2153 (long)statbuf.st_dev, (long)statbuf.st_ino,
2154 SvPVX(GvSV(curcop->cop_filegv)),
2155 (long)statbuf.st_uid, (long)statbuf.st_gid);
2156 (void)my_pclose(rsfp);
2158 croak("Permission denied\n");
2162 setreuid(uid,euid) < 0
2164 # if defined(HAS_SETRESUID)
2165 setresuid(uid,euid,(Uid_t)-1) < 0
2168 || getuid() != uid || geteuid() != euid)
2169 croak("Can't reswap uid and euid");
2170 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2171 croak("Permission denied\n");
2173 #endif /* HAS_SETREUID */
2174 #endif /* IAMSUID */
2176 if (!S_ISREG(statbuf.st_mode))
2177 croak("Permission denied");
2178 if (statbuf.st_mode & S_IWOTH)
2179 croak("Setuid/gid script is writable by world");
2180 doswitches = FALSE; /* -s is insecure in suid */
2182 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2183 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2184 croak("No #! line");
2185 s = SvPV(linestr,na)+2;
2187 while (!isSPACE(*s)) s++;
2188 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2189 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2190 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2191 croak("Not a perl script");
2192 while (*s == ' ' || *s == '\t') s++;
2194 * #! arg must be what we saw above. They can invoke it by
2195 * mentioning suidperl explicitly, but they may not add any strange
2196 * arguments beyond what #! says if they do invoke suidperl that way.
2198 len = strlen(validarg);
2199 if (strEQ(validarg," PHOOEY ") ||
2200 strnNE(s,validarg,len) || !isSPACE(s[len]))
2201 croak("Args must match #! line");
2204 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2205 euid == statbuf.st_uid)
2207 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2208 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2209 #endif /* IAMSUID */
2211 if (euid) { /* oops, we're not the setuid root perl */
2212 (void)PerlIO_close(rsfp);
2215 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2217 croak("Can't do setuid\n");
2220 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2222 (void)setegid(statbuf.st_gid);
2225 (void)setregid((Gid_t)-1,statbuf.st_gid);
2227 #ifdef HAS_SETRESGID
2228 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2230 setgid(statbuf.st_gid);
2234 if (getegid() != statbuf.st_gid)
2235 croak("Can't do setegid!\n");
2237 if (statbuf.st_mode & S_ISUID) {
2238 if (statbuf.st_uid != euid)
2240 (void)seteuid(statbuf.st_uid); /* all that for this */
2243 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2245 #ifdef HAS_SETRESUID
2246 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2248 setuid(statbuf.st_uid);
2252 if (geteuid() != statbuf.st_uid)
2253 croak("Can't do seteuid!\n");
2255 else if (uid) { /* oops, mustn't run as root */
2257 (void)seteuid((Uid_t)uid);
2260 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2262 #ifdef HAS_SETRESUID
2263 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2269 if (geteuid() != uid)
2270 croak("Can't do seteuid!\n");
2273 if (!cando(S_IXUSR,TRUE,&statbuf))
2274 croak("Permission denied\n"); /* they can't do this */
2277 else if (preprocess)
2278 croak("-P not allowed for setuid/setgid script\n");
2279 else if (fdscript >= 0)
2280 croak("fd script not allowed in suidperl\n");
2282 croak("Script is not setuid/setgid in suidperl\n");
2284 /* We absolutely must clear out any saved ids here, so we */
2285 /* exec the real perl, substituting fd script for scriptname. */
2286 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2287 PerlIO_rewind(rsfp);
2288 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2289 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2290 if (!origargv[which])
2291 croak("Permission denied");
2292 origargv[which] = savepv(form("/dev/fd/%d/%s",
2293 PerlIO_fileno(rsfp), origargv[which]));
2294 #if defined(HAS_FCNTL) && defined(F_SETFD)
2295 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2297 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2298 croak("Can't do setuid\n");
2299 #endif /* IAMSUID */
2301 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2302 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2304 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2305 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2307 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2310 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2311 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2312 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2313 /* not set-id, must be wrapped */
2321 register char *s, *s2;
2323 /* skip forward in input to the real script? */
2327 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2328 croak("No Perl script found in input\n");
2329 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2330 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2332 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2334 while (*s == ' ' || *s == '\t') s++;
2336 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2337 if (strnEQ(s2-4,"perl",4))
2339 while (s = moreswitches(s)) ;
2341 if (cddir && chdir(cddir) < 0)
2342 croak("Can't chdir to %s",cddir);
2350 uid = (int)getuid();
2351 euid = (int)geteuid();
2352 gid = (int)getgid();
2353 egid = (int)getegid();
2358 tainting |= (uid && (euid != uid || egid != gid));
2366 croak("No %s allowed while running setuid", s);
2368 croak("No %s allowed while running setgid", s);
2375 curstash = debstash;
2376 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2378 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2379 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2380 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2381 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2382 sv_setiv(DBsingle, 0);
2383 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2384 sv_setiv(DBtrace, 0);
2385 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2386 sv_setiv(DBsignal, 0);
2387 curstash = defstash;
2395 mainstack = curstack; /* remember in case we switch stacks */
2396 AvREAL_off(curstack); /* not a real array */
2397 av_extend(curstack,127);
2399 stack_base = AvARRAY(curstack);
2400 stack_sp = stack_base;
2401 stack_max = stack_base + 127;
2403 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2404 New(50,cxstack,cxstack_max + 1,CONTEXT);
2407 New(50,tmps_stack,128,SV*);
2413 * The following stacks almost certainly should be per-interpreter,
2414 * but for now they're not. XXX
2418 markstack_ptr = markstack;
2420 New(54,markstack,64,I32);
2421 markstack_ptr = markstack;
2422 markstack_max = markstack + 64;
2428 New(54,scopestack,32,I32);
2430 scopestack_max = 32;
2436 New(54,savestack,128,ANY);
2438 savestack_max = 128;
2444 New(54,retstack,16,OP*);
2455 Safefree(tmps_stack);
2462 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2471 subname = newSVpv("main",4);
2475 init_predump_symbols()
2481 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2483 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2484 GvMULTI_on(stdingv);
2485 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2486 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2488 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2490 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2492 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2494 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2496 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2498 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2499 GvMULTI_on(othergv);
2500 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2501 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2503 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2505 statname = NEWSV(66,0); /* last filename we did stat on */
2508 osname = savepv(OSNAME);
2512 init_postdump_symbols(argc,argv,env)
2514 register char **argv;
2515 register char **env;
2521 argc--,argv++; /* skip name of script */
2523 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2526 if (argv[0][1] == '-') {
2530 if (s = strchr(argv[0], '=')) {
2532 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2535 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2538 toptarget = NEWSV(0,0);
2539 sv_upgrade(toptarget, SVt_PVFM);
2540 sv_setpvn(toptarget, "", 0);
2541 bodytarget = NEWSV(0,0);
2542 sv_upgrade(bodytarget, SVt_PVFM);
2543 sv_setpvn(bodytarget, "", 0);
2544 formtarget = bodytarget;
2547 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2548 sv_setpv(GvSV(tmpgv),origfilename);
2549 magicname("0", "0", 1);
2551 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2552 sv_setpv(GvSV(tmpgv),origargv[0]);
2553 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2555 (void)gv_AVadd(argvgv);
2556 av_clear(GvAVn(argvgv));
2557 for (; argc > 0; argc--,argv++) {
2558 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2561 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2565 hv_magic(hv, envgv, 'E');
2566 #ifndef VMS /* VMS doesn't have environ array */
2567 /* Note that if the supplied env parameter is actually a copy
2568 of the global environ then it may now point to free'd memory
2569 if the environment has been modified since. To avoid this
2570 problem we treat env==NULL as meaning 'use the default'
2575 environ[0] = Nullch;
2576 for (; *env; env++) {
2577 if (!(s = strchr(*env,'=')))
2583 sv = newSVpv(s--,0);
2584 (void)hv_store(hv, *env, s - *env, sv, 0);
2586 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2587 /* Sins of the RTL. See note in my_setenv(). */
2588 (void)putenv(savepv(*env));
2592 #ifdef DYNAMIC_ENV_FETCH
2593 HvNAME(hv) = savepv(ENV_HV_NAME);
2597 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2598 sv_setiv(GvSV(tmpgv), (IV)getpid());
2607 s = getenv("PERL5LIB");
2611 incpush(getenv("PERLLIB"), FALSE);
2613 /* Treat PERL5?LIB as a possible search list logical name -- the
2614 * "natural" VMS idiom for a Unix path string. We allow each
2615 * element to be a set of |-separated directories for compatibility.
2619 if (my_trnlnm("PERL5LIB",buf,0))
2620 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2622 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2626 /* Use the ~-expanded versions of APPLLIB (undocumented),
2627 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2630 incpush(APPLLIB_EXP, FALSE);
2634 incpush(ARCHLIB_EXP, FALSE);
2637 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2639 incpush(PRIVLIB_EXP, FALSE);
2642 incpush(SITEARCH_EXP, FALSE);
2645 incpush(SITELIB_EXP, FALSE);
2647 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2648 incpush(OLDARCHLIB_EXP, FALSE);
2652 incpush(".", FALSE);
2656 # define PERLLIB_SEP ';'
2659 # define PERLLIB_SEP '|'
2661 # define PERLLIB_SEP ':'
2664 #ifndef PERLLIB_MANGLE
2665 # define PERLLIB_MANGLE(s,n) (s)
2669 incpush(p, addsubdirs)
2673 SV *subdir = Nullsv;
2674 static char *archpat_auto;
2681 if (!archpat_auto) {
2682 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2683 + sizeof("//auto"));
2684 New(55, archpat_auto, len, char);
2685 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2687 for (len = sizeof(ARCHNAME) + 2;
2688 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2689 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2694 /* Break at all separators */
2696 SV *libdir = newSV(0);
2699 /* skip any consecutive separators */
2700 while ( *p == PERLLIB_SEP ) {
2701 /* Uncomment the next line for PATH semantics */
2702 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2706 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2707 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2712 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2713 p = Nullch; /* break out */
2717 * BEFORE pushing libdir onto @INC we may first push version- and
2718 * archname-specific sub-directories.
2721 struct stat tmpstatbuf;
2726 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2728 while (unix[len-1] == '/') len--; /* Cosmetic */
2729 sv_usepvn(libdir,unix,len);
2732 PerlIO_printf(PerlIO_stderr(),
2733 "Failed to unixify @INC element \"%s\"\n",
2736 /* .../archname/version if -d .../archname/version/auto */
2737 sv_setsv(subdir, libdir);
2738 sv_catpv(subdir, archpat_auto);
2739 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2740 S_ISDIR(tmpstatbuf.st_mode))
2741 av_push(GvAVn(incgv),
2742 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2744 /* .../archname if -d .../archname/auto */
2745 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2746 strlen(patchlevel) + 1, "", 0);
2747 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2748 S_ISDIR(tmpstatbuf.st_mode))
2749 av_push(GvAVn(incgv),
2750 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2753 /* finally push this lib directory on the end of @INC */
2754 av_push(GvAVn(incgv), libdir);
2757 SvREFCNT_dec(subdir);
2761 call_list(oldscope, list)
2766 line_t oldline = curcop->cop_line;
2771 while (AvFILL(list) >= 0) {
2772 CV *cv = (CV*)av_shift(list);
2779 SV* atsv = GvSV(errgv);
2781 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2782 (void)SvPV(atsv, len);
2785 curcop = &compiling;
2786 curcop->cop_line = oldline;
2787 if (list == beginav)
2788 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2790 sv_catpv(atsv, "END failed--cleanup aborted");
2791 while (scopestack_ix > oldscope)
2793 croak("%s", SvPVX(atsv));
2801 /* my_exit() was called */
2802 while (scopestack_ix > oldscope)
2805 curstash = defstash;
2807 call_list(oldscope, endav);
2809 curcop = &compiling;
2810 curcop->cop_line = oldline;
2812 if (list == beginav)
2813 croak("BEGIN failed--compilation aborted");
2815 croak("END failed--cleanup aborted");
2821 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2826 curcop = &compiling;
2827 curcop->cop_line = oldline;
2841 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread 0x%lx, status %lu\n",
2842 (unsigned long) thr, (unsigned long) status));
2843 #endif /* USE_THREADS */
2852 STATUS_NATIVE_SET(status);
2862 if (vaxc$errno & 1) {
2863 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2864 STATUS_NATIVE_SET(44);
2867 if (!vaxc$errno && errno) /* unlikely */
2868 STATUS_NATIVE_SET(44);
2870 STATUS_NATIVE_SET(vaxc$errno);
2874 STATUS_POSIX_SET(errno);
2875 else if (STATUS_POSIX == 0)
2876 STATUS_POSIX_SET(255);
2885 register CONTEXT *cx;
2894 (void)UNLINK(e_tmpname);
2895 Safefree(e_tmpname);
2899 if (cxstack_ix >= 0) {