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 *));
78 static void usage _((char *));
79 static void validate_suid _((char *, char*));
81 static int fdscript = -1;
83 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
84 #include <asm/sigcontext.h>
86 catch_sigsegv(int signo, struct sigcontext_struct sc)
88 signal(SIGSEGV, SIG_DFL);
89 fprintf(stderr, "Segmentation fault dereferencing 0x%lx\n"
90 "return_address = 0x%lx, eip = 0x%lx\n",
91 sc.cr2, __builtin_return_address(0), sc.eip);
92 fprintf(stderr, "thread = 0x%lx\n", (unsigned long)THR);
99 PerlInterpreter *sv_interp;
102 New(53, sv_interp, 1, PerlInterpreter);
107 perl_construct( sv_interp )
108 register PerlInterpreter *sv_interp;
110 #if defined(USE_THREADS) && !defined(FAKE_THREADS)
114 if (!(curinterp = sv_interp))
118 Zero(sv_interp, 1, PerlInterpreter);
121 /* Init the real globals (and main thread)? */
127 Newz(53, thr, 1, struct thread);
128 MUTEX_INIT(&malloc_mutex);
129 MUTEX_INIT(&sv_mutex);
130 /* Safe to use SVs from now on */
131 MUTEX_INIT(&eval_mutex);
132 COND_INIT(&eval_cond);
133 MUTEX_INIT(&threads_mutex);
134 COND_INIT(&nthreads_cond);
138 thr->flags = THRf_R_JOINABLE;
139 MUTEX_INIT(&thr->mutex);
144 /* Handcraft thrsv similarly to mess_sv */
145 New(53, thrsv, 1, SV);
146 Newz(53, xpv, 1, XPV);
147 SvFLAGS(thrsv) = SVt_PV;
148 SvANY(thrsv) = (void*)xpv;
149 SvREFCNT(thrsv) = 1 << 30; /* practically infinite */
150 SvPVX(thrsv) = (char*)thr;
151 SvCUR_set(thrsv, sizeof(thr));
152 SvLEN_set(thrsv, sizeof(thr));
153 *SvEND(thrsv) = '\0'; /* in the trailing_nul field */
155 #ifdef HAVE_THREAD_INTERN
156 init_thread_intern(thr);
159 DuplicateHandle(GetCurrentProcess(),
165 DUPLICATE_SAME_ACCESS);
166 if ((thr_key = TlsAlloc()) == TLS_OUT_OF_INDEXES)
167 croak("panic: pthread_key_create");
168 if (TlsSetValue(thr_key, (LPVOID) thr) != TRUE)
169 croak("panic: pthread_setspecific");
171 self = pthread_self();
172 if (pthread_key_create(&thr_key, 0))
173 croak("panic: pthread_key_create");
174 if (pthread_setspecific(thr_key, (void *) thr))
175 croak("panic: pthread_setspecific");
177 #endif /* FAKE_THREADS */
178 #endif /* USE_THREADS */
180 linestr = NEWSV(65,80);
181 sv_upgrade(linestr,SVt_PVIV);
183 if (!SvREADONLY(&sv_undef)) {
184 SvREADONLY_on(&sv_undef);
188 SvREADONLY_on(&sv_no);
190 sv_setpv(&sv_yes,Yes);
192 SvREADONLY_on(&sv_yes);
195 nrs = newSVpv("\n", 1);
196 rs = SvREFCNT_inc(nrs);
198 sighandlerp = sighandler;
203 * There is no way we can refer to them from Perl so close them to save
204 * space. The other alternative would be to provide STDAUX and STDPRN
207 (void)fclose(stdaux);
208 (void)fclose(stdprn);
214 perl_destruct_level = 1;
216 if(perl_destruct_level > 0)
221 lex_state = LEX_NOTPARSING;
223 start_env.je_prev = NULL;
224 start_env.je_ret = -1;
225 start_env.je_mustcatch = TRUE;
226 top_env = &start_env;
229 SET_NUMERIC_STANDARD();
230 #if defined(SUBVERSION) && SUBVERSION > 0
231 sprintf(patchlevel, "%7.5f", (double) 5
232 + ((double) PATCHLEVEL / (double) 1000)
233 + ((double) SUBVERSION / (double) 100000));
235 sprintf(patchlevel, "%5.3f", (double) 5 +
236 ((double) PATCHLEVEL / (double) 1000));
239 #if defined(LOCAL_PATCH_COUNT)
240 localpatches = local_patches; /* For possible -v */
243 PerlIO_init(); /* Hook to IO system */
245 fdpid = newAV(); /* for remembering popen pids by fd */
249 New(51,debname,128,char);
250 New(52,debdelim,128,char);
257 perl_destruct(sv_interp)
258 register PerlInterpreter *sv_interp;
261 int destruct_level; /* 0=none, 1=full, 2=full with checks */
266 #endif /* USE_THREADS */
268 if (!(curinterp = sv_interp))
273 /* Pass 1 on any remaining threads: detach joinables, join zombies */
275 MUTEX_LOCK(&threads_mutex);
276 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
277 "perl_destruct: waiting for %d threads...\n",
279 for (t = thr->next; t != thr; t = t->next) {
280 MUTEX_LOCK(&threads_mutex);
281 MUTEX_LOCK(&t->mutex);
282 switch (ThrSTATE(t)) {
285 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
286 "perl_destruct: joining zombie %p\n", t));
287 ThrSETSTATE(t, THRf_DEAD);
288 MUTEX_UNLOCK(&t->mutex);
291 * The SvREFCNT_dec below may take a long time (e.g. av
292 * may contain an object scalar whose destructor gets
293 * called) so we have to unlock threads_mutex and start
296 MUTEX_UNLOCK(&threads_mutex);
298 if ((WaitForSingleObject(t->Tself,INFINITE) == WAIT_FAILED)
299 || (GetExitCodeThread(t->Tself,(LPDWORD)&av) == 0))
301 if (pthread_join(t->Tself, (void**)&av))
303 croak("panic: pthread_join failed during global destruction");
304 SvREFCNT_dec((SV*)av);
305 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
306 "perl_destruct: joined zombie %p OK\n", t));
308 case THRf_R_JOINABLE:
309 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
310 "perl_destruct: detaching thread %p\n", t));
311 ThrSETSTATE(t, THRf_R_DETACHED);
313 * We unlock threads_mutex and t->mutex in the opposite order
314 * from which we locked them just so that DETACH won't
315 * deadlock if it panics. It's only a breach of good style
316 * not a bug since they are unlocks not locks.
318 MUTEX_UNLOCK(&threads_mutex);
320 MUTEX_UNLOCK(&t->mutex);
323 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
324 "perl_destruct: ignoring %p (state %u)\n",
326 MUTEX_UNLOCK(&t->mutex);
327 /* fall through and out */
330 /* We leave the above "Pass 1" loop with threads_mutex still locked */
332 /* Pass 2 on remaining threads: wait for the thread count to drop to one */
335 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
336 "perl_destruct: final wait for %d threads\n",
338 COND_WAIT(&nthreads_cond, &threads_mutex);
340 /* At this point, we're the last thread */
341 MUTEX_UNLOCK(&threads_mutex);
342 DEBUG_L(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
343 MUTEX_DESTROY(&threads_mutex);
344 COND_DESTROY(&nthreads_cond);
345 #endif /* !defined(FAKE_THREADS) */
346 #endif /* USE_THREADS */
348 destruct_level = perl_destruct_level;
352 if (s = getenv("PERL_DESTRUCT_LEVEL")) {
354 if (destruct_level < i)
363 /* We must account for everything. */
365 /* Destroy the main CV and syntax tree */
367 curpad = AvARRAY(comppad);
372 SvREFCNT_dec(main_cv);
377 * Try to destruct global references. We do this first so that the
378 * destructors and destructees still exist. Some sv's might remain.
379 * Non-referenced objects are on their own.
386 /* unhook hooks which will soon be, or use, destroyed data */
387 SvREFCNT_dec(warnhook);
389 SvREFCNT_dec(diehook);
391 SvREFCNT_dec(parsehook);
394 if (destruct_level == 0){
396 DEBUG_P(debprofdump());
398 /* The exit() function will do everything that needs doing. */
402 /* loosen bonds of global variables */
405 (void)PerlIO_close(rsfp);
409 /* Filters for program text */
410 SvREFCNT_dec(rsfp_filters);
411 rsfp_filters = Nullav;
423 sawampersand = FALSE; /* must save all match strings */
424 sawstudy = FALSE; /* do fbm_instr on all strings */
439 /* magical thingies */
441 Safefree(ofs); /* $, */
444 Safefree(ors); /* $\ */
447 SvREFCNT_dec(nrs); /* $\ helper */
450 multiline = 0; /* $* */
452 SvREFCNT_dec(statname);
456 /* defgv, aka *_ should be taken care of elsewhere */
458 #if 0 /* just about all regexp stuff, seems to be ok */
460 /* shortcuts to regexp stuff */
465 SAVEFREEOP(oldlastpm); /* for saving regexp context during debugger */
467 regprecomp = NULL; /* uncompiled string. */
468 regparse = NULL; /* Input-scan pointer. */
469 regxend = NULL; /* End of input for compile */
470 regnpar = 0; /* () count. */
471 regcode = NULL; /* Code-emit pointer; ®dummy = don't. */
472 regsize = 0; /* Code size. */
473 regnaughty = 0; /* How bad is this pattern? */
474 regsawback = 0; /* Did we see \1, ...? */
476 reginput = NULL; /* String-input pointer. */
477 regbol = NULL; /* Beginning of input, for ^ check. */
478 regeol = NULL; /* End of input, for $ check. */
479 regstartp = (char **)NULL; /* Pointer to startp array. */
480 regendp = (char **)NULL; /* Ditto for endp. */
481 reglastparen = 0; /* Similarly for lastparen. */
482 regtill = NULL; /* How far we are required to go. */
483 regflags = 0; /* are we folding, multilining? */
484 regprev = (char)NULL; /* char before regbol, \n if none */
488 /* clean up after study() */
489 SvREFCNT_dec(lastscream);
491 Safefree(screamfirst);
493 Safefree(screamnext);
496 /* startup and shutdown function lists */
497 SvREFCNT_dec(beginav);
499 SvREFCNT_dec(initav);
504 /* temp stack during pp_sort() */
505 SvREFCNT_dec(sortstack);
508 /* shortcuts just get cleared */
518 /* reset so print() ends up where we expect */
521 /* Prepare to destruct main symbol table. */
528 if (destruct_level >= 2) {
529 if (scopestack_ix != 0)
530 warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
531 (long)scopestack_ix);
532 if (savestack_ix != 0)
533 warn("Unbalanced saves: %ld more saves than restores\n",
535 if (tmps_floor != -1)
536 warn("Unbalanced tmps: %ld more allocs than frees\n",
537 (long)tmps_floor + 1);
538 if (cxstack_ix != -1)
539 warn("Unbalanced context: %ld more PUSHes than POPs\n",
540 (long)cxstack_ix + 1);
543 /* Now absolutely destruct everything, somehow or other, loops or no. */
545 SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */
546 while (sv_count != 0 && sv_count != last_sv_count) {
547 last_sv_count = sv_count;
550 SvFLAGS(strtab) &= ~SVTYPEMASK;
551 SvFLAGS(strtab) |= SVt_PVHV;
553 /* Destruct the global string table. */
555 /* Yell and reset the HeVAL() slots that are still holding refcounts,
556 * so that sv_free() won't fail on them.
565 array = HvARRAY(strtab);
569 warn("Unbalanced string table refcount: (%d) for \"%s\"",
570 HeVAL(hent) - Nullsv, HeKEY(hent));
571 HeVAL(hent) = Nullsv;
581 SvREFCNT_dec(strtab);
584 warn("Scalars leaked: %ld\n", (long)sv_count);
588 /* No SVs have survived, need to clean out */
592 Safefree(origfilename);
594 hints = 0; /* Reset hints. Should hints be per-interpreter ? */
596 DEBUG_P(debprofdump());
598 MUTEX_DESTROY(&sv_mutex);
599 MUTEX_DESTROY(&malloc_mutex);
600 MUTEX_DESTROY(&eval_mutex);
601 COND_DESTROY(&eval_cond);
603 /* As the penultimate thing, free the non-arena SV for thrsv */
604 Safefree(SvPVX(thrsv));
605 Safefree(SvANY(thrsv));
608 #endif /* USE_THREADS */
610 /* As the absolutely last thing, free the non-arena SV for mess() */
613 /* we know that type >= SVt_PV */
615 Safefree(SvPVX(mess_sv));
616 Safefree(SvANY(mess_sv));
624 PerlInterpreter *sv_interp;
626 if (!(curinterp = sv_interp))
632 perl_parse(sv_interp, xsinit, argc, argv, env)
633 PerlInterpreter *sv_interp;
634 void (*xsinit)_((void));
642 char *scriptname = NULL;
643 VOL bool dosearch = FALSE;
650 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
653 croak("suidperl is no longer needed since the kernel can now execute\n\
654 setuid perl scripts securely.\n");
658 if (!(curinterp = sv_interp))
661 #if defined(NeXT) && defined(__DYNAMIC__)
662 _dyld_lookup_and_bind
663 ("__environ", (unsigned long *) &environ_pointer, NULL);
668 #ifndef VMS /* VMS doesn't have environ array */
669 origenviron = environ;
675 /* Come here if running an undumped a.out. */
677 origfilename = savepv(argv[0]);
679 cxstack_ix = -1; /* start label stack again */
681 init_postdump_symbols(argc,argv,env);
686 curpad = AvARRAY(comppad);
691 SvREFCNT_dec(main_cv);
695 oldscope = scopestack_ix;
703 /* my_exit() was called */
704 while (scopestack_ix > oldscope)
709 call_list(oldscope, endav);
711 return STATUS_NATIVE_EXPORT;
714 PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
718 sv_setpvn(linestr,"",0);
719 sv = newSVpv("",0); /* first used for -I flags */
723 for (argc--,argv++; argc > 0; argc--,argv++) {
724 if (argv[0][0] != '-' || !argv[0][1])
728 validarg = " PHOOEY ";
753 if (s = moreswitches(s))
763 if (euid != uid || egid != gid)
764 croak("No -e allowed in setuid scripts");
766 e_tmpname = savepv(TMPPATH);
767 (void)mktemp(e_tmpname);
769 croak("Can't mktemp()");
770 e_fp = PerlIO_open(e_tmpname,"w");
772 croak("Cannot open temporary file");
777 PerlIO_puts(e_fp,argv[1]);
781 croak("No code specified for -e");
782 (void)PerlIO_putc(e_fp,'\n');
784 case 'I': /* -I handled both here and in moreswitches() */
786 if (!*++s && (s=argv[1]) != Nullch) {
789 while (s && isSPACE(*s))
793 for (e = s; *e && !isSPACE(*e); e++) ;
800 } /* XXX else croak? */
814 preambleav = newAV();
815 av_push(preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
817 Sv = newSVpv("print myconfig();",0);
819 sv_catpv(Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
821 sv_catpv(Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
823 #if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
824 sv_catpv(Sv,"\" Compile-time options:");
826 sv_catpv(Sv," DEBUGGING");
829 sv_catpv(Sv," NO_EMBED");
832 sv_catpv(Sv," MULTIPLICITY");
834 sv_catpv(Sv,"\\n\",");
836 #if defined(LOCAL_PATCH_COUNT)
837 if (LOCAL_PATCH_COUNT > 0) {
839 sv_catpv(Sv,"\" Locally applied patches:\\n\",");
840 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
842 sv_catpvf(Sv,"\" \\t%s\\n\",",localpatches[i]);
846 sv_catpvf(Sv,"\" Built under %s\\n\"",OSNAME);
849 sv_catpvf(Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
851 sv_catpvf(Sv,",\" Compiled on %s\\n\"",__DATE__);
856 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
857 print \" \\%ENV:\\n @env\\n\" if @env; \
858 print \" \\@INC:\\n @INC\\n\";");
861 Sv = newSVpv("config_vars(qw(",0);
866 av_push(preambleav, Sv);
867 scriptname = BIT_BUCKET; /* don't look for script or read stdin */
878 if (!*++s || isSPACE(*s)) {
882 /* catch use of gnu style long options */
883 if (strEQ(s, "version")) {
887 if (strEQ(s, "help")) {
894 croak("Unrecognized switch: -%s (-h will show valid options)",s);
899 if (!tainting && (s = getenv("PERL5OPT"))) {
910 if (!strchr("DIMUdmw", *s))
911 croak("Illegal switch in PERL5OPT: -%c", *s);
917 scriptname = argv[0];
919 if (PerlIO_flush(e_fp) || PerlIO_error(e_fp) || PerlIO_close(e_fp)) {
921 warn("Did you forget to compile with -DMULTIPLICITY?");
923 croak("Can't write to temp file for -e: %s", Strerror(errno));
927 scriptname = e_tmpname;
929 else if (scriptname == Nullch) {
931 if ( isatty(PerlIO_fileno(PerlIO_stdin())) )
939 open_script(scriptname,dosearch,sv);
941 validate_suid(validarg, scriptname);
946 main_cv = compcv = (CV*)NEWSV(1104,0);
947 sv_upgrade((SV *)compcv, SVt_PVCV);
951 av_push(comppad, Nullsv);
952 curpad = AvARRAY(comppad);
953 comppad_name = newAV();
954 comppad_name_fill = 0;
955 min_intro_pending = 0;
958 av_store(comppad_name, 0, newSVpv("@_", 2));
959 curpad[0] = (SV*)newAV();
960 SvPADMY_on(curpad[0]); /* XXX Needed? */
962 New(666, CvMUTEXP(compcv), 1, perl_mutex);
963 MUTEX_INIT(CvMUTEXP(compcv));
964 #endif /* USE_THREADS */
966 comppadlist = newAV();
967 AvREAL_off(comppadlist);
968 av_store(comppadlist, 0, (SV*)comppad_name);
969 av_store(comppadlist, 1, (SV*)comppad);
970 CvPADLIST(compcv) = comppadlist;
972 boot_core_UNIVERSAL();
974 (*xsinit)(); /* in case linked C routines want magical variables */
975 #if defined(VMS) || defined(WIN32)
979 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
980 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
983 init_predump_symbols();
985 init_postdump_symbols(argc,argv,env);
989 /* now parse the script */
992 if (yyparse() || error_count) {
994 croak("%s had compilation errors.\n", origfilename);
996 croak("Execution of %s aborted due to compilation errors.\n",
1000 curcop->cop_line = 0;
1001 curstash = defstash;
1004 (void)UNLINK(e_tmpname);
1005 Safefree(e_tmpname);
1009 /* now that script is parsed, we can modify record separator */
1011 rs = SvREFCNT_inc(nrs);
1012 sv_setsv(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), rs);
1024 if ((s=getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1025 dump_mstats("after compilation:");
1036 PerlInterpreter *sv_interp;
1043 if (!(curinterp = sv_interp))
1046 oldscope = scopestack_ix;
1051 cxstack_ix = -1; /* start context stack again */
1054 /* my_exit() was called */
1055 while (scopestack_ix > oldscope)
1058 curstash = defstash;
1060 call_list(oldscope, endav);
1062 if (getenv("PERL_DEBUG_MSTATS"))
1063 dump_mstats("after execution: ");
1066 return STATUS_NATIVE_EXPORT;
1069 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
1074 if (curstack != mainstack) {
1076 SWITCHSTACK(curstack, mainstack);
1081 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1082 sawampersand ? "Enabling" : "Omitting"));
1085 DEBUG_x(dump_all());
1086 DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1088 DEBUG_L(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
1089 (unsigned long) thr));
1090 #endif /* USE_THREADS */
1093 PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", origfilename);
1096 if (PERLDB_SINGLE && DBsingle)
1097 sv_setiv(DBsingle, 1);
1099 call_list(oldscope, initav);
1109 else if (main_start) {
1110 CvDEPTH(main_cv) = 1;
1121 perl_get_sv(name, create)
1125 GV* gv = gv_fetchpv(name, create, SVt_PV);
1132 perl_get_av(name, create)
1136 GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1145 perl_get_hv(name, create)
1149 GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1158 perl_get_cv(name, create)
1162 GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1163 if (create && !GvCVu(gv))
1164 return newSUB(start_subparse(FALSE, 0),
1165 newSVOP(OP_CONST, 0, newSVpv(name,0)),
1173 /* Be sure to refetch the stack pointer after calling these routines. */
1176 perl_call_argv(subname, flags, argv)
1178 I32 flags; /* See G_* flags in cop.h */
1179 register char **argv; /* null terminated arg list */
1187 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1192 return perl_call_pv(subname, flags);
1196 perl_call_pv(subname, flags)
1197 char *subname; /* name of the subroutine */
1198 I32 flags; /* See G_* flags in cop.h */
1200 return perl_call_sv((SV*)perl_get_cv(subname, TRUE), flags);
1204 perl_call_method(methname, flags)
1205 char *methname; /* name of the subroutine */
1206 I32 flags; /* See G_* flags in cop.h */
1213 XPUSHs(sv_2mortal(newSVpv(methname,0)));
1216 return perl_call_sv(*stack_sp--, flags);
1219 /* May be called with any of a CV, a GV, or an SV containing the name. */
1221 perl_call_sv(sv, flags)
1223 I32 flags; /* See G_* flags in cop.h */
1226 LOGOP myop; /* fake syntax tree node */
1232 bool oldcatch = CATCH_GET;
1237 if (flags & G_DISCARD) {
1242 Zero(&myop, 1, LOGOP);
1243 myop.op_next = Nullop;
1244 if (!(flags & G_NOARGS))
1245 myop.op_flags |= OPf_STACKED;
1246 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1247 (flags & G_ARRAY) ? OPf_WANT_LIST :
1252 EXTEND(stack_sp, 1);
1255 oldscope = scopestack_ix;
1257 if (PERLDB_SUB && curstash != debstash
1258 /* Handle first BEGIN of -d. */
1259 && (DBcv || (DBcv = GvCV(DBsub)))
1260 /* Try harder, since this may have been a sighandler, thus
1261 * curstash may be meaningless. */
1262 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
1263 op->op_private |= OPpENTERSUB_DB;
1265 if (flags & G_EVAL) {
1266 cLOGOP->op_other = op;
1268 /* we're trying to emulate pp_entertry() here */
1270 register CONTEXT *cx;
1271 I32 gimme = GIMME_V;
1276 push_return(op->op_next);
1277 PUSHBLOCK(cx, CXt_EVAL, stack_sp);
1279 eval_root = op; /* Only needed so that goto works right. */
1282 if (flags & G_KEEPERR)
1285 sv_setpv(GvSV(errgv),"");
1297 /* my_exit() was called */
1298 curstash = defstash;
1302 croak("Callback called exit");
1311 stack_sp = stack_base + oldmark;
1312 if (flags & G_ARRAY)
1316 *++stack_sp = &sv_undef;
1324 if (op == (OP*)&myop)
1325 op = pp_entersub(ARGS);
1328 retval = stack_sp - (stack_base + oldmark);
1329 if ((flags & G_EVAL) && !(flags & G_KEEPERR))
1330 sv_setpv(GvSV(errgv),"");
1333 if (flags & G_EVAL) {
1334 if (scopestack_ix > oldscope) {
1338 register CONTEXT *cx;
1350 CATCH_SET(oldcatch);
1352 if (flags & G_DISCARD) {
1353 stack_sp = stack_base + oldmark;
1362 /* Eval a string. The G_EVAL flag is always assumed. */
1365 perl_eval_sv(sv, flags)
1367 I32 flags; /* See G_* flags in cop.h */
1370 UNOP myop; /* fake syntax tree node */
1372 I32 oldmark = sp - stack_base;
1379 if (flags & G_DISCARD) {
1387 EXTEND(stack_sp, 1);
1389 oldscope = scopestack_ix;
1391 if (!(flags & G_NOARGS))
1392 myop.op_flags = OPf_STACKED;
1393 myop.op_next = Nullop;
1394 myop.op_type = OP_ENTEREVAL;
1395 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1396 (flags & G_ARRAY) ? OPf_WANT_LIST :
1398 if (flags & G_KEEPERR)
1399 myop.op_flags |= OPf_SPECIAL;
1409 /* my_exit() was called */
1410 curstash = defstash;
1414 croak("Callback called exit");
1423 stack_sp = stack_base + oldmark;
1424 if (flags & G_ARRAY)
1428 *++stack_sp = &sv_undef;
1433 if (op == (OP*)&myop)
1434 op = pp_entereval(ARGS);
1437 retval = stack_sp - (stack_base + oldmark);
1438 if (!(flags & G_KEEPERR))
1439 sv_setpv(GvSV(errgv),"");
1443 if (flags & G_DISCARD) {
1444 stack_sp = stack_base + oldmark;
1454 perl_eval_pv(p, croak_on_error)
1460 SV* sv = newSVpv(p, 0);
1463 perl_eval_sv(sv, G_SCALAR);
1470 if (croak_on_error && SvTRUE(GvSV(errgv)))
1471 croak(SvPVx(GvSV(errgv), na));
1476 /* Require a module. */
1482 SV* sv = sv_newmortal();
1483 sv_setpv(sv, "require '");
1486 perl_eval_sv(sv, G_DISCARD);
1490 magicname(sym,name,namlen)
1497 if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
1498 sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
1502 usage(name) /* XXX move this out into a module ? */
1505 /* This message really ought to be max 23 lines.
1506 * Removed -h because the user already knows that opton. Others? */
1508 static char *usage[] = {
1509 "-0[octal] specify record separator (\\0, if no argument)",
1510 "-a autosplit mode with -n or -p (splits $_ into @F)",
1511 "-c check syntax only (runs BEGIN and END blocks)",
1512 "-d[:debugger] run scripts under debugger",
1513 "-D[number/list] set debugging flags (argument is a bit mask or flags)",
1514 "-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
1515 "-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
1516 "-i[extension] edit <> files in place (make backup if extension supplied)",
1517 "-Idirectory specify @INC/#include directory (may be used more than once)",
1518 "-l[octal] enable line ending processing, specifies line terminator",
1519 "-[mM][-]module.. executes `use/no module...' before executing your script.",
1520 "-n assume 'while (<>) { ... }' loop around your script",
1521 "-p assume loop like -n but print line also like sed",
1522 "-P run script through C preprocessor before compilation",
1523 "-s enable some switch parsing for switches after script name",
1524 "-S look for the script using PATH environment variable",
1525 "-T turn on tainting checks",
1526 "-u dump core after parsing script",
1527 "-U allow unsafe operations",
1528 "-v print version number and patchlevel of perl",
1529 "-V[:variable] print perl configuration information",
1530 "-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
1531 "-x[directory] strip off text before #!perl line and perhaps cd to directory",
1537 printf("\nUsage: %s [switches] [--] [programfile] [arguments]", name);
1539 printf("\n %s", *p++);
1542 /* This routine handles any switches that can be given during run */
1553 rschar = scan_oct(s, 4, &numlen);
1555 if (rschar & ~((U8)~0))
1557 else if (!rschar && numlen >= 2)
1558 nrs = newSVpv("", 0);
1561 nrs = newSVpv(&ch, 1);
1566 splitstr = savepv(s + 1);
1580 if (*s == ':' || *s == '=') {
1581 my_setenv("PERL5DB", form("use Devel::%s;", ++s));
1585 perldb = PERLDB_ALL;
1592 if (isALPHA(s[1])) {
1593 static char debopts[] = "psltocPmfrxuLHXD";
1596 for (s++; *s && (d = strchr(debopts,*s)); s++)
1597 debug |= 1 << (d - debopts);
1601 for (s++; isDIGIT(*s); s++) ;
1603 debug |= 0x80000000;
1605 warn("Recompile perl with -DDEBUGGING to use -D switch\n");
1606 for (s++; isALNUM(*s); s++) ;
1616 inplace = savepv(s+1);
1618 for (s = inplace; *s && !isSPACE(*s); s++) ;
1622 case 'I': /* -I handled both here and in parse_perl() */
1625 while (*s && isSPACE(*s))
1629 for (e = s; *e && !isSPACE(*e); e++) ;
1630 p = savepvn(s, e-s);
1636 croak("No space allowed after -I");
1646 *ors = scan_oct(s, 3 + (*s == '0'), &numlen);
1655 ors = SvPV(nrs, orslen);
1656 ors = savepvn(ors, orslen);
1660 forbid_setid("-M"); /* XXX ? */
1663 forbid_setid("-m"); /* XXX ? */
1668 /* -M-foo == 'no foo' */
1669 if (*s == '-') { use = "no "; ++s; }
1670 sv = newSVpv(use,0);
1672 /* We allow -M'Module qw(Foo Bar)' */
1673 while(isALNUM(*s) || *s==':') ++s;
1675 sv_catpv(sv, start);
1676 if (*(start-1) == 'm') {
1678 croak("Can't use '%c' after -mname", *s);
1679 sv_catpv( sv, " ()");
1682 sv_catpvn(sv, start, s-start);
1683 sv_catpv(sv, " split(/,/,q{");
1688 if (preambleav == NULL)
1689 preambleav = newAV();
1690 av_push(preambleav, sv);
1693 croak("No space allowed after -%c", *(s-1));
1710 croak("Too late for \"-T\" option");
1722 #if defined(SUBVERSION) && SUBVERSION > 0
1723 printf("\nThis is perl, version 5.%03d_%02d built for %s",
1724 PATCHLEVEL, SUBVERSION, ARCHNAME);
1726 printf("\nThis is perl, version %s built for %s",
1727 patchlevel, ARCHNAME);
1729 #if defined(LOCAL_PATCH_COUNT)
1730 if (LOCAL_PATCH_COUNT > 0)
1731 printf("\n(with %d registered patch%s, see perl -V for more detail)",
1732 LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
1735 printf("\n\nCopyright 1987-1997, Larry Wall\n");
1737 printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
1740 printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
1743 printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
1744 "Version 5 port Copyright (c) 1994-1997, Andreas Kaiser, Ilya Zakharevich\n");
1747 printf("atariST series port, ++jrb bammi@cadence.com\n");
1750 Perl may be copied only under the terms of either the Artistic License or the\n\
1751 GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n");
1759 if (s[1] == '-') /* Additional switches on #! line. */
1767 #ifdef ALTERNATE_SHEBANG
1768 case 'S': /* OS/2 needs -S on "extproc" line. */
1776 croak("Can't emulate -%.1s on #! line",s);
1781 /* compliments of Tom Christiansen */
1783 /* unexec() can be found in the Gnu emacs distribution */
1794 prog = newSVpv(BIN_EXP);
1795 sv_catpv(prog, "/perl");
1796 file = newSVpv(origfilename);
1797 sv_catpv(file, ".perldump");
1799 status = unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
1801 PerlIO_printf(PerlIO_stderr(), "unexec of %s into %s failed!\n",
1802 SvPVX(prog), SvPVX(file));
1806 # include <lib$routines.h>
1807 lib$signal(SS$_DEBUG); /* ssdef.h #included from vmsish.h */
1809 ABORT(); /* for use with undump */
1820 /* Note that strtab is a rather special HV. Assumptions are made
1821 about not iterating on it, and not adding tie magic to it.
1822 It is properly deallocated in perl_destruct() */
1824 HvSHAREKEYS_off(strtab); /* mandatory */
1825 Newz(506,((XPVHV*)SvANY(strtab))->xhv_array,
1826 sizeof(HE*) * (((XPVHV*)SvANY(strtab))->xhv_max + 1), char);
1828 curstash = defstash = newHV();
1829 curstname = newSVpv("main",4);
1830 gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
1831 SvREFCNT_dec(GvHV(gv));
1832 GvHV(gv) = (HV*)SvREFCNT_inc(defstash);
1834 HvNAME(defstash) = savepv("main");
1835 incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
1837 defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
1838 errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
1840 (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
1841 sv_grow(GvSV(errgv), 240); /* Preallocate - for immediate signals. */
1842 sv_setpvn(GvSV(errgv), "", 0);
1843 curstash = defstash;
1844 compiling.cop_stash = defstash;
1845 debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
1846 /* We must init $/ before switches are processed. */
1847 sv_setpvn(GvSV(gv_fetchpv("/", TRUE, SVt_PV)), "\n", 1);
1850 #ifdef CAN_PROTOTYPE
1852 open_script(char *scriptname, bool dosearch, SV *sv)
1855 open_script(scriptname,dosearch,sv)
1862 char *xfound = Nullch;
1863 char *xfailed = Nullch;
1867 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
1868 # define SEARCH_EXTS ".bat", ".cmd", NULL
1869 # define MAX_EXT_LEN 4
1872 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
1873 # define MAX_EXT_LEN 4
1876 # define SEARCH_EXTS ".pl", ".com", NULL
1877 # define MAX_EXT_LEN 4
1879 /* additional extensions to try in each dir if scriptname not found */
1881 char *ext[] = { SEARCH_EXTS };
1882 int extidx = 0, i = 0;
1883 char *curext = Nullch;
1885 # define MAX_EXT_LEN 0
1889 * If dosearch is true and if scriptname does not contain path
1890 * delimiters, search the PATH for scriptname.
1892 * If SEARCH_EXTS is also defined, will look for each
1893 * scriptname{SEARCH_EXTS} whenever scriptname is not found
1894 * while searching the PATH.
1896 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
1897 * proceeds as follows:
1899 * + look for ./scriptname{,.foo,.bar}
1900 * + search the PATH for scriptname{,.foo,.bar}
1903 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
1904 * this will not look in '.' if it's not in the PATH)
1909 int hasdir, idx = 0, deftypes = 1;
1912 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
1913 /* The first time through, just add SEARCH_EXTS to whatever we
1914 * already have, so we can check for default file types. */
1916 (!hasdir && my_trnlnm("DCL$PATH",tokenbuf,idx++)) )
1922 if ((strlen(tokenbuf) + strlen(scriptname)
1923 + MAX_EXT_LEN) >= sizeof tokenbuf)
1924 continue; /* don't search dir with too-long name */
1925 strcat(tokenbuf, scriptname);
1929 if (strEQ(scriptname, "-"))
1931 if (dosearch) { /* Look in '.' first. */
1932 char *cur = scriptname;
1934 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
1936 if (strEQ(ext[i++],curext)) {
1937 extidx = -1; /* already has an ext */
1942 DEBUG_p(PerlIO_printf(Perl_debug_log,
1943 "Looking for %s\n",cur));
1944 if (Stat(cur,&statbuf) >= 0) {
1952 if (cur == scriptname) {
1953 len = strlen(scriptname);
1954 if (len+MAX_EXT_LEN+1 >= sizeof(tokenbuf))
1956 cur = strcpy(tokenbuf, scriptname);
1958 } while (extidx >= 0 && ext[extidx] /* try an extension? */
1959 && strcpy(tokenbuf+len, ext[extidx++]));
1964 if (dosearch && !strchr(scriptname, '/')
1966 && !strchr(scriptname, '\\')
1968 && (s = getenv("PATH"))) {
1971 bufend = s + strlen(s);
1972 while (s < bufend) {
1973 #if defined(atarist) || defined(DOSISH)
1978 && *s != ';'; len++, s++) {
1979 if (len < sizeof tokenbuf)
1982 if (len < sizeof tokenbuf)
1983 tokenbuf[len] = '\0';
1984 #else /* ! (atarist || DOSISH) */
1985 s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend,
1988 #endif /* ! (atarist || DOSISH) */
1991 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf)
1992 continue; /* don't search dir with too-long name */
1994 #if defined(atarist) || defined(DOSISH)
1995 && tokenbuf[len - 1] != '/'
1996 && tokenbuf[len - 1] != '\\'
1999 tokenbuf[len++] = '/';
2000 if (len == 2 && tokenbuf[0] == '.')
2002 (void)strcpy(tokenbuf + len, scriptname);
2006 len = strlen(tokenbuf);
2007 if (extidx > 0) /* reset after previous loop */
2011 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tokenbuf));
2012 retval = Stat(tokenbuf,&statbuf);
2014 } while ( retval < 0 /* not there */
2015 && extidx>=0 && ext[extidx] /* try an extension? */
2016 && strcpy(tokenbuf+len, ext[extidx++])
2021 if (S_ISREG(statbuf.st_mode)
2022 && cando(S_IRUSR,TRUE,&statbuf)
2024 && cando(S_IXUSR,TRUE,&statbuf)
2028 xfound = tokenbuf; /* bingo! */
2032 xfailed = savepv(tokenbuf);
2035 if (!xfound && !seen_dot && !xfailed && (Stat(scriptname,&statbuf) < 0))
2037 seen_dot = 1; /* Disable message. */
2039 croak("Can't %s %s%s%s",
2040 (xfailed ? "execute" : "find"),
2041 (xfailed ? xfailed : scriptname),
2042 (xfailed ? "" : " on PATH"),
2043 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
2046 scriptname = xfound;
2049 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2050 char *s = scriptname + 8;
2059 origfilename = savepv(e_tmpname ? "-e" : scriptname);
2060 curcop->cop_filegv = gv_fetchfile(origfilename);
2061 if (strEQ(origfilename,"-"))
2063 if (fdscript >= 0) {
2064 rsfp = PerlIO_fdopen(fdscript,"r");
2065 #if defined(HAS_FCNTL) && defined(F_SETFD)
2067 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2070 else if (preprocess) {
2071 char *cpp_cfg = CPPSTDIN;
2072 SV *cpp = NEWSV(0,0);
2073 SV *cmd = NEWSV(0,0);
2075 if (strEQ(cpp_cfg, "cppstdin"))
2076 sv_catpvf(cpp, "%s/", BIN_EXP);
2077 sv_catpv(cpp, cpp_cfg);
2080 sv_catpv(sv,PRIVLIB_EXP);
2084 sed %s -e \"/^[^#]/b\" \
2085 -e \"/^#[ ]*include[ ]/b\" \
2086 -e \"/^#[ ]*define[ ]/b\" \
2087 -e \"/^#[ ]*if[ ]/b\" \
2088 -e \"/^#[ ]*ifdef[ ]/b\" \
2089 -e \"/^#[ ]*ifndef[ ]/b\" \
2090 -e \"/^#[ ]*else/b\" \
2091 -e \"/^#[ ]*elif[ ]/b\" \
2092 -e \"/^#[ ]*undef[ ]/b\" \
2093 -e \"/^#[ ]*endif/b\" \
2096 (doextract ? "-e \"1,/^#/d\n\"" : ""),
2099 %s %s -e '/^[^#]/b' \
2100 -e '/^#[ ]*include[ ]/b' \
2101 -e '/^#[ ]*define[ ]/b' \
2102 -e '/^#[ ]*if[ ]/b' \
2103 -e '/^#[ ]*ifdef[ ]/b' \
2104 -e '/^#[ ]*ifndef[ ]/b' \
2105 -e '/^#[ ]*else/b' \
2106 -e '/^#[ ]*elif[ ]/b' \
2107 -e '/^#[ ]*undef[ ]/b' \
2108 -e '/^#[ ]*endif/b' \
2116 (doextract ? "-e '1,/^#/d\n'" : ""),
2118 scriptname, cpp, sv, CPPMINUS);
2120 #ifdef IAMSUID /* actually, this is caught earlier */
2121 if (euid != uid && !euid) { /* if running suidperl */
2123 (void)seteuid(uid); /* musn't stay setuid root */
2126 (void)setreuid((Uid_t)-1, uid);
2128 #ifdef HAS_SETRESUID
2129 (void)setresuid((Uid_t)-1, uid, (Uid_t)-1);
2135 if (geteuid() != uid)
2136 croak("Can't do seteuid!\n");
2138 #endif /* IAMSUID */
2139 rsfp = my_popen(SvPVX(cmd), "r");
2143 else if (!*scriptname) {
2144 forbid_setid("program input from stdin");
2145 rsfp = PerlIO_stdin();
2148 rsfp = PerlIO_open(scriptname,"r");
2149 #if defined(HAS_FCNTL) && defined(F_SETFD)
2151 fcntl(PerlIO_fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
2159 #ifndef IAMSUID /* in case script is not readable before setuid */
2160 if (euid && Stat(SvPVX(GvSV(curcop->cop_filegv)),&statbuf) >= 0 &&
2161 statbuf.st_mode & (S_ISUID|S_ISGID)) {
2163 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2164 croak("Can't do setuid\n");
2168 croak("Can't open perl script \"%s\": %s\n",
2169 SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
2174 validate_suid(validarg, scriptname)
2180 /* do we need to emulate setuid on scripts? */
2182 /* This code is for those BSD systems that have setuid #! scripts disabled
2183 * in the kernel because of a security problem. Merely defining DOSUID
2184 * in perl will not fix that problem, but if you have disabled setuid
2185 * scripts in the kernel, this will attempt to emulate setuid and setgid
2186 * on scripts that have those now-otherwise-useless bits set. The setuid
2187 * root version must be called suidperl or sperlN.NNN. If regular perl
2188 * discovers that it has opened a setuid script, it calls suidperl with
2189 * the same argv that it had. If suidperl finds that the script it has
2190 * just opened is NOT setuid root, it sets the effective uid back to the
2191 * uid. We don't just make perl setuid root because that loses the
2192 * effective uid we had before invoking perl, if it was different from the
2195 * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2196 * be defined in suidperl only. suidperl must be setuid root. The
2197 * Configure script will set this up for you if you want it.
2203 if (Fstat(PerlIO_fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
2204 croak("Can't stat script \"%s\"",origfilename);
2205 if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
2209 #ifndef HAS_SETREUID
2210 /* On this access check to make sure the directories are readable,
2211 * there is actually a small window that the user could use to make
2212 * filename point to an accessible directory. So there is a faint
2213 * chance that someone could execute a setuid script down in a
2214 * non-accessible directory. I don't know what to do about that.
2215 * But I don't think it's too important. The manual lies when
2216 * it says access() is useful in setuid programs.
2218 if (access(SvPVX(GvSV(curcop->cop_filegv)),1)) /*double check*/
2219 croak("Permission denied");
2221 /* If we can swap euid and uid, then we can determine access rights
2222 * with a simple stat of the file, and then compare device and
2223 * inode to make sure we did stat() on the same file we opened.
2224 * Then we just have to make sure he or she can execute it.
2227 struct stat tmpstatbuf;
2231 setreuid(euid,uid) < 0
2234 setresuid(euid,uid,(Uid_t)-1) < 0
2237 || getuid() != euid || geteuid() != uid)
2238 croak("Can't swap uid and euid"); /* really paranoid */
2239 if (Stat(SvPVX(GvSV(curcop->cop_filegv)),&tmpstatbuf) < 0)
2240 croak("Permission denied"); /* testing full pathname here */
2241 if (tmpstatbuf.st_dev != statbuf.st_dev ||
2242 tmpstatbuf.st_ino != statbuf.st_ino) {
2243 (void)PerlIO_close(rsfp);
2244 if (rsfp = my_popen("/bin/mail root","w")) { /* heh, heh */
2246 "User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
2247 (Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
2248 (long)uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
2249 (long)statbuf.st_dev, (long)statbuf.st_ino,
2250 SvPVX(GvSV(curcop->cop_filegv)),
2251 (long)statbuf.st_uid, (long)statbuf.st_gid);
2252 (void)my_pclose(rsfp);
2254 croak("Permission denied\n");
2258 setreuid(uid,euid) < 0
2260 # if defined(HAS_SETRESUID)
2261 setresuid(uid,euid,(Uid_t)-1) < 0
2264 || getuid() != uid || geteuid() != euid)
2265 croak("Can't reswap uid and euid");
2266 if (!cando(S_IXUSR,FALSE,&statbuf)) /* can real uid exec? */
2267 croak("Permission denied\n");
2269 #endif /* HAS_SETREUID */
2270 #endif /* IAMSUID */
2272 if (!S_ISREG(statbuf.st_mode))
2273 croak("Permission denied");
2274 if (statbuf.st_mode & S_IWOTH)
2275 croak("Setuid/gid script is writable by world");
2276 doswitches = FALSE; /* -s is insecure in suid */
2278 if (sv_gets(linestr, rsfp, 0) == Nullch ||
2279 strnNE(SvPV(linestr,na),"#!",2) ) /* required even on Sys V */
2280 croak("No #! line");
2281 s = SvPV(linestr,na)+2;
2283 while (!isSPACE(*s)) s++;
2284 for (s2 = s; (s2 > SvPV(linestr,na)+2 &&
2285 (isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
2286 if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
2287 croak("Not a perl script");
2288 while (*s == ' ' || *s == '\t') s++;
2290 * #! arg must be what we saw above. They can invoke it by
2291 * mentioning suidperl explicitly, but they may not add any strange
2292 * arguments beyond what #! says if they do invoke suidperl that way.
2294 len = strlen(validarg);
2295 if (strEQ(validarg," PHOOEY ") ||
2296 strnNE(s,validarg,len) || !isSPACE(s[len]))
2297 croak("Args must match #! line");
2300 if (euid != uid && (statbuf.st_mode & S_ISUID) &&
2301 euid == statbuf.st_uid)
2303 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2304 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2305 #endif /* IAMSUID */
2307 if (euid) { /* oops, we're not the setuid root perl */
2308 (void)PerlIO_close(rsfp);
2311 execv(form("%s/sperl%s", BIN_EXP, patchlevel), origargv);
2313 croak("Can't do setuid\n");
2316 if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
2318 (void)setegid(statbuf.st_gid);
2321 (void)setregid((Gid_t)-1,statbuf.st_gid);
2323 #ifdef HAS_SETRESGID
2324 (void)setresgid((Gid_t)-1,statbuf.st_gid,(Gid_t)-1);
2326 setgid(statbuf.st_gid);
2330 if (getegid() != statbuf.st_gid)
2331 croak("Can't do setegid!\n");
2333 if (statbuf.st_mode & S_ISUID) {
2334 if (statbuf.st_uid != euid)
2336 (void)seteuid(statbuf.st_uid); /* all that for this */
2339 (void)setreuid((Uid_t)-1,statbuf.st_uid);
2341 #ifdef HAS_SETRESUID
2342 (void)setresuid((Uid_t)-1,statbuf.st_uid,(Uid_t)-1);
2344 setuid(statbuf.st_uid);
2348 if (geteuid() != statbuf.st_uid)
2349 croak("Can't do seteuid!\n");
2351 else if (uid) { /* oops, mustn't run as root */
2353 (void)seteuid((Uid_t)uid);
2356 (void)setreuid((Uid_t)-1,(Uid_t)uid);
2358 #ifdef HAS_SETRESUID
2359 (void)setresuid((Uid_t)-1,(Uid_t)uid,(Uid_t)-1);
2365 if (geteuid() != uid)
2366 croak("Can't do seteuid!\n");
2369 if (!cando(S_IXUSR,TRUE,&statbuf))
2370 croak("Permission denied\n"); /* they can't do this */
2373 else if (preprocess)
2374 croak("-P not allowed for setuid/setgid script\n");
2375 else if (fdscript >= 0)
2376 croak("fd script not allowed in suidperl\n");
2378 croak("Script is not setuid/setgid in suidperl\n");
2380 /* We absolutely must clear out any saved ids here, so we */
2381 /* exec the real perl, substituting fd script for scriptname. */
2382 /* (We pass script name as "subdir" of fd, which perl will grok.) */
2383 PerlIO_rewind(rsfp);
2384 lseek(PerlIO_fileno(rsfp),(Off_t)0,0); /* just in case rewind didn't */
2385 for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
2386 if (!origargv[which])
2387 croak("Permission denied");
2388 origargv[which] = savepv(form("/dev/fd/%d/%s",
2389 PerlIO_fileno(rsfp), origargv[which]));
2390 #if defined(HAS_FCNTL) && defined(F_SETFD)
2391 fcntl(PerlIO_fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
2393 execv(form("%s/perl%s", BIN_EXP, patchlevel), origargv); /* try again */
2394 croak("Can't do setuid\n");
2395 #endif /* IAMSUID */
2397 if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
2398 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
2400 Fstat(PerlIO_fileno(rsfp),&statbuf); /* may be either wrapped or real suid */
2401 if ((euid != uid && euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
2403 (egid != gid && egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
2406 croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2407 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2408 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
2409 /* not set-id, must be wrapped */
2417 register char *s, *s2;
2419 /* skip forward in input to the real script? */
2423 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch)
2424 croak("No Perl script found in input\n");
2425 if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
2426 PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
2428 while (*s && !(isSPACE (*s) || *s == '#')) s++;
2430 while (*s == ' ' || *s == '\t') s++;
2432 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
2433 if (strnEQ(s2-4,"perl",4))
2435 while (s = moreswitches(s)) ;
2437 if (cddir && chdir(cddir) < 0)
2438 croak("Can't chdir to %s",cddir);
2446 uid = (int)getuid();
2447 euid = (int)geteuid();
2448 gid = (int)getgid();
2449 egid = (int)getegid();
2454 tainting |= (uid && (euid != uid || egid != gid));
2462 croak("No %s allowed while running setuid", s);
2464 croak("No %s allowed while running setgid", s);
2471 curstash = debstash;
2472 dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
2474 DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
2475 DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
2476 DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
2477 DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
2478 sv_setiv(DBsingle, 0);
2479 DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
2480 sv_setiv(DBtrace, 0);
2481 DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
2482 sv_setiv(DBsignal, 0);
2483 curstash = defstash;
2491 mainstack = curstack; /* remember in case we switch stacks */
2492 AvREAL_off(curstack); /* not a real array */
2493 av_extend(curstack,127);
2495 stack_base = AvARRAY(curstack);
2496 stack_sp = stack_base;
2497 stack_max = stack_base + 127;
2499 cxstack_max = 8192 / sizeof(CONTEXT) - 2; /* Use most of 8K. */
2500 New(50,cxstack,cxstack_max + 1,CONTEXT);
2503 New(50,tmps_stack,128,SV*);
2509 * The following stacks almost certainly should be per-interpreter,
2510 * but for now they're not. XXX
2514 markstack_ptr = markstack;
2516 New(54,markstack,64,I32);
2517 markstack_ptr = markstack;
2518 markstack_max = markstack + 64;
2524 New(54,scopestack,32,I32);
2526 scopestack_max = 32;
2532 New(54,savestack,128,ANY);
2534 savestack_max = 128;
2540 New(54,retstack,16,OP*);
2551 Safefree(tmps_stack);
2558 static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
2567 subname = newSVpv("main",4);
2571 init_predump_symbols()
2577 sv_setpvn(GvSV(gv_fetchpv("\"", TRUE, SVt_PV)), " ", 1);
2579 stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
2580 GvMULTI_on(stdingv);
2581 IoIFP(GvIOp(stdingv)) = PerlIO_stdin();
2582 tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
2584 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(stdingv));
2586 tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
2588 IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
2590 tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
2592 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(defoutgv));
2594 othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
2595 GvMULTI_on(othergv);
2596 IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
2597 tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
2599 GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
2601 statname = NEWSV(66,0); /* last filename we did stat on */
2604 osname = savepv(OSNAME);
2608 init_postdump_symbols(argc,argv,env)
2610 register char **argv;
2611 register char **env;
2617 argc--,argv++; /* skip name of script */
2619 for (; argc > 0 && **argv == '-'; argc--,argv++) {
2622 if (argv[0][1] == '-') {
2626 if (s = strchr(argv[0], '=')) {
2628 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
2631 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
2634 toptarget = NEWSV(0,0);
2635 sv_upgrade(toptarget, SVt_PVFM);
2636 sv_setpvn(toptarget, "", 0);
2637 bodytarget = NEWSV(0,0);
2638 sv_upgrade(bodytarget, SVt_PVFM);
2639 sv_setpvn(bodytarget, "", 0);
2640 formtarget = bodytarget;
2643 if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
2644 sv_setpv(GvSV(tmpgv),origfilename);
2645 magicname("0", "0", 1);
2647 if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
2648 sv_setpv(GvSV(tmpgv),origargv[0]);
2649 if (argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
2651 (void)gv_AVadd(argvgv);
2652 av_clear(GvAVn(argvgv));
2653 for (; argc > 0; argc--,argv++) {
2654 av_push(GvAVn(argvgv),newSVpv(argv[0],0));
2657 if (envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
2661 hv_magic(hv, envgv, 'E');
2662 #ifndef VMS /* VMS doesn't have environ array */
2663 /* Note that if the supplied env parameter is actually a copy
2664 of the global environ then it may now point to free'd memory
2665 if the environment has been modified since. To avoid this
2666 problem we treat env==NULL as meaning 'use the default'
2671 environ[0] = Nullch;
2672 for (; *env; env++) {
2673 if (!(s = strchr(*env,'=')))
2679 sv = newSVpv(s--,0);
2680 (void)hv_store(hv, *env, s - *env, sv, 0);
2682 #if defined(__BORLANDC__) && defined(USE_WIN32_RTL_ENV)
2683 /* Sins of the RTL. See note in my_setenv(). */
2684 (void)putenv(savepv(*env));
2688 #ifdef DYNAMIC_ENV_FETCH
2689 HvNAME(hv) = savepv(ENV_HV_NAME);
2693 if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
2694 sv_setiv(GvSV(tmpgv), (IV)getpid());
2703 s = getenv("PERL5LIB");
2707 incpush(getenv("PERLLIB"), FALSE);
2709 /* Treat PERL5?LIB as a possible search list logical name -- the
2710 * "natural" VMS idiom for a Unix path string. We allow each
2711 * element to be a set of |-separated directories for compatibility.
2715 if (my_trnlnm("PERL5LIB",buf,0))
2716 do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
2718 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
2722 /* Use the ~-expanded versions of APPLLIB (undocumented),
2723 ARCHLIB PRIVLIB SITEARCH SITELIB and OLDARCHLIB
2726 incpush(APPLLIB_EXP, FALSE);
2730 incpush(ARCHLIB_EXP, FALSE);
2733 #define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
2735 incpush(PRIVLIB_EXP, FALSE);
2738 incpush(SITEARCH_EXP, FALSE);
2741 incpush(SITELIB_EXP, FALSE);
2743 #ifdef OLDARCHLIB_EXP /* 5.00[01] compatibility */
2744 incpush(OLDARCHLIB_EXP, FALSE);
2748 incpush(".", FALSE);
2752 # define PERLLIB_SEP ';'
2755 # define PERLLIB_SEP '|'
2757 # define PERLLIB_SEP ':'
2760 #ifndef PERLLIB_MANGLE
2761 # define PERLLIB_MANGLE(s,n) (s)
2765 incpush(p, addsubdirs)
2769 SV *subdir = Nullsv;
2770 static char *archpat_auto;
2777 if (!archpat_auto) {
2778 STRLEN len = (sizeof(ARCHNAME) + strlen(patchlevel)
2779 + sizeof("//auto"));
2780 New(55, archpat_auto, len, char);
2781 sprintf(archpat_auto, "/%s/%s/auto", ARCHNAME, patchlevel);
2783 for (len = sizeof(ARCHNAME) + 2;
2784 archpat_auto[len] != '\0' && archpat_auto[len] != '/'; len++)
2785 if (archpat_auto[len] == '.') archpat_auto[len] = '_';
2790 /* Break at all separators */
2792 SV *libdir = newSV(0);
2795 /* skip any consecutive separators */
2796 while ( *p == PERLLIB_SEP ) {
2797 /* Uncomment the next line for PATH semantics */
2798 /* av_push(GvAVn(incgv), newSVpv(".", 1)); */
2802 if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
2803 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
2808 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
2809 p = Nullch; /* break out */
2813 * BEFORE pushing libdir onto @INC we may first push version- and
2814 * archname-specific sub-directories.
2817 struct stat tmpstatbuf;
2822 if ((unix = tounixspec_ts(SvPV(libdir,na),Nullch)) != Nullch) {
2824 while (unix[len-1] == '/') len--; /* Cosmetic */
2825 sv_usepvn(libdir,unix,len);
2828 PerlIO_printf(PerlIO_stderr(),
2829 "Failed to unixify @INC element \"%s\"\n",
2832 /* .../archname/version if -d .../archname/version/auto */
2833 sv_setsv(subdir, libdir);
2834 sv_catpv(subdir, archpat_auto);
2835 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2836 S_ISDIR(tmpstatbuf.st_mode))
2837 av_push(GvAVn(incgv),
2838 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2840 /* .../archname if -d .../archname/auto */
2841 sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
2842 strlen(patchlevel) + 1, "", 0);
2843 if (Stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
2844 S_ISDIR(tmpstatbuf.st_mode))
2845 av_push(GvAVn(incgv),
2846 newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
2849 /* finally push this lib directory on the end of @INC */
2850 av_push(GvAVn(incgv), libdir);
2853 SvREFCNT_dec(subdir);
2857 call_list(oldscope, list)
2862 line_t oldline = curcop->cop_line;
2867 while (AvFILL(list) >= 0) {
2868 CV *cv = (CV*)av_shift(list);
2875 SV* atsv = GvSV(errgv);
2877 perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
2878 (void)SvPV(atsv, len);
2881 curcop = &compiling;
2882 curcop->cop_line = oldline;
2883 if (list == beginav)
2884 sv_catpv(atsv, "BEGIN failed--compilation aborted");
2886 sv_catpv(atsv, "END failed--cleanup aborted");
2887 while (scopestack_ix > oldscope)
2889 croak("%s", SvPVX(atsv));
2897 /* my_exit() was called */
2898 while (scopestack_ix > oldscope)
2901 curstash = defstash;
2903 call_list(oldscope, endav);
2905 curcop = &compiling;
2906 curcop->cop_line = oldline;
2908 if (list == beginav)
2909 croak("BEGIN failed--compilation aborted");
2911 croak("END failed--cleanup aborted");
2917 PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
2922 curcop = &compiling;
2923 curcop->cop_line = oldline;
2937 DEBUG_L(PerlIO_printf(Perl_debug_log, "my_exit: thread 0x%lx, status %lu\n",
2938 (unsigned long) thr, (unsigned long) status));
2939 #endif /* USE_THREADS */
2948 STATUS_NATIVE_SET(status);
2958 if (vaxc$errno & 1) {
2959 if (STATUS_NATIVE & 1) /* fortuitiously includes "-1" */
2960 STATUS_NATIVE_SET(44);
2963 if (!vaxc$errno && errno) /* unlikely */
2964 STATUS_NATIVE_SET(44);
2966 STATUS_NATIVE_SET(vaxc$errno);
2970 STATUS_POSIX_SET(errno);
2971 else if (STATUS_POSIX == 0)
2972 STATUS_POSIX_SET(255);
2981 register CONTEXT *cx;
2990 (void)UNLINK(e_tmpname);
2991 Safefree(e_tmpname);
2995 if (cxstack_ix >= 0) {