1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80#include "EXTERN.h"
81#define PERL_IN_PERL_C
82#include "perl.h"
83#include "patchlevel.h"
84
85#ifdef NETWARE
86#include "nwutil.h"
87char *nw_get_sitelib(const char *pl);
88#endif
89
90
91#ifdef I_UNISTD
92#include <unistd.h>
93#endif
94
95#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
96# ifdef I_SYS_WAIT
97# include <sys/wait.h>
98# endif
99# ifdef I_SYSUIO
100# include <sys/uio.h>
101# endif
102
103union control_un {
104 struct cmsghdr cm;
105 char control[CMSG_SPACE(sizeof(int))];
106};
107
108#endif
109
110#ifdef __BEOS__
111# define HZ 1000000
112#endif
113
114#ifndef HZ
115# ifdef CLK_TCK
116# define HZ CLK_TCK
117# else
118# define HZ 60
119# endif
120#endif
121
122#if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE) && !defined(PERL_MICRO)
123char *getenv (char *);
124#endif
125
126static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen);
127
128#ifdef IAMSUID
129#ifndef DOSUID
130#define DOSUID
131#endif
132#endif
133
134#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
135#ifdef DOSUID
136#undef DOSUID
137#endif
138#endif
139
140#define CALL_BODY_EVAL(myop) \
141 if (PL_op == (myop)) \
142 PL_op = Perl_pp_entereval(aTHX); \
143 if (PL_op) \
144 CALLRUNOPS(aTHX);
145
146#define CALL_BODY_SUB(myop) \
147 if (PL_op == (myop)) \
148 PL_op = Perl_pp_entersub(aTHX); \
149 if (PL_op) \
150 CALLRUNOPS(aTHX);
151
152#define CALL_LIST_BODY(cv) \
153 PUSHMARK(PL_stack_sp); \
154 call_sv((SV*)(cv), G_EVAL|G_DISCARD);
155
156static void
157S_init_tls_and_interp(PerlInterpreter *my_perl)
158{
159 dVAR;
160 if (!PL_curinterp) {
161 PERL_SET_INTERP(my_perl);
162#if defined(USE_ITHREADS)
163 INIT_THREADS;
164 ALLOC_THREAD_KEY;
165 PERL_SET_THX(my_perl);
166 OP_REFCNT_INIT;
167 HINTS_REFCNT_INIT;
168 MUTEX_INIT(&PL_dollarzero_mutex);
169# endif
170#ifdef PERL_IMPLICIT_CONTEXT
171 MUTEX_INIT(&PL_my_ctx_mutex);
172# endif
173 }
174#if defined(USE_ITHREADS)
175 else
176#else
177
178#endif
179 {
180 PERL_SET_THX(my_perl);
181 }
182}
183
184
185
186
187void
188Perl_sys_init(int* argc, char*** argv)
189{
190 dVAR;
191 PERL_UNUSED_ARG(argc);
192 PERL_UNUSED_ARG(argv);
193 PERL_SYS_INIT_BODY(argc, argv);
194}
195
196void
197Perl_sys_init3(int* argc, char*** argv, char*** env)
198{
199 dVAR;
200 PERL_UNUSED_ARG(argc);
201 PERL_UNUSED_ARG(argv);
202 PERL_UNUSED_ARG(env);
203 PERL_SYS_INIT3_BODY(argc, argv, env);
204}
205
206void
207Perl_sys_term()
208{
209 dVAR;
210 if (!PL_veto_cleanup) {
211 PERL_SYS_TERM_BODY();
212 }
213}
214
215
216#ifdef PERL_IMPLICIT_SYS
217PerlInterpreter *
218perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
219 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
220 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
221 struct IPerlDir* ipD, struct IPerlSock* ipS,
222 struct IPerlProc* ipP)
223{
224 PerlInterpreter *my_perl;
225
226 my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
227 S_init_tls_and_interp(my_perl);
228 Zero(my_perl, 1, PerlInterpreter);
229 PL_Mem = ipM;
230 PL_MemShared = ipMS;
231 PL_MemParse = ipMP;
232 PL_Env = ipE;
233 PL_StdIO = ipStd;
234 PL_LIO = ipLIO;
235 PL_Dir = ipD;
236 PL_Sock = ipS;
237 PL_Proc = ipP;
238 INIT_TRACK_MEMPOOL(PL_memory_debug_header, my_perl);
239
240 return my_perl;
241}
242#else
243
244
245
246
247
248
249
250
251
252
253
254PerlInterpreter *
255perl_alloc(void)
256{
257 PerlInterpreter *my_perl;
258
259
260 my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
261
262 S_init_tls_and_interp(my_perl);
263#ifndef PERL_TRACK_MEMPOOL
264 return (PerlInterpreter *) ZeroD(my_perl, 1, PerlInterpreter);
265#else
266 Zero(my_perl, 1, PerlInterpreter);
267 INIT_TRACK_MEMPOOL(PL_memory_debug_header, my_perl);
268 return my_perl;
269#endif
270}
271#endif
272
273
274
275
276
277
278
279
280
281void
282perl_construct(pTHXx)
283{
284 dVAR;
285 PERL_UNUSED_ARG(my_perl);
286#ifdef MULTIPLICITY
287 init_interp();
288 PL_perl_destruct_level = 1;
289#else
290 if (PL_perl_destruct_level > 0)
291 init_interp();
292#endif
293 PL_curcop = &PL_compiling;
294
295
296
297
298 SvREADONLY_on(&PL_sv_undef);
299 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
300
301 sv_setpv(&PL_sv_no,PL_No);
302
303
304 SvIV(&PL_sv_no);
305 SvNV(&PL_sv_no);
306 SvREADONLY_on(&PL_sv_no);
307 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
308
309 sv_setpv(&PL_sv_yes,PL_Yes);
310 SvIV(&PL_sv_yes);
311 SvNV(&PL_sv_yes);
312 SvREADONLY_on(&PL_sv_yes);
313 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
314
315 SvREADONLY_on(&PL_sv_placeholder);
316 SvREFCNT(&PL_sv_placeholder) = (~(U32)0)/2;
317
318 PL_sighandlerp = (Sighandler_t) Perl_sighandler;
319#ifdef PERL_USES_PL_PIDSTATUS
320 PL_pidstatus = newHV();
321#endif
322
323 PL_rs = newSVpvs("\n");
324
325 init_stacks();
326
327 init_ids();
328
329 JMPENV_BOOTSTRAP;
330 STATUS_ALL_SUCCESS;
331
332 init_i18nl10n(1);
333 SET_NUMERIC_STANDARD();
334
335#if defined(LOCAL_PATCH_COUNT)
336 PL_localpatches = local_patches;
337#endif
338
339#ifdef HAVE_INTERP_INTERN
340 sys_intern_init();
341#endif
342
343 PerlIO_init(aTHX);
344
345 PL_fdpid = newAV();
346 PL_modglobal = newHV();
347 PL_errors = newSVpvs("");
348 sv_setpvn(PERL_DEBUG_PAD(0), "", 0);
349 sv_setpvn(PERL_DEBUG_PAD(1), "", 0);
350 sv_setpvn(PERL_DEBUG_PAD(2), "", 0);
351#ifdef USE_ITHREADS
352
353 Perl_av_create_and_push(aTHX_ &PL_regex_padav,(SV*)newAV());
354 PL_regex_pad = AvARRAY(PL_regex_padav);
355#endif
356#ifdef USE_REENTRANT_API
357 Perl_reentrant_init(aTHX);
358#endif
359
360
361
362
363 PL_strtab = newHV();
364
365 HvSHAREKEYS_off(PL_strtab);
366 hv_ksplit(PL_strtab, 512);
367
368#if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
369 _dyld_lookup_and_bind
370 ("__environ", (unsigned long *) &environ_pointer, NULL);
371#endif
372
373#ifndef PERL_MICRO
374# ifdef USE_ENVIRON_ARRAY
375 PL_origenviron = environ;
376# endif
377#endif
378
379
380
381
382
383
384#if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK) && !defined(__BEOS__)
385 PL_clocktick = sysconf(_SC_CLK_TCK);
386 if (PL_clocktick <= 0)
387#endif
388 PL_clocktick = HZ;
389
390 PL_stashcache = newHV();
391
392 PL_patchlevel = Perl_newSVpvf(aTHX_ "v%d.%d.%d", (int)PERL_REVISION,
393 (int)PERL_VERSION, (int)PERL_SUBVERSION);
394
395#ifdef HAS_MMAP
396 if (!PL_mmap_page_size) {
397#if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_MMAP_PAGE_SIZE))
398 {
399 SETERRNO(0, SS_NORMAL);
400# ifdef _SC_PAGESIZE
401 PL_mmap_page_size = sysconf(_SC_PAGESIZE);
402# else
403 PL_mmap_page_size = sysconf(_SC_MMAP_PAGE_SIZE);
404# endif
405 if ((long) PL_mmap_page_size < 0) {
406 if (errno) {
407 SV * const error = ERRSV;
408 SvUPGRADE(error, SVt_PV);
409 Perl_croak(aTHX_ "panic: sysconf: %s", SvPV_nolen_const(error));
410 }
411 else
412 Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
413 }
414 }
415#else
416# ifdef HAS_GETPAGESIZE
417 PL_mmap_page_size = getpagesize();
418# else
419# if defined(I_SYS_PARAM) && defined(PAGESIZE)
420 PL_mmap_page_size = PAGESIZE;
421# endif
422# endif
423#endif
424 if (PL_mmap_page_size <= 0)
425 Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
426 (IV) PL_mmap_page_size);
427 }
428#endif
429
430#if defined(HAS_TIMES) && defined(PERL_NEED_TIMESBASE)
431 PL_timesbase.tms_utime = 0;
432 PL_timesbase.tms_stime = 0;
433 PL_timesbase.tms_cutime = 0;
434 PL_timesbase.tms_cstime = 0;
435#endif
436
437 ENTER;
438}
439
440
441
442
443
444
445
446
447
448
449int
450Perl_nothreadhook(pTHX)
451{
452 PERL_UNUSED_CONTEXT;
453 return 0;
454}
455
456#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
457void
458Perl_dump_sv_child(pTHX_ SV *sv)
459{
460 ssize_t got;
461 const int sock = PL_dumper_fd;
462 const int debug_fd = PerlIO_fileno(Perl_debug_log);
463 union control_un control;
464 struct msghdr msg;
465 struct iovec vec[2];
466 struct cmsghdr *cmptr;
467 int returned_errno;
468 unsigned char buffer[256];
469
470 if(sock == -1 || debug_fd == -1)
471 return;
472
473 PerlIO_flush(Perl_debug_log);
474
475
476
477
478
479
480
481 msg.msg_control = control.control;
482 msg.msg_controllen = sizeof(control.control);
483
484 msg.msg_name = NULL;
485 msg.msg_namelen = 0;
486 msg.msg_iov = vec;
487 msg.msg_iovlen = 1;
488
489 cmptr = CMSG_FIRSTHDR(&msg);
490 cmptr->cmsg_len = CMSG_LEN(sizeof(int));
491 cmptr->cmsg_level = SOL_SOCKET;
492 cmptr->cmsg_type = SCM_RIGHTS;
493 *((int *)CMSG_DATA(cmptr)) = 1;
494
495 vec[0].iov_base = (void*)&sv;
496 vec[0].iov_len = sizeof(sv);
497 got = sendmsg(sock, &msg, 0);
498
499 if(got < 0) {
500 perror("Debug leaking scalars parent sendmsg failed");
501 abort();
502 }
503 if(got < sizeof(sv)) {
504 perror("Debug leaking scalars parent short sendmsg");
505 abort();
506 }
507
508
509
510
511
512
513 vec[0].iov_base = (void*)&returned_errno;
514 vec[0].iov_len = sizeof(returned_errno);
515 vec[1].iov_base = buffer;
516 vec[1].iov_len = 1;
517
518 got = readv(sock, vec, 2);
519
520 if(got < 0) {
521 perror("Debug leaking scalars parent read failed");
522 PerlIO_flush(PerlIO_stderr());
523 abort();
524 }
525 if(got < sizeof(returned_errno) + 1) {
526 perror("Debug leaking scalars parent short read");
527 PerlIO_flush(PerlIO_stderr());
528 abort();
529 }
530
531 if (*buffer) {
532 got = read(sock, buffer + 1, *buffer);
533 if(got < 0) {
534 perror("Debug leaking scalars parent read 2 failed");
535 PerlIO_flush(PerlIO_stderr());
536 abort();
537 }
538
539 if(got < *buffer) {
540 perror("Debug leaking scalars parent short read 2");
541 PerlIO_flush(PerlIO_stderr());
542 abort();
543 }
544 }
545
546 if (returned_errno || *buffer) {
547 Perl_warn(aTHX_ "Debug leaking scalars child failed%s%.*s with errno"
548 " %d: %s", (*buffer ? " at " : ""), (int) *buffer, buffer + 1,
549 returned_errno, strerror(returned_errno));
550 }
551}
552#endif
553
554
555
556
557
558
559
560
561
562int
563perl_destruct(pTHXx)
564{
565 dVAR;
566 VOL signed char destruct_level;
567 HV *hv;
568#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
569 pid_t child;
570#endif
571
572 PERL_UNUSED_ARG(my_perl);
573
574
575 PERL_WAIT_FOR_CHILDREN;
576
577 destruct_level = PL_perl_destruct_level;
578#ifdef DEBUGGING
579 {
580 const char * const s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL");
581 if (s) {
582 const int i = atoi(s);
583 if (destruct_level < i)
584 destruct_level = i;
585 }
586 }
587#endif
588
589 if (PL_exit_flags & PERL_EXIT_DESTRUCT_END) {
590 dJMPENV;
591 int x = 0;
592
593 JMPENV_PUSH(x);
594 PERL_UNUSED_VAR(x);
595 if (PL_endav && !PL_minus_c)
596 call_list(PL_scopestack_ix, PL_endav);
597 JMPENV_POP;
598 }
599 LEAVE;
600 FREETMPS;
601
602
603 my_fflush_all();
604
605 if (CALL_FPTR(PL_threadhook)(aTHX)) {
606
607 PL_veto_cleanup = TRUE;
608 return STATUS_EXIT;
609 }
610
611#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
612 if (destruct_level != 0) {
613
614
615
616
617
618 int fd[2];
619
620 if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) {
621 perror("Debug leaking scalars socketpair failed");
622 abort();
623 }
624
625 child = fork();
626 if(child == -1) {
627 perror("Debug leaking scalars fork failed");
628 abort();
629 }
630 if (!child) {
631
632 const int sock = fd[1];
633 const int debug_fd = PerlIO_fileno(Perl_debug_log);
634 int f;
635 const char *where;
636
637 static const char success[sizeof(int) + 1];
638
639 close(fd[0]);
640
641
642
643
644
645
646
647
648
649
650
651
652
653 f = sysconf(_SC_OPEN_MAX);
654 if(f < 0) {
655 where = "sysconf failed";
656 goto abort;
657 }
658 while (f--) {
659 if (f == sock)
660 continue;
661 close(f);
662 }
663
664 while (1) {
665 SV *target;
666 union control_un control;
667 struct msghdr msg;
668 struct iovec vec[1];
669 struct cmsghdr *cmptr;
670 ssize_t got;
671 int got_fd;
672
673 msg.msg_control = control.control;
674 msg.msg_controllen = sizeof(control.control);
675
676 msg.msg_name = NULL;
677 msg.msg_namelen = 0;
678 msg.msg_iov = vec;
679 msg.msg_iovlen = sizeof(vec)/sizeof(vec[0]);
680
681 vec[0].iov_base = (void*)⌖
682 vec[0].iov_len = sizeof(target);
683
684 got = recvmsg(sock, &msg, 0);
685
686 if(got == 0)
687 break;
688 if(got < 0) {
689 where = "recv failed";
690 goto abort;
691 }
692 if(got < sizeof(target)) {
693 where = "short recv";
694 goto abort;
695 }
696
697 if(!(cmptr = CMSG_FIRSTHDR(&msg))) {
698 where = "no cmsg";
699 goto abort;
700 }
701 if(cmptr->cmsg_len != CMSG_LEN(sizeof(int))) {
702 where = "wrong cmsg_len";
703 goto abort;
704 }
705 if(cmptr->cmsg_level != SOL_SOCKET) {
706 where = "wrong cmsg_level";
707 goto abort;
708 }
709 if(cmptr->cmsg_type != SCM_RIGHTS) {
710 where = "wrong cmsg_type";
711 goto abort;
712 }
713
714 got_fd = *(int*)CMSG_DATA(cmptr);
715
716
717
718 if(got_fd != debug_fd) {
719 if (dup2(got_fd, debug_fd) == -1) {
720 where = "dup2";
721 goto abort;
722 }
723 }
724 sv_dump(target);
725
726 PerlIO_flush(Perl_debug_log);
727
728 got = write(sock, &success, sizeof(success));
729
730 if(got < 0) {
731 where = "write failed";
732 goto abort;
733 }
734 if(got < sizeof(success)) {
735 where = "short write";
736 goto abort;
737 }
738 }
739 _exit(0);
740 abort:
741 {
742 int send_errno = errno;
743 unsigned char length = (unsigned char) strlen(where);
744 struct iovec failure[3] = {
745 {(void*)&send_errno, sizeof(send_errno)},
746 {&length, 1},
747 {(void*)where, length}
748 };
749 int got = writev(sock, failure, 3);
750
751
752
753
754
755 sleep(2);
756 _exit((got == -1) ? errno : 0);
757 }
758
759 }
760 PL_dumper_fd = fd[0];
761 close(fd[1]);
762 }
763#endif
764
765
766
767
768
769
770
771
772 PL_curcop = &PL_compiling;
773 if (PL_main_root) {
774
775 if (CvPADLIST(PL_main_cv)) {
776 PAD_SET_CUR_NOSAVE(CvPADLIST(PL_main_cv), 1);
777 }
778 op_free(PL_main_root);
779 PL_main_root = NULL;
780 }
781 PL_main_start = NULL;
782 SvREFCNT_dec(PL_main_cv);
783 PL_main_cv = NULL;
784 PL_dirty = TRUE;
785
786
787
788
789
790
791 PerlIO_destruct(aTHX);
792
793 if (PL_sv_objcount) {
794
795
796
797
798
799 sv_clean_objs();
800 PL_sv_objcount = 0;
801 if (PL_defoutgv && !SvREFCNT(PL_defoutgv))
802 PL_defoutgv = NULL;
803 }
804
805
806 SvREFCNT_dec(PL_warnhook);
807 PL_warnhook = NULL;
808 SvREFCNT_dec(PL_diehook);
809 PL_diehook = NULL;
810
811
812 while (PL_exitlistlen-- > 0)
813 PL_exitlist[PL_exitlistlen].fn(aTHX_ PL_exitlist[PL_exitlistlen].ptr);
814
815 Safefree(PL_exitlist);
816
817 PL_exitlist = NULL;
818 PL_exitlistlen = 0;
819
820
821
822
823
824#ifndef PERL_MICRO
825#if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV)
826 if (environ != PL_origenviron && !PL_use_safe_putenv
827#ifdef USE_ITHREADS
828
829 && PL_curinterp == aTHX
830#endif
831 )
832 {
833 I32 i;
834
835 for (i = 0; environ[i]; i++)
836 safesysfree(environ[i]);
837
838
839 safesysfree(environ);
840
841 environ = PL_origenviron;
842 }
843#endif
844#endif
845
846 if (destruct_level == 0) {
847
848 DEBUG_P(debprofdump());
849
850#if defined(PERLIO_LAYERS)
851
852 PerlIO_cleanup(aTHX);
853#endif
854
855 CopFILE_free(&PL_compiling);
856 CopSTASH_free(&PL_compiling);
857
858
859 return STATUS_EXIT;
860 }
861
862
863 setdefout(NULL);
864
865#ifdef USE_ITHREADS
866
867
868
869
870
871 {
872 I32 i = AvFILLp(PL_regex_padav) + 1;
873 SV * const * const ary = AvARRAY(PL_regex_padav);
874
875 while (i) {
876 SV * const resv = ary[--i];
877
878 if (SvFLAGS(resv) & SVf_BREAK) {
879
880
881
882 SvFLAGS(resv) &= ~SVf_BREAK;
883 }
884 else if(SvREPADTMP(resv)) {
885 SvREPADTMP_off(resv);
886 }
887 else if(SvIOKp(resv)) {
888 REGEXP *re = INT2PTR(REGEXP *,SvIVX(resv));
889 ReREFCNT_dec(re);
890 }
891 }
892 }
893 SvREFCNT_dec(PL_regex_padav);
894 PL_regex_padav = NULL;
895 PL_regex_pad = NULL;
896#endif
897
898 SvREFCNT_dec((SV*) PL_stashcache);
899 PL_stashcache = NULL;
900
901
902
903
904 if(PL_parser && PL_parser->rsfp) {
905 (void)PerlIO_close(PL_parser->rsfp);
906 PL_parser->rsfp = NULL;
907 }
908
909 if (PL_minus_F) {
910 Safefree(PL_splitstr);
911 PL_splitstr = NULL;
912 }
913
914
915 PL_preprocess = FALSE;
916 PL_minus_n = FALSE;
917 PL_minus_p = FALSE;
918 PL_minus_l = FALSE;
919 PL_minus_a = FALSE;
920 PL_minus_F = FALSE;
921 PL_doswitches = FALSE;
922 PL_dowarn = G_WARN_OFF;
923 PL_doextract = FALSE;
924 PL_sawampersand = FALSE;
925 PL_unsafe = FALSE;
926
927 Safefree(PL_inplace);
928 PL_inplace = NULL;
929 SvREFCNT_dec(PL_patchlevel);
930
931 if (PL_e_script) {
932 SvREFCNT_dec(PL_e_script);
933 PL_e_script = NULL;
934 }
935
936 PL_perldb = 0;
937
938
939
940 SvREFCNT_dec(PL_ofs_sv);
941 PL_ofs_sv = NULL;
942
943 SvREFCNT_dec(PL_ors_sv);
944 PL_ors_sv = NULL;
945
946 SvREFCNT_dec(PL_rs);
947 PL_rs = NULL;
948
949 Safefree(PL_osname);
950 PL_osname = NULL;
951
952 SvREFCNT_dec(PL_statname);
953 PL_statname = NULL;
954 PL_statgv = NULL;
955
956
957
958
959 SvREFCNT_dec(PL_lastscream);
960 PL_lastscream = NULL;
961 Safefree(PL_screamfirst);
962 PL_screamfirst = 0;
963 Safefree(PL_screamnext);
964 PL_screamnext = 0;
965
966
967 Safefree(PL_efloatbuf);
968 PL_efloatbuf = NULL;
969 PL_efloatsize = 0;
970
971
972 SvREFCNT_dec(PL_beginav);
973 SvREFCNT_dec(PL_beginav_save);
974 SvREFCNT_dec(PL_endav);
975 SvREFCNT_dec(PL_checkav);
976 SvREFCNT_dec(PL_checkav_save);
977 SvREFCNT_dec(PL_unitcheckav);
978 SvREFCNT_dec(PL_unitcheckav_save);
979 SvREFCNT_dec(PL_initav);
980 PL_beginav = NULL;
981 PL_beginav_save = NULL;
982 PL_endav = NULL;
983 PL_checkav = NULL;
984 PL_checkav_save = NULL;
985 PL_unitcheckav = NULL;
986 PL_unitcheckav_save = NULL;
987 PL_initav = NULL;
988
989
990 PL_envgv = NULL;
991 PL_incgv = NULL;
992 PL_hintgv = NULL;
993 PL_errgv = NULL;
994 PL_argvgv = NULL;
995 PL_argvoutgv = NULL;
996 PL_stdingv = NULL;
997 PL_stderrgv = NULL;
998 PL_last_in_gv = NULL;
999 PL_replgv = NULL;
1000 PL_DBgv = NULL;
1001 PL_DBline = NULL;
1002 PL_DBsub = NULL;
1003 PL_DBsingle = NULL;
1004 PL_DBtrace = NULL;
1005 PL_DBsignal = NULL;
1006 PL_DBcv = NULL;
1007 PL_dbargs = NULL;
1008 PL_debstash = NULL;
1009
1010 SvREFCNT_dec(PL_argvout_stack);
1011 PL_argvout_stack = NULL;
1012
1013 SvREFCNT_dec(PL_modglobal);
1014 PL_modglobal = NULL;
1015 SvREFCNT_dec(PL_preambleav);
1016 PL_preambleav = NULL;
1017 SvREFCNT_dec(PL_subname);
1018 PL_subname = NULL;
1019#ifdef PERL_USES_PL_PIDSTATUS
1020 SvREFCNT_dec(PL_pidstatus);
1021 PL_pidstatus = NULL;
1022#endif
1023 SvREFCNT_dec(PL_toptarget);
1024 PL_toptarget = NULL;
1025 SvREFCNT_dec(PL_bodytarget);
1026 PL_bodytarget = NULL;
1027 PL_formtarget = NULL;
1028
1029
1030#ifdef USE_LOCALE_COLLATE
1031 Safefree(PL_collation_name);
1032 PL_collation_name = NULL;
1033#endif
1034
1035#ifdef USE_LOCALE_NUMERIC
1036 Safefree(PL_numeric_name);
1037 PL_numeric_name = NULL;
1038 SvREFCNT_dec(PL_numeric_radix_sv);
1039 PL_numeric_radix_sv = NULL;
1040#endif
1041
1042
1043 SvREFCNT_dec(PL_utf8_alnum);
1044 SvREFCNT_dec(PL_utf8_alnumc);
1045 SvREFCNT_dec(PL_utf8_ascii);
1046 SvREFCNT_dec(PL_utf8_alpha);
1047 SvREFCNT_dec(PL_utf8_space);
1048 SvREFCNT_dec(PL_utf8_cntrl);
1049 SvREFCNT_dec(PL_utf8_graph);
1050 SvREFCNT_dec(PL_utf8_digit);
1051 SvREFCNT_dec(PL_utf8_upper);
1052 SvREFCNT_dec(PL_utf8_lower);
1053 SvREFCNT_dec(PL_utf8_print);
1054 SvREFCNT_dec(PL_utf8_punct);
1055 SvREFCNT_dec(PL_utf8_xdigit);
1056 SvREFCNT_dec(PL_utf8_mark);
1057 SvREFCNT_dec(PL_utf8_toupper);
1058 SvREFCNT_dec(PL_utf8_totitle);
1059 SvREFCNT_dec(PL_utf8_tolower);
1060 SvREFCNT_dec(PL_utf8_tofold);
1061 SvREFCNT_dec(PL_utf8_idstart);
1062 SvREFCNT_dec(PL_utf8_idcont);
1063 PL_utf8_alnum = NULL;
1064 PL_utf8_alnumc = NULL;
1065 PL_utf8_ascii = NULL;
1066 PL_utf8_alpha = NULL;
1067 PL_utf8_space = NULL;
1068 PL_utf8_cntrl = NULL;
1069 PL_utf8_graph = NULL;
1070 PL_utf8_digit = NULL;
1071 PL_utf8_upper = NULL;
1072 PL_utf8_lower = NULL;
1073 PL_utf8_print = NULL;
1074 PL_utf8_punct = NULL;
1075 PL_utf8_xdigit = NULL;
1076 PL_utf8_mark = NULL;
1077 PL_utf8_toupper = NULL;
1078 PL_utf8_totitle = NULL;
1079 PL_utf8_tolower = NULL;
1080 PL_utf8_tofold = NULL;
1081 PL_utf8_idstart = NULL;
1082 PL_utf8_idcont = NULL;
1083
1084 if (!specialWARN(PL_compiling.cop_warnings))
1085 PerlMemShared_free(PL_compiling.cop_warnings);
1086 PL_compiling.cop_warnings = NULL;
1087 Perl_refcounted_he_free(aTHX_ PL_compiling.cop_hints_hash);
1088 PL_compiling.cop_hints_hash = NULL;
1089 CopFILE_free(&PL_compiling);
1090 CopSTASH_free(&PL_compiling);
1091
1092
1093
1094 hv = PL_defstash;
1095 PL_defstash = 0;
1096 SvREFCNT_dec(hv);
1097 SvREFCNT_dec(PL_curstname);
1098 PL_curstname = NULL;
1099
1100
1101 SvREFCNT_dec(PL_errors);
1102 PL_errors = NULL;
1103
1104 SvREFCNT_dec(PL_isarev);
1105
1106 FREETMPS;
1107 if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
1108 if (PL_scopestack_ix != 0)
1109 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
1110 "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
1111 (long)PL_scopestack_ix);
1112 if (PL_savestack_ix != 0)
1113 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
1114 "Unbalanced saves: %ld more saves than restores\n",
1115 (long)PL_savestack_ix);
1116 if (PL_tmps_floor != -1)
1117 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced tmps: %ld more allocs than frees\n",
1118 (long)PL_tmps_floor + 1);
1119 if (cxstack_ix != -1)
1120 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced context: %ld more PUSHes than POPs\n",
1121 (long)cxstack_ix + 1);
1122 }
1123
1124
1125 SvFLAGS(PL_fdpid) |= SVTYPEMASK;
1126 SvFLAGS(PL_strtab) |= SVTYPEMASK;
1127
1128
1129 while (PL_sv_count > 2 && sv_clean_all())
1130 ;
1131
1132 SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
1133 SvFLAGS(PL_fdpid) |= SVt_PVAV;
1134 SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
1135 SvFLAGS(PL_strtab) |= SVt_PVHV;
1136
1137 AvREAL_off(PL_fdpid);
1138 SvREFCNT_dec(PL_fdpid);
1139 PL_fdpid = NULL;
1140
1141#ifdef HAVE_INTERP_INTERN
1142 sys_intern_clear();
1143#endif
1144
1145
1146 {
1147
1148
1149
1150
1151
1152
1153 I32 riter = 0;
1154 const I32 max = HvMAX(PL_strtab);
1155 HE * const * const array = HvARRAY(PL_strtab);
1156 HE *hent = array[0];
1157
1158 for (;;) {
1159 if (hent && ckWARN_d(WARN_INTERNAL)) {
1160 HE * const next = HeNEXT(hent);
1161 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
1162 "Unbalanced string table refcount: (%ld) for \"%s\"",
1163 (long)hent->he_valu.hent_refcount, HeKEY(hent));
1164 Safefree(hent);
1165 hent = next;
1166 }
1167 if (!hent) {
1168 if (++riter > max)
1169 break;
1170 hent = array[riter];
1171 }
1172 }
1173
1174 Safefree(array);
1175 HvARRAY(PL_strtab) = 0;
1176 HvTOTALKEYS(PL_strtab) = 0;
1177 HvFILL(PL_strtab) = 0;
1178 }
1179 SvREFCNT_dec(PL_strtab);
1180
1181#ifdef USE_ITHREADS
1182
1183 ptr_table_free(PL_ptr_table);
1184 PL_ptr_table = (PTR_TBL_t*)NULL;
1185#endif
1186
1187
1188
1189 SvREFCNT(&PL_sv_yes) = 0;
1190 sv_clear(&PL_sv_yes);
1191 SvANY(&PL_sv_yes) = NULL;
1192 SvFLAGS(&PL_sv_yes) = 0;
1193
1194 SvREFCNT(&PL_sv_no) = 0;
1195 sv_clear(&PL_sv_no);
1196 SvANY(&PL_sv_no) = NULL;
1197 SvFLAGS(&PL_sv_no) = 0;
1198
1199 {
1200 int i;
1201 for (i=0; i<=2; i++) {
1202 SvREFCNT(PERL_DEBUG_PAD(i)) = 0;
1203 sv_clear(PERL_DEBUG_PAD(i));
1204 SvANY(PERL_DEBUG_PAD(i)) = NULL;
1205 SvFLAGS(PERL_DEBUG_PAD(i)) = 0;
1206 }
1207 }
1208
1209 if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
1210 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Scalars leaked: %ld\n", (long)PL_sv_count);
1211
1212#ifdef DEBUG_LEAKING_SCALARS
1213 if (PL_sv_count != 0) {
1214 SV* sva;
1215 SV* sv;
1216 register SV* svend;
1217
1218 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
1219 svend = &sva[SvREFCNT(sva)];
1220 for (sv = sva + 1; sv < svend; ++sv) {
1221 if (SvTYPE(sv) != SVTYPEMASK) {
1222 PerlIO_printf(Perl_debug_log, "leaked: sv=0x%p"
1223 " flags=0x%"UVxf
1224 " refcnt=%"UVuf pTHX__FORMAT "\n"
1225 "\tallocated at %s:%d %s %s%s\n",
1226 (void*)sv, sv->sv_flags, sv->sv_refcnt pTHX__VALUE,
1227 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1228 sv->sv_debug_line,
1229 sv->sv_debug_inpad ? "for" : "by",
1230 sv->sv_debug_optype ?
1231 PL_op_name[sv->sv_debug_optype]: "(none)",
1232 sv->sv_debug_cloned ? " (cloned)" : ""
1233 );
1234#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1235 Perl_dump_sv_child(aTHX_ sv);
1236#endif
1237 }
1238 }
1239 }
1240 }
1241#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1242 {
1243 int status;
1244 fd_set rset;
1245
1246
1247
1248 struct timeval waitfor = {4, 0};
1249 int sock = PL_dumper_fd;
1250
1251 shutdown(sock, 1);
1252 FD_ZERO(&rset);
1253 FD_SET(sock, &rset);
1254 select(sock + 1, &rset, NULL, NULL, &waitfor);
1255 waitpid(child, &status, WNOHANG);
1256 close(sock);
1257 }
1258#endif
1259#endif
1260 PL_sv_count = 0;
1261
1262#ifdef PERL_DEBUG_READONLY_OPS
1263 free(PL_slabs);
1264 PL_slabs = NULL;
1265 PL_slab_count = 0;
1266#endif
1267
1268#if defined(PERLIO_LAYERS)
1269
1270 PerlIO_cleanup(aTHX);
1271#endif
1272
1273
1274
1275
1276
1277 SvREFCNT(&PL_sv_undef) = 0;
1278 SvREADONLY_off(&PL_sv_undef);
1279
1280 Safefree(PL_origfilename);
1281 PL_origfilename = NULL;
1282 Safefree(PL_reg_start_tmp);
1283 PL_reg_start_tmp = (char**)NULL;
1284 PL_reg_start_tmpl = 0;
1285 Safefree(PL_reg_curpm);
1286 Safefree(PL_reg_poscache);
1287 free_tied_hv_pool();
1288 Safefree(PL_op_mask);
1289 Safefree(PL_psig_ptr);
1290 PL_psig_ptr = (SV**)NULL;
1291 Safefree(PL_psig_name);
1292 PL_psig_name = (SV**)NULL;
1293 Safefree(PL_bitcount);
1294 PL_bitcount = NULL;
1295 Safefree(PL_psig_pend);
1296 PL_psig_pend = (int*)NULL;
1297 PL_formfeed = NULL;
1298 nuke_stacks();
1299 PL_tainting = FALSE;
1300 PL_taint_warn = FALSE;
1301 PL_hints = 0;
1302 PL_debug = 0;
1303
1304 DEBUG_P(debprofdump());
1305
1306#ifdef USE_REENTRANT_API
1307 Perl_reentrant_free(aTHX);
1308#endif
1309
1310 sv_free_arenas();
1311
1312 while (PL_regmatch_slab) {
1313 regmatch_slab *s = PL_regmatch_slab;
1314 PL_regmatch_slab = PL_regmatch_slab->next;
1315 Safefree(s);
1316 }
1317
1318
1319
1320 if (PL_mess_sv) {
1321
1322
1323
1324 MAGIC* mg;
1325 MAGIC* moremagic;
1326 for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
1327 moremagic = mg->mg_moremagic;
1328 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global
1329 && mg->mg_len >= 0)
1330 Safefree(mg->mg_ptr);
1331 Safefree(mg);
1332 }
1333
1334
1335 SvPV_free(PL_mess_sv);
1336 Safefree(SvANY(PL_mess_sv));
1337 Safefree(PL_mess_sv);
1338 PL_mess_sv = NULL;
1339 }
1340 return STATUS_EXIT;
1341}
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351void
1352perl_free(pTHXx)
1353{
1354 dVAR;
1355
1356 if (PL_veto_cleanup)
1357 return;
1358
1359#ifdef PERL_TRACK_MEMPOOL
1360 {
1361
1362
1363
1364
1365 const char * const s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL");
1366 if (!s || atoi(s) == 0) {
1367
1368
1369 while(aTHXx->Imemory_debug_header.next != &(aTHXx->Imemory_debug_header))
1370 safesysfree(sTHX + (char *)(aTHXx->Imemory_debug_header.next));
1371 }
1372 }
1373#endif
1374
1375#if defined(WIN32) || defined(NETWARE)
1376# if defined(PERL_IMPLICIT_SYS)
1377 {
1378# ifdef NETWARE
1379 void *host = nw_internal_host;
1380# else
1381 void *host = w32_internal_host;
1382# endif
1383 PerlMem_free(aTHXx);
1384# ifdef NETWARE
1385 nw_delete_internal_host(host);
1386# else
1387 win32_delete_internal_host(host);
1388# endif
1389 }
1390# else
1391 PerlMem_free(aTHXx);
1392# endif
1393#else
1394 PerlMem_free(aTHXx);
1395#endif
1396}
1397
1398#if defined(USE_ITHREADS)
1399
1400#ifndef WIN32
1401
1402#if defined(__hpux) && !(defined(__ux_version) && __ux_version <= 1020) && !defined(__GNUC__)
1403#pragma fini "perl_fini"
1404#elif defined(__sun) && !defined(__GNUC__)
1405#pragma fini (perl_fini)
1406#endif
1407
1408static void
1409#if defined(__GNUC__)
1410__attribute__((destructor))
1411#endif
1412perl_fini(void)
1413{
1414 dVAR;
1415 if (PL_curinterp && !PL_veto_cleanup)
1416 FREE_THREAD_KEY;
1417}
1418
1419#endif
1420#endif
1421
1422void
1423Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
1424{
1425 dVAR;
1426 Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
1427 PL_exitlist[PL_exitlistlen].fn = fn;
1428 PL_exitlist[PL_exitlistlen].ptr = ptr;
1429 ++PL_exitlistlen;
1430}
1431
1432#ifdef HAS_PROCSELFEXE
1433
1434
1435
1436STATIC void
1437S_procself_val(pTHX_ SV *sv, const char *arg0)
1438{
1439 char buf[MAXPATHLEN];
1440 int len = readlink(PROCSELFEXE_PATH, buf, sizeof(buf) - 1);
1441
1442
1443
1444
1445
1446
1447
1448 if (len > 0 && buf[len-1] == '\0') {
1449 len--;
1450 }
1451
1452
1453
1454
1455
1456
1457
1458 if (len > 0 && memchr(buf, '/', len)) {
1459 sv_setpvn(sv,buf,len);
1460 }
1461 else {
1462 sv_setpv(sv,arg0);
1463 }
1464}
1465#endif
1466
1467STATIC void
1468S_set_caret_X(pTHX) {
1469 dVAR;
1470 GV* tmpgv = gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL, SVt_PV);
1471 if (tmpgv) {
1472#ifdef HAS_PROCSELFEXE
1473 S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
1474#else
1475#ifdef OS2
1476 sv_setpv(GvSVn(tmpgv), os2_execname(aTHX));
1477#else
1478 sv_setpv(GvSVn(tmpgv),PL_origargv[0]);
1479#endif
1480#endif
1481 }
1482}
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492int
1493perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
1494{
1495 dVAR;
1496 I32 oldscope;
1497 int ret;
1498 dJMPENV;
1499
1500 PERL_UNUSED_ARG(my_perl);
1501
1502#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
1503#ifdef IAMSUID
1504#undef IAMSUID
1505 Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
1506setuid perl scripts securely.\n");
1507#endif
1508#endif
1509
1510#if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT)
1511
1512
1513
1514
1515
1516 if (!PL_rehash_seed_set)
1517 PL_rehash_seed = get_hash_seed();
1518 {
1519 const char * const s = PerlEnv_getenv("PERL_HASH_SEED_DEBUG");
1520
1521 if (s && (atoi(s) == 1))
1522 PerlIO_printf(Perl_debug_log, "HASH_SEED = %"UVuf"\n", PL_rehash_seed);
1523 }
1524#endif
1525
1526 PL_origargc = argc;
1527 PL_origargv = argv;
1528
1529 if (PL_origalen != 0) {
1530 PL_origalen = 1;
1531 }
1532 else {
1533
1534
1535
1536
1537
1538
1539
1540 const char *s = NULL;
1541 int i;
1542 const UV mask =
1543 ~(UV)(PTRSIZE == 4 ? 3 : PTRSIZE == 8 ? 7 : PTRSIZE == 16 ? 15 : 0);
1544
1545 const UV aligned =
1546 (mask < ~(UV)0) && ((PTR2UV(argv[0]) & mask) == PTR2UV(argv[0]));
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557 if (PL_origargv && PL_origargc >= 1 && (s = PL_origargv[0])) {
1558 while (*s) s++;
1559 for (i = 1; i < PL_origargc; i++) {
1560 if ((PL_origargv[i] == s + 1
1561#ifdef OS2
1562 || PL_origargv[i] == s + 2
1563#endif
1564 )
1565 ||
1566 (aligned &&
1567 (PL_origargv[i] > s &&
1568 PL_origargv[i] <=
1569 INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1570 )
1571 {
1572 s = PL_origargv[i];
1573 while (*s) s++;
1574 }
1575 else
1576 break;
1577 }
1578 }
1579
1580#ifndef PERL_USE_SAFE_PUTENV
1581
1582 if (s && PL_origenviron && !PL_use_safe_putenv) {
1583 if ((PL_origenviron[0] == s + 1)
1584 ||
1585 (aligned &&
1586 (PL_origenviron[0] > s &&
1587 PL_origenviron[0] <=
1588 INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1589 )
1590 {
1591#ifndef OS2
1592 s = PL_origenviron[0];
1593 while (*s) s++;
1594#endif
1595 my_setenv("NoNe SuCh", NULL);
1596
1597 for (i = 1; PL_origenviron[i]; i++) {
1598 if (PL_origenviron[i] == s + 1
1599 ||
1600 (aligned &&
1601 (PL_origenviron[i] > s &&
1602 PL_origenviron[i] <=
1603 INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1604 )
1605 {
1606 s = PL_origenviron[i];
1607 while (*s) s++;
1608 }
1609 else
1610 break;
1611 }
1612 }
1613 }
1614#endif
1615
1616 PL_origalen = s ? s - PL_origargv[0] + 1 : 0;
1617 }
1618
1619 if (PL_do_undump) {
1620
1621
1622
1623 PL_origfilename = savepv(argv[0]);
1624 PL_do_undump = FALSE;
1625 cxstack_ix = -1;
1626 init_ids();
1627 assert (!PL_tainted);
1628 TAINT;
1629 S_set_caret_X(aTHX);
1630 TAINT_NOT;
1631 init_postdump_symbols(argc,argv,env);
1632 return 0;
1633 }
1634
1635 if (PL_main_root) {
1636 op_free(PL_main_root);
1637 PL_main_root = NULL;
1638 }
1639 PL_main_start = NULL;
1640 SvREFCNT_dec(PL_main_cv);
1641 PL_main_cv = NULL;
1642
1643 time(&PL_basetime);
1644 oldscope = PL_scopestack_ix;
1645 PL_dowarn = G_WARN_OFF;
1646
1647 JMPENV_PUSH(ret);
1648 switch (ret) {
1649 case 0:
1650 parse_body(env,xsinit);
1651 if (PL_unitcheckav)
1652 call_list(oldscope, PL_unitcheckav);
1653 if (PL_checkav)
1654 call_list(oldscope, PL_checkav);
1655 ret = 0;
1656 break;
1657 case 1:
1658 STATUS_ALL_FAILURE;
1659
1660 case 2:
1661
1662 while (PL_scopestack_ix > oldscope)
1663 LEAVE;
1664 FREETMPS;
1665 PL_curstash = PL_defstash;
1666 if (PL_unitcheckav)
1667 call_list(oldscope, PL_unitcheckav);
1668 if (PL_checkav)
1669 call_list(oldscope, PL_checkav);
1670 ret = STATUS_EXIT;
1671 break;
1672 case 3:
1673 PerlIO_printf(Perl_error_log, "panic: top_env\n");
1674 ret = 1;
1675 break;
1676 }
1677 JMPENV_POP;
1678 return ret;
1679}
1680
1681STATIC void *
1682S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
1683{
1684 dVAR;
1685 PerlIO *rsfp;
1686 int argc = PL_origargc;
1687 char **argv = PL_origargv;
1688 const char *scriptname = NULL;
1689 VOL bool dosearch = FALSE;
1690 const char *validarg = "";
1691 register SV *sv;
1692 register char c;
1693 const char *cddir = NULL;
1694#ifdef USE_SITECUSTOMIZE
1695 bool minus_f = FALSE;
1696#endif
1697 SV *linestr_sv = newSV_type(SVt_PVIV);
1698 bool add_read_e_script = FALSE;
1699
1700 SvGROW(linestr_sv, 80);
1701 sv_setpvn(linestr_sv,"",0);
1702
1703 sv = newSVpvs("");
1704 SAVEFREESV(sv);
1705 init_main_stash();
1706
1707 {
1708 const char *s;
1709 for (argc--,argv++; argc > 0; argc--,argv++) {
1710 if (argv[0][0] != '-' || !argv[0][1])
1711 break;
1712#ifdef DOSUID
1713 if (*validarg)
1714 validarg = " PHOOEY ";
1715 else
1716 validarg = argv[0];
1717
1718
1719
1720
1721
1722
1723#endif
1724 s = argv[0]+1;
1725 reswitch:
1726 switch ((c = *s)) {
1727 case 'C':
1728#ifndef PERL_STRICT_CR
1729 case '\r':
1730#endif
1731 case ' ':
1732 case '0':
1733 case 'F':
1734 case 'a':
1735 case 'c':
1736 case 'd':
1737 case 'D':
1738 case 'h':
1739 case 'i':
1740 case 'l':
1741 case 'M':
1742 case 'm':
1743 case 'n':
1744 case 'p':
1745 case 's':
1746 case 'u':
1747 case 'U':
1748 case 'v':
1749 case 'W':
1750 case 'X':
1751 case 'w':
1752 if ((s = moreswitches(s)))
1753 goto reswitch;
1754 break;
1755
1756 case 't':
1757 CHECK_MALLOC_TOO_LATE_FOR('t');
1758 if( !PL_tainting ) {
1759 PL_taint_warn = TRUE;
1760 PL_tainting = TRUE;
1761 }
1762 s++;
1763 goto reswitch;
1764 case 'T':
1765 CHECK_MALLOC_TOO_LATE_FOR('T');
1766 PL_tainting = TRUE;
1767 PL_taint_warn = FALSE;
1768 s++;
1769 goto reswitch;
1770
1771 case 'E':
1772 PL_minus_E = TRUE;
1773
1774 case 'e':
1775#ifdef MACOS_TRADITIONAL
1776
1777 if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
1778 break;
1779#endif
1780 forbid_setid('e', -1);
1781 if (!PL_e_script) {
1782 PL_e_script = newSVpvs("");
1783 add_read_e_script = TRUE;
1784 }
1785 if (*++s)
1786 sv_catpv(PL_e_script, s);
1787 else if (argv[1]) {
1788 sv_catpv(PL_e_script, argv[1]);
1789 argc--,argv++;
1790 }
1791 else
1792 Perl_croak(aTHX_ "No code specified for -%c", c);
1793 sv_catpvs(PL_e_script, "\n");
1794 break;
1795
1796 case 'f':
1797#ifdef USE_SITECUSTOMIZE
1798 minus_f = TRUE;
1799#endif
1800 s++;
1801 goto reswitch;
1802
1803 case 'I':
1804 forbid_setid('I', -1);
1805 if (!*++s && (s=argv[1]) != NULL) {
1806 argc--,argv++;
1807 }
1808 if (s && *s) {
1809 STRLEN len = strlen(s);
1810 const char * const p = savepvn(s, len);
1811 incpush(p, TRUE, TRUE, FALSE, FALSE);
1812 sv_catpvs(sv, "-I");
1813 sv_catpvn(sv, p, len);
1814 sv_catpvs(sv, " ");
1815 Safefree(p);
1816 }
1817 else
1818 Perl_croak(aTHX_ "No directory specified for -I");
1819 break;
1820 case 'P':
1821 forbid_setid('P', -1);
1822 PL_preprocess = TRUE;
1823 s++;
1824 deprecate("-P");
1825 goto reswitch;
1826 case 'S':
1827 forbid_setid('S', -1);
1828 dosearch = TRUE;
1829 s++;
1830 goto reswitch;
1831 case 'V':
1832 {
1833 SV *opts_prog;
1834
1835 Perl_av_create_and_push(aTHX_ &PL_preambleav, newSVpvs("use Config;"));
1836 if (*++s != ':') {
1837
1838
1839 opts_prog = Perl_newSVpv(aTHX_ "$_ = join ' ', sort qw("
1840# ifdef DEBUGGING
1841 " DEBUGGING"
1842# endif
1843# ifdef NO_MATHOMS
1844 " NO_MATHOMS"
1845# endif
1846# ifdef PERL_DONT_CREATE_GVSV
1847 " PERL_DONT_CREATE_GVSV"
1848# endif
1849# ifdef PERL_MALLOC_WRAP
1850 " PERL_MALLOC_WRAP"
1851# endif
1852# ifdef PERL_MEM_LOG
1853 " PERL_MEM_LOG"
1854# endif
1855# ifdef PERL_MEM_LOG_ENV
1856 " PERL_MEM_LOG_ENV"
1857# endif
1858# ifdef PERL_MEM_LOG_ENV_FD
1859 " PERL_MEM_LOG_ENV_FD"
1860# endif
1861# ifdef PERL_MEM_LOG_STDERR
1862 " PERL_MEM_LOG_STDERR"
1863# endif
1864# ifdef PERL_MEM_LOG_TIMESTAMP
1865 " PERL_MEM_LOG_TIMESTAMP"
1866# endif
1867# ifdef PERL_USE_SAFE_PUTENV
1868 " PERL_USE_SAFE_PUTENV"
1869# endif
1870# ifdef USE_SITECUSTOMIZE
1871 " USE_SITECUSTOMIZE"
1872# endif
1873 , 0);
1874
1875 sv_catpv(opts_prog, PL_bincompat_options);
1876
1877 sv_catpvs(opts_prog, "); s/(?=.{53})(.{1,53}) /$1\\n /mg;print Config::myconfig(),");
1878#ifdef VMS
1879 sv_catpvs(opts_prog,"\"\\nCharacteristics of this PERLSHR image: \\n");
1880#else
1881 sv_catpvs(opts_prog,"\"\\nCharacteristics of this binary (from libperl): \\n");
1882#endif
1883
1884 sv_catpvs(opts_prog," Compile-time options: $_\\n\",");
1885
1886#if defined(LOCAL_PATCH_COUNT)
1887 if (LOCAL_PATCH_COUNT > 0) {
1888 int i;
1889 sv_catpvs(opts_prog,
1890 "\" Locally applied patches:\\n\",");
1891 for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1892 if (PL_localpatches[i])
1893 Perl_sv_catpvf(aTHX_ opts_prog,"q%c\t%s\n%c,",
1894 0, PL_localpatches[i], 0);
1895 }
1896 }
1897#endif
1898 Perl_sv_catpvf(aTHX_ opts_prog,
1899 "\" Built under %s\\n",OSNAME);
1900#ifdef __DATE__
1901# ifdef __TIME__
1902 Perl_sv_catpvf(aTHX_ opts_prog,
1903 " Compiled at %s %s\\n\"",__DATE__,
1904 __TIME__);
1905# else
1906 Perl_sv_catpvf(aTHX_ opts_prog," Compiled on %s\\n\"",
1907 __DATE__);
1908# endif
1909#endif
1910 sv_catpvs(opts_prog, "; $\"=\"\\n \"; "
1911 "@env = map { \"$_=\\\"$ENV{$_}\\\"\" } "
1912 "sort grep {/^PERL/} keys %ENV; ");
1913#ifdef __CYGWIN__
1914 sv_catpvs(opts_prog,
1915 "push @env, \"CYGWIN=\\\"$ENV{CYGWIN}\\\"\";");
1916#endif
1917 sv_catpvs(opts_prog,
1918 "print \" \\%ENV:\\n @env\\n\" if @env;"
1919 "print \" \\@INC:\\n @INC\\n\";");
1920 }
1921 else {
1922 ++s;
1923 opts_prog = Perl_newSVpvf(aTHX_
1924 "Config::config_vars(qw%c%s%c)",
1925 0, s, 0);
1926 s += strlen(s);
1927 }
1928 av_push(PL_preambleav, opts_prog);
1929
1930 scriptname = BIT_BUCKET;
1931 goto reswitch;
1932 }
1933 case 'x':
1934 PL_doextract = TRUE;
1935 s++;
1936 if (*s)
1937 cddir = s;
1938 break;
1939 case 0:
1940 break;
1941 case '-':
1942 if (!*++s || isSPACE(*s)) {
1943 argc--,argv++;
1944 goto switch_end;
1945 }
1946
1947 if (strEQ(s, "version")) {
1948 s = (char *)"v";
1949 goto reswitch;
1950 }
1951 if (strEQ(s, "help")) {
1952 s = (char *)"h";
1953 goto reswitch;
1954 }
1955 s--;
1956
1957 default:
1958 Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
1959 }
1960 }
1961 }
1962
1963 switch_end:
1964
1965 {
1966 char *s;
1967
1968 if (
1969#ifndef SECURE_INTERNAL_GETENV
1970 !PL_tainting &&
1971#endif
1972 (s = PerlEnv_getenv("PERL5OPT")))
1973 {
1974 const char *popt = s;
1975 while (isSPACE(*s))
1976 s++;
1977 if (*s == '-' && *(s+1) == 'T') {
1978 CHECK_MALLOC_TOO_LATE_FOR('T');
1979 PL_tainting = TRUE;
1980 PL_taint_warn = FALSE;
1981 }
1982 else {
1983 char *popt_copy = NULL;
1984 while (s && *s) {
1985 char *d;
1986 while (isSPACE(*s))
1987 s++;
1988 if (*s == '-') {
1989 s++;
1990 if (isSPACE(*s))
1991 continue;
1992 }
1993 d = s;
1994 if (!*s)
1995 break;
1996 if (!strchr("CDIMUdmtw", *s))
1997 Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
1998 while (++s && *s) {
1999 if (isSPACE(*s)) {
2000 if (!popt_copy) {
2001 popt_copy = SvPVX(sv_2mortal(newSVpv(popt,0)));
2002 s = popt_copy + (s - popt);
2003 d = popt_copy + (d - popt);
2004 }
2005 *s++ = '\0';
2006 break;
2007 }
2008 }
2009 if (*d == 't') {
2010 if( !PL_tainting ) {
2011 PL_taint_warn = TRUE;
2012 PL_tainting = TRUE;
2013 }
2014 } else {
2015 moreswitches(d);
2016 }
2017 }
2018 }
2019 }
2020 }
2021
2022#ifdef USE_SITECUSTOMIZE
2023 if (!minus_f) {
2024 (void)Perl_av_create_and_unshift_one(aTHX_ &PL_preambleav,
2025 Perl_newSVpvf(aTHX_ "BEGIN { do '%s/sitecustomize.pl' }", SITELIB_EXP));
2026 }
2027#endif
2028
2029 if (!scriptname)
2030 scriptname = argv[0];
2031 if (PL_e_script) {
2032 argc++,argv--;
2033 scriptname = BIT_BUCKET;
2034 }
2035 else if (scriptname == NULL) {
2036#ifdef MSDOS
2037 if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
2038 moreswitches("h");
2039#endif
2040 scriptname = "-";
2041 }
2042
2043
2044 assert (!PL_tainted);
2045 TAINT;
2046 S_set_caret_X(aTHX);
2047 TAINT_NOT;
2048 init_perllib();
2049
2050 {
2051 int suidscript;
2052 const int fdscript
2053 = open_script(scriptname, dosearch, sv, &suidscript, &rsfp);
2054
2055 validate_suid(validarg, scriptname, fdscript, suidscript,
2056 linestr_sv, rsfp);
2057
2058#ifndef PERL_MICRO
2059# if defined(SIGCHLD) || defined(SIGCLD)
2060 {
2061# ifndef SIGCHLD
2062# define SIGCHLD SIGCLD
2063# endif
2064 Sighandler_t sigstate = rsignal_state(SIGCHLD);
2065 if (sigstate == (Sighandler_t) SIG_IGN) {
2066 if (ckWARN(WARN_SIGNAL))
2067 Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
2068 "Can't ignore signal CHLD, forcing to default");
2069 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
2070 }
2071 }
2072# endif
2073#endif
2074
2075 if (PL_doextract
2076#ifdef MACOS_TRADITIONAL
2077 || gMacPerl_AlwaysExtract
2078#endif
2079 ) {
2080
2081
2082
2083 forbid_setid('x', suidscript);
2084
2085
2086 find_beginning(linestr_sv, rsfp);
2087 if (cddir && PerlDir_chdir( (char *)cddir ) < 0)
2088 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
2089 }
2090 }
2091
2092 PL_main_cv = PL_compcv = (CV*)newSV_type(SVt_PVCV);
2093 CvUNIQUE_on(PL_compcv);
2094
2095 CvPADLIST(PL_compcv) = pad_new(0);
2096
2097 PL_isarev = newHV();
2098
2099 boot_core_PerlIO();
2100 boot_core_UNIVERSAL();
2101 boot_core_xsutils();
2102 boot_core_mro();
2103
2104 if (xsinit)
2105 (*xsinit)(aTHX);
2106#ifndef PERL_MICRO
2107#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC) || defined(SYMBIAN)
2108 init_os_extras();
2109#endif
2110#endif
2111
2112#ifdef USE_SOCKS
2113# ifdef HAS_SOCKS5_INIT
2114 socks5_init(argv[0]);
2115# else
2116 SOCKSinit(argv[0]);
2117# endif
2118#endif
2119
2120 init_predump_symbols();
2121
2122
2123
2124 if (!PL_do_undump)
2125 init_postdump_symbols(argc,argv,env);
2126
2127
2128
2129
2130
2131#if defined(__SYMBIAN32__)
2132 PL_unicode = PERL_UNICODE_STD_FLAG;
2133#endif
2134 if (PL_unicode) {
2135
2136 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
2137 IO* io;
2138 PerlIO* fp;
2139 SV* sv;
2140
2141
2142
2143 if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
2144 PL_stdingv && (io = GvIO(PL_stdingv)) &&
2145 (fp = IoIFP(io)))
2146 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2147 if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
2148 PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
2149 (fp = IoOFP(io)))
2150 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2151 if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
2152 PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
2153 (fp = IoOFP(io)))
2154 PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2155 if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
2156 (sv = GvSV(gv_fetchpvs("\017PEN", GV_ADD|GV_NOTQUAL,
2157 SVt_PV)))) {
2158 U32 in = PL_unicode & PERL_UNICODE_IN_FLAG;
2159 U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
2160 if (in) {
2161 if (out)
2162 sv_setpvn(sv, ":utf8\0:utf8", 11);
2163 else
2164 sv_setpvn(sv, ":utf8\0", 6);
2165 }
2166 else if (out)
2167 sv_setpvn(sv, "\0:utf8", 6);
2168 SvSETMAGIC(sv);
2169 }
2170 }
2171 }
2172
2173 {
2174 const char *s;
2175 if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
2176 if (strEQ(s, "unsafe"))
2177 PL_signals |= PERL_SIGNALS_UNSAFE_FLAG;
2178 else if (strEQ(s, "safe"))
2179 PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
2180 else
2181 Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
2182 }
2183 }
2184
2185#ifdef PERL_MAD
2186 {
2187 const char *s;
2188 if ((s = PerlEnv_getenv("PERL_XMLDUMP"))) {
2189 PL_madskills = 1;
2190 PL_minus_c = 1;
2191 if (!s || !s[0])
2192 PL_xmlfp = PerlIO_stdout();
2193 else {
2194 PL_xmlfp = PerlIO_open(s, "w");
2195 if (!PL_xmlfp)
2196 Perl_croak(aTHX_ "Can't open %s", s);
2197 }
2198 my_setenv("PERL_XMLDUMP", NULL);
2199 }
2200 }
2201
2202 {
2203 const char *s;
2204 if ((s = PerlEnv_getenv("PERL_MADSKILLS"))) {
2205 PL_madskills = atoi(s);
2206 my_setenv("PERL_MADSKILLS", NULL);
2207 }
2208 }
2209#endif
2210
2211 lex_start(linestr_sv, rsfp, TRUE);
2212 PL_subname = newSVpvs("main");
2213
2214 if (add_read_e_script)
2215 filter_add(read_e_script, NULL);
2216
2217
2218
2219 SETERRNO(0,SS_NORMAL);
2220#ifdef MACOS_TRADITIONAL
2221 if (gMacPerl_SyntaxError = (yyparse() || PL_parser->error_count)) {
2222 if (PL_minus_c)
2223 Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
2224 else {
2225 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
2226 MacPerl_MPWFileName(PL_origfilename));
2227 }
2228 }
2229#else
2230 if (yyparse() || PL_parser->error_count) {
2231 if (PL_minus_c)
2232 Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
2233 else {
2234 Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
2235 PL_origfilename);
2236 }
2237 }
2238#endif
2239 CopLINE_set(PL_curcop, 0);
2240 PL_curstash = PL_defstash;
2241 PL_preprocess = FALSE;
2242 if (PL_e_script) {
2243 SvREFCNT_dec(PL_e_script);
2244 PL_e_script = NULL;
2245 }
2246
2247 if (PL_do_undump)
2248 my_unexec();
2249
2250 if (isWARN_ONCE) {
2251 SAVECOPFILE(PL_curcop);
2252 SAVECOPLINE(PL_curcop);
2253 gv_check(PL_defstash);
2254 }
2255
2256 LEAVE;
2257 FREETMPS;
2258
2259#ifdef MYMALLOC
2260 {
2261 const char *s;
2262 if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
2263 dump_mstats("after compilation:");
2264 }
2265#endif
2266
2267 ENTER;
2268 PL_restartop = 0;
2269 return NULL;
2270}
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280int
2281perl_run(pTHXx)
2282{
2283 dVAR;
2284 I32 oldscope;
2285 int ret = 0;
2286 dJMPENV;
2287
2288 PERL_UNUSED_ARG(my_perl);
2289
2290 oldscope = PL_scopestack_ix;
2291#ifdef VMS
2292 VMSISH_HUSHED = 0;
2293#endif
2294
2295 JMPENV_PUSH(ret);
2296 switch (ret) {
2297 case 1:
2298 cxstack_ix = -1;
2299 goto redo_body;
2300 case 0:
2301 redo_body:
2302 run_body(oldscope);
2303
2304 case 2:
2305 while (PL_scopestack_ix > oldscope)
2306 LEAVE;
2307 FREETMPS;
2308 PL_curstash = PL_defstash;
2309 if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
2310 PL_endav && !PL_minus_c)
2311 call_list(oldscope, PL_endav);
2312#ifdef MYMALLOC
2313 if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
2314 dump_mstats("after execution: ");
2315#endif
2316 ret = STATUS_EXIT;
2317 break;
2318 case 3:
2319 if (PL_restartop) {
2320 POPSTACK_TO(PL_mainstack);
2321 goto redo_body;
2322 }
2323 PerlIO_printf(Perl_error_log, "panic: restartop\n");
2324 FREETMPS;
2325 ret = 1;
2326 break;
2327 }
2328
2329 JMPENV_POP;
2330 return ret;
2331}
2332
2333STATIC void
2334S_run_body(pTHX_ I32 oldscope)
2335{
2336 dVAR;
2337 DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
2338 PL_sawampersand ? "Enabling" : "Omitting"));
2339
2340 if (!PL_restartop) {
2341#ifdef PERL_MAD
2342 if (PL_xmlfp) {
2343 xmldump_all();
2344 exit(0);
2345 }
2346#endif
2347 DEBUG_x(dump_all());
2348#ifdef DEBUGGING
2349 if (!DEBUG_q_TEST)
2350 PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
2351#endif
2352 DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
2353 PTR2UV(thr)));
2354
2355 if (PL_minus_c) {
2356#ifdef MACOS_TRADITIONAL
2357 PerlIO_printf(Perl_error_log, "%s%s syntax OK\n",
2358 (gMacPerl_ErrorFormat ? "# " : ""),
2359 MacPerl_MPWFileName(PL_origfilename));
2360#else
2361 PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
2362#endif
2363 my_exit(0);
2364 }
2365 if (PERLDB_SINGLE && PL_DBsingle)
2366 sv_setiv(PL_DBsingle, 1);
2367 if (PL_initav)
2368 call_list(oldscope, PL_initav);
2369#ifdef PERL_DEBUG_READONLY_OPS
2370 Perl_pending_Slabs_to_ro(aTHX);
2371#endif
2372 }
2373
2374
2375
2376 if (PL_restartop) {
2377 PL_op = PL_restartop;
2378 PL_restartop = 0;
2379 CALLRUNOPS(aTHX);
2380 }
2381 else if (PL_main_start) {
2382 CvDEPTH(PL_main_cv) = 1;
2383 PL_op = PL_main_start;
2384 CALLRUNOPS(aTHX);
2385 }
2386 my_exit(0);
2387
2388}
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402SV*
2403Perl_get_sv(pTHX_ const char *name, I32 create)
2404{
2405 GV *gv;
2406 gv = gv_fetchpv(name, create, SVt_PV);
2407 if (gv)
2408 return GvSV(gv);
2409 return NULL;
2410}
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424AV*
2425Perl_get_av(pTHX_ const char *name, I32 create)
2426{
2427 GV* const gv = gv_fetchpv(name, create, SVt_PVAV);
2428 if (create)
2429 return GvAVn(gv);
2430 if (gv)
2431 return GvAV(gv);
2432 return NULL;
2433}
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447HV*
2448Perl_get_hv(pTHX_ const char *name, I32 create)
2449{
2450 GV* const gv = gv_fetchpv(name, create, SVt_PVHV);
2451 if (create)
2452 return GvHVn(gv);
2453 if (gv)
2454 return GvHV(gv);
2455 return NULL;
2456}
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476CV*
2477Perl_get_cvn_flags(pTHX_ const char *name, STRLEN len, I32 flags)
2478{
2479 GV* const gv = gv_fetchpvn_flags(name, len, flags, SVt_PVCV);
2480
2481
2482
2483 if ((flags & ~GV_NOADD_MASK) && !GvCVu(gv)) {
2484 SV *const sv = newSVpvn(name,len);
2485 SvFLAGS(sv) |= flags & SVf_UTF8;
2486 return newSUB(start_subparse(FALSE, 0),
2487 newSVOP(OP_CONST, 0, sv),
2488 NULL, NULL);
2489 }
2490 if (gv)
2491 return GvCVu(gv);
2492 return NULL;
2493}
2494
2495CV*
2496Perl_get_cv(pTHX_ const char *name, I32 flags)
2497{
2498 return get_cvn_flags(name, strlen(name), flags);
2499}
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514I32
2515Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
2516
2517
2518
2519{
2520 dVAR;
2521 dSP;
2522
2523 PUSHMARK(SP);
2524 if (argv) {
2525 while (*argv) {
2526 XPUSHs(sv_2mortal(newSVpv(*argv,0)));
2527 argv++;
2528 }
2529 PUTBACK;
2530 }
2531 return call_pv(sub_name, flags);
2532}
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542I32
2543Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
2544
2545
2546{
2547 return call_sv((SV*)get_cv(sub_name, TRUE), flags);
2548}
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559I32
2560Perl_call_method(pTHX_ const char *methname, I32 flags)
2561
2562
2563{
2564 return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
2565}
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577I32
2578Perl_call_sv(pTHX_ SV *sv, I32 flags)
2579
2580{
2581 dVAR; dSP;
2582 LOGOP myop;
2583 UNOP method_op;
2584 I32 oldmark;
2585 VOL I32 retval = 0;
2586 I32 oldscope;
2587 bool oldcatch = CATCH_GET;
2588 int ret;
2589 OP* const oldop = PL_op;
2590 dJMPENV;
2591
2592 if (flags & G_DISCARD) {
2593 ENTER;
2594 SAVETMPS;
2595 }
2596
2597 Zero(&myop, 1, LOGOP);
2598 myop.op_next = NULL;
2599 if (!(flags & G_NOARGS))
2600 myop.op_flags |= OPf_STACKED;
2601 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
2602 (flags & G_ARRAY) ? OPf_WANT_LIST :
2603 OPf_WANT_SCALAR);
2604 SAVEOP();
2605 PL_op = (OP*)&myop;
2606
2607 EXTEND(PL_stack_sp, 1);
2608 *++PL_stack_sp = sv;
2609 oldmark = TOPMARK;
2610 oldscope = PL_scopestack_ix;
2611
2612 if (PERLDB_SUB && PL_curstash != PL_debstash
2613
2614 && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
2615
2616
2617 && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
2618 && !(flags & G_NODEBUG))
2619 PL_op->op_private |= OPpENTERSUB_DB;
2620
2621 if (flags & G_METHOD) {
2622 Zero(&method_op, 1, UNOP);
2623 method_op.op_next = PL_op;
2624 method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
2625 myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
2626 PL_op = (OP*)&method_op;
2627 }
2628
2629 if (!(flags & G_EVAL)) {
2630 CATCH_SET(TRUE);
2631 CALL_BODY_SUB((OP*)&myop);
2632 retval = PL_stack_sp - (PL_stack_base + oldmark);
2633 CATCH_SET(oldcatch);
2634 }
2635 else {
2636 myop.op_other = (OP*)&myop;
2637 PL_markstack_ptr--;
2638 create_eval_scope(flags|G_FAKINGEVAL);
2639 PL_markstack_ptr++;
2640
2641 JMPENV_PUSH(ret);
2642
2643 switch (ret) {
2644 case 0:
2645 redo_body:
2646 CALL_BODY_SUB((OP*)&myop);
2647 retval = PL_stack_sp - (PL_stack_base + oldmark);
2648 if (!(flags & G_KEEPERR))
2649 sv_setpvn(ERRSV,"",0);
2650 break;
2651 case 1:
2652 STATUS_ALL_FAILURE;
2653
2654 case 2:
2655
2656 PL_curstash = PL_defstash;
2657 FREETMPS;
2658 JMPENV_POP;
2659 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2660 Perl_croak(aTHX_ "Callback called exit");
2661 my_exit_jump();
2662
2663 case 3:
2664 if (PL_restartop) {
2665 PL_op = PL_restartop;
2666 PL_restartop = 0;
2667 goto redo_body;
2668 }
2669 PL_stack_sp = PL_stack_base + oldmark;
2670 if (flags & G_ARRAY)
2671 retval = 0;
2672 else {
2673 retval = 1;
2674 *++PL_stack_sp = &PL_sv_undef;
2675 }
2676 break;
2677 }
2678
2679 if (PL_scopestack_ix > oldscope)
2680 delete_eval_scope();
2681 JMPENV_POP;
2682 }
2683
2684 if (flags & G_DISCARD) {
2685 PL_stack_sp = PL_stack_base + oldmark;
2686 retval = 0;
2687 FREETMPS;
2688 LEAVE;
2689 }
2690 PL_op = oldop;
2691 return retval;
2692}
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704I32
2705Perl_eval_sv(pTHX_ SV *sv, I32 flags)
2706
2707
2708{
2709 dVAR;
2710 dSP;
2711 UNOP myop;
2712 VOL I32 oldmark = SP - PL_stack_base;
2713 VOL I32 retval = 0;
2714 int ret;
2715 OP* const oldop = PL_op;
2716 dJMPENV;
2717
2718 if (flags & G_DISCARD) {
2719 ENTER;
2720 SAVETMPS;
2721 }
2722
2723 SAVEOP();
2724 PL_op = (OP*)&myop;
2725 Zero(PL_op, 1, UNOP);
2726 EXTEND(PL_stack_sp, 1);
2727 *++PL_stack_sp = sv;
2728
2729 if (!(flags & G_NOARGS))
2730 myop.op_flags = OPf_STACKED;
2731 myop.op_next = NULL;
2732 myop.op_type = OP_ENTEREVAL;
2733 myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
2734 (flags & G_ARRAY) ? OPf_WANT_LIST :
2735 OPf_WANT_SCALAR);
2736 if (flags & G_KEEPERR)
2737 myop.op_flags |= OPf_SPECIAL;
2738
2739
2740
2741 TAINT_PROPER("eval_sv()");
2742
2743 JMPENV_PUSH(ret);
2744 switch (ret) {
2745 case 0:
2746 redo_body:
2747 CALL_BODY_EVAL((OP*)&myop);
2748 retval = PL_stack_sp - (PL_stack_base + oldmark);
2749 if (!(flags & G_KEEPERR))
2750 sv_setpvn(ERRSV,"",0);
2751 break;
2752 case 1:
2753 STATUS_ALL_FAILURE;
2754
2755 case 2:
2756
2757 PL_curstash = PL_defstash;
2758 FREETMPS;
2759 JMPENV_POP;
2760 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
2761 Perl_croak(aTHX_ "Callback called exit");
2762 my_exit_jump();
2763
2764 case 3:
2765 if (PL_restartop) {
2766 PL_op = PL_restartop;
2767 PL_restartop = 0;
2768 goto redo_body;
2769 }
2770 PL_stack_sp = PL_stack_base + oldmark;
2771 if (flags & G_ARRAY)
2772 retval = 0;
2773 else {
2774 retval = 1;
2775 *++PL_stack_sp = &PL_sv_undef;
2776 }
2777 break;
2778 }
2779
2780 JMPENV_POP;
2781 if (flags & G_DISCARD) {
2782 PL_stack_sp = PL_stack_base + oldmark;
2783 retval = 0;
2784 FREETMPS;
2785 LEAVE;
2786 }
2787 PL_op = oldop;
2788 return retval;
2789}
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799SV*
2800Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
2801{
2802 dVAR;
2803 dSP;
2804 SV* sv = newSVpv(p, 0);
2805
2806 eval_sv(sv, G_SCALAR);
2807 SvREFCNT_dec(sv);
2808
2809 SPAGAIN;
2810 sv = POPs;
2811 PUTBACK;
2812
2813 if (croak_on_error && SvTRUE(ERRSV)) {
2814 Perl_croak(aTHX_ SvPVx_nolen_const(ERRSV));
2815 }
2816
2817 return sv;
2818}
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833void
2834Perl_require_pv(pTHX_ const char *pv)
2835{
2836 dVAR;
2837 dSP;
2838 SV* sv;
2839 PUSHSTACKi(PERLSI_REQUIRE);
2840 PUTBACK;
2841 sv = Perl_newSVpvf(aTHX_ "require q%c%s%c", 0, pv, 0);
2842 eval_sv(sv_2mortal(sv), G_DISCARD);
2843 SPAGAIN;
2844 POPSTACK;
2845}
2846
2847void
2848Perl_magicname(pTHX_ const char *sym, const char *name, I32 namlen)
2849{
2850 register GV * const gv = gv_fetchpv(sym, GV_ADD, SVt_PV);
2851
2852 if (gv)
2853 sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, namlen);
2854}
2855
2856STATIC void
2857S_usage(pTHX_ const char *name)
2858{
2859
2860
2861
2862 static const char * const usage_msg[] = {
2863"-0[octal] specify record separator (\\0, if no argument)",
2864"-a autosplit mode with -n or -p (splits $_ into @F)",
2865"-C[number/list] enables the listed Unicode features",
2866"-c check syntax only (runs BEGIN and CHECK blocks)",
2867"-d[:debugger] run program under debugger",
2868"-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
2869"-e program one line of program (several -e's allowed, omit programfile)",
2870"-E program like -e, but enables all optional features",
2871"-f don't do $sitelib/sitecustomize.pl at startup",
2872"-F/pattern/ split() pattern for -a switch (//'s are optional)",
2873"-i[extension] edit <> files in place (makes backup if extension supplied)",
2874"-Idirectory specify @INC/#include directory (several -I's allowed)",
2875"-l[octal] enable line ending processing, specifies line terminator",
2876"-[mM][-]module execute \"use/no module...\" before executing program",
2877"-n assume \"while (<>) { ... }\" loop around program",
2878"-p assume loop like -n but print line also, like sed",
2879"-P run program through C preprocessor before compilation",
2880"-s enable rudimentary parsing for switches after programfile",
2881"-S look for programfile using PATH environment variable",
2882"-t enable tainting warnings",
2883"-T enable tainting checks",
2884"-u dump core after parsing program",
2885"-U allow unsafe operations",
2886"-v print version, subversion (includes VERY IMPORTANT perl info)",
2887"-V[:variable] print configuration summary (or a single Config.pm variable)",
2888"-w enable many useful warnings (RECOMMENDED)",
2889"-W enable all warnings",
2890"-x[directory] strip off text before #!perl line and perhaps cd to directory",
2891"-X disable all warnings",
2892"\n",
2893NULL
2894};
2895 const char * const *p = usage_msg;
2896
2897 PerlIO_printf(PerlIO_stdout(),
2898 "\nUsage: %s [switches] [--] [programfile] [arguments]",
2899 name);
2900 while (*p)
2901 PerlIO_printf(PerlIO_stdout(), "\n %s", *p++);
2902}
2903
2904
2905
2906
2907#ifdef DEBUGGING
2908int
2909Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
2910{
2911 static const char * const usage_msgd[] = {
2912 " Debugging flag values: (see also -d)",
2913 " p Tokenizing and parsing (with v, displays parse stack)",
2914 " s Stack snapshots (with v, displays all stacks)",
2915 " l Context (loop) stack processing",
2916 " t Trace execution",
2917 " o Method and overloading resolution",
2918 " c String/numeric conversions",
2919 " P Print profiling info, preprocessor command for -P, source file input state",
2920 " m Memory allocation",
2921 " f Format processing",
2922 " r Regular expression parsing and execution",
2923 " x Syntax tree dump",
2924 " u Tainting checks",
2925 " H Hash dump -- usurps values()",
2926 " X Scratchpad allocation",
2927 " D Cleaning up",
2928 " S Thread synchronization",
2929 " T Tokenising",
2930 " R Include reference counts of dumped variables (eg when using -Ds)",
2931 " J Do not s,t,P-debug (Jump over) opcodes within package DB",
2932 " v Verbose: use in conjunction with other flags",
2933 " C Copy On Write",
2934 " A Consistency checks on internal structures",
2935 " q quiet - currently only suppresses the 'EXECUTING' message",
2936 NULL
2937 };
2938 int i = 0;
2939 if (isALPHA(**s)) {
2940
2941 static const char debopts[] = "psltocPmfrxuUHXDSTRJvCAq";
2942
2943 for (; isALNUM(**s); (*s)++) {
2944 const char * const d = strchr(debopts,**s);
2945 if (d)
2946 i |= 1 << (d - debopts);
2947 else if (ckWARN_d(WARN_DEBUGGING))
2948 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2949 "invalid option -D%c, use -D'' to see choices\n", **s);
2950 }
2951 }
2952 else if (isDIGIT(**s)) {
2953 i = atoi(*s);
2954 for (; isALNUM(**s); (*s)++) ;
2955 }
2956 else if (givehelp) {
2957 const char *const *p = usage_msgd;
2958 while (*p) PerlIO_printf(PerlIO_stdout(), "%s\n", *p++);
2959 }
2960# ifdef EBCDIC
2961 if ((i & DEBUG_p_FLAG) && ckWARN_d(WARN_DEBUGGING))
2962 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
2963 "-Dp not implemented on this platform\n");
2964# endif
2965 return i;
2966}
2967#endif
2968
2969
2970
2971const char *
2972Perl_moreswitches(pTHX_ const char *s)
2973{
2974 dVAR;
2975 UV rschar;
2976
2977 switch (*s) {
2978 case '0':
2979 {
2980 I32 flags = 0;
2981 STRLEN numlen;
2982
2983 SvREFCNT_dec(PL_rs);
2984 if (s[1] == 'x' && s[2]) {
2985 const char *e = s+=2;
2986 U8 *tmps;
2987
2988 while (*e)
2989 e++;
2990 numlen = e - s;
2991 flags = PERL_SCAN_SILENT_ILLDIGIT;
2992 rschar = (U32)grok_hex(s, &numlen, &flags, NULL);
2993 if (s + numlen < e) {
2994 rschar = 0;
2995 numlen = 0;
2996 s--;
2997 }
2998 PL_rs = newSVpvs("");
2999 SvGROW(PL_rs, (STRLEN)(UNISKIP(rschar) + 1));
3000 tmps = (U8*)SvPVX(PL_rs);
3001 uvchr_to_utf8(tmps, rschar);
3002 SvCUR_set(PL_rs, UNISKIP(rschar));
3003 SvUTF8_on(PL_rs);
3004 }
3005 else {
3006 numlen = 4;
3007 rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
3008 if (rschar & ~((U8)~0))
3009 PL_rs = &PL_sv_undef;
3010 else if (!rschar && numlen >= 2)
3011 PL_rs = newSVpvs("");
3012 else {
3013 char ch = (char)rschar;
3014 PL_rs = newSVpvn(&ch, 1);
3015 }
3016 }
3017 sv_setsv(get_sv("/", TRUE), PL_rs);
3018 return s + numlen;
3019 }
3020 case 'C':
3021 s++;
3022 PL_unicode = parse_unicode_opts( (const char **)&s );
3023 if (PL_unicode & PERL_UNICODE_UTF8CACHEASSERT_FLAG)
3024 PL_utf8cache = -1;
3025 return s;
3026 case 'F':
3027 PL_minus_F = TRUE;
3028 PL_splitstr = ++s;
3029 while (*s && !isSPACE(*s)) ++s;
3030 PL_splitstr = savepvn(PL_splitstr, s - PL_splitstr);
3031 return s;
3032 case 'a':
3033 PL_minus_a = TRUE;
3034 s++;
3035 return s;
3036 case 'c':
3037 PL_minus_c = TRUE;
3038 s++;
3039 return s;
3040 case 'd':
3041 forbid_setid('d', -1);
3042 s++;
3043
3044
3045 if (*s == 't' && !isALNUM(s[1])) {
3046 ++s;
3047 my_setenv("PERL5DB_THREADED", "1");
3048 }
3049
3050
3051
3052 if (*s == ':' || *s == '=') {
3053 const char *start = ++s;
3054 const char *const end = s + strlen(s);
3055 SV * const sv = newSVpvs("use Devel::");
3056
3057
3058 while(isALNUM(*s) || *s==':') ++s;
3059 if (*s != '=')
3060 sv_catpvn(sv, start, end - start);
3061 else {
3062 sv_catpvn(sv, start, s-start);
3063
3064
3065 Perl_sv_catpvf(aTHX_ sv, " split(/,/,q{%s});", ++s);
3066 }
3067 s = end;
3068 my_setenv("PERL5DB", SvPV_nolen_const(sv));
3069 SvREFCNT_dec(sv);
3070 }
3071 if (!PL_perldb) {
3072 PL_perldb = PERLDB_ALL;
3073 init_debugger();
3074 }
3075 return s;
3076 case 'D':
3077 {
3078#ifdef DEBUGGING
3079 forbid_setid('D', -1);
3080 s++;
3081 PL_debug = get_debug_opts( (const char **)&s, 1) | DEBUG_TOP_FLAG;
3082#else
3083 if (ckWARN_d(WARN_DEBUGGING))
3084 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3085 "Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)\n");
3086 for (s++; isALNUM(*s); s++) ;
3087#endif
3088 return s;
3089 }
3090 case 'h':
3091 usage(PL_origargv[0]);
3092 my_exit(0);
3093 case 'i':
3094 Safefree(PL_inplace);
3095#if defined(__CYGWIN__)
3096 if (*(s+1) == '\0') {
3097 PL_inplace = savepvs(".bak");
3098 return s+1;
3099 }
3100#endif
3101 {
3102 const char * const start = ++s;
3103 while (*s && !isSPACE(*s))
3104 ++s;
3105
3106 PL_inplace = savepvn(start, s - start);
3107 }
3108 if (*s) {
3109 ++s;
3110 if (*s == '-')
3111 s++;
3112 }
3113 return s;
3114 case 'I':
3115 forbid_setid('I', -1);
3116 ++s;
3117 while (*s && isSPACE(*s))
3118 ++s;
3119 if (*s) {
3120 const char *e, *p;
3121 p = s;
3122
3123 do {
3124 for (e = p; *e && !isSPACE(*e); e++) ;
3125 p = e;
3126 while (isSPACE(*p))
3127 p++;
3128 } while (*p && *p != '-');
3129 e = savepvn(s, e-s);
3130 incpush(e, TRUE, TRUE, FALSE, FALSE);
3131 Safefree(e);
3132 s = p;
3133 if (*s == '-')
3134 s++;
3135 }
3136 else
3137 Perl_croak(aTHX_ "No directory specified for -I");
3138 return s;
3139 case 'l':
3140 PL_minus_l = TRUE;
3141 s++;
3142 if (PL_ors_sv) {
3143 SvREFCNT_dec(PL_ors_sv);
3144 PL_ors_sv = NULL;
3145 }
3146 if (isDIGIT(*s)) {
3147 I32 flags = 0;
3148 STRLEN numlen;
3149 PL_ors_sv = newSVpvs("\n");
3150 numlen = 3 + (*s == '0');
3151 *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
3152 s += numlen;
3153 }
3154 else {
3155 if (RsPARA(PL_rs)) {
3156 PL_ors_sv = newSVpvs("\n\n");
3157 }
3158 else {
3159 PL_ors_sv = newSVsv(PL_rs);
3160 }
3161 }
3162 return s;
3163 case 'M':
3164 forbid_setid('M', -1);
3165
3166 case 'm':
3167 forbid_setid('m', -1);
3168 if (*++s) {
3169 const char *start;
3170 const char *end;
3171 SV *sv;
3172 const char *use = "use ";
3173
3174
3175
3176 if (*s == '-') { use = " no "; ++s; }
3177 sv = newSVpvn(use,4);
3178 start = s;
3179
3180 while(isALNUM(*s) || *s==':') ++s;
3181 end = s + strlen(s);
3182 if (*s != '=') {
3183 sv_catpvn(sv, start, end - start);
3184 if (*(start-1) == 'm') {
3185 if (*s != '\0')
3186 Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
3187 sv_catpvs( sv, " ()");
3188 }
3189 } else {
3190 if (s == start)
3191 Perl_croak(aTHX_ "Module name required with -%c option",
3192 s[-1]);
3193 sv_catpvn(sv, start, s-start);
3194
3195 sv_catpvs(sv, " split(/,/,q\0");
3196 ++s;
3197 sv_catpvn(sv, s, end - s);
3198 sv_catpvs(sv, "\0)");
3199 }
3200 s = end;
3201 Perl_av_create_and_push(aTHX_ &PL_preambleav, sv);
3202 }
3203 else
3204 Perl_croak(aTHX_ "Missing argument to -%c", *(s-1));
3205 return s;
3206 case 'n':
3207 PL_minus_n = TRUE;
3208 s++;
3209 return s;
3210 case 'p':
3211 PL_minus_p = TRUE;
3212 s++;
3213 return s;
3214 case 's':
3215 forbid_setid('s', -1);
3216 PL_doswitches = TRUE;
3217 s++;
3218 return s;
3219 case 't':
3220 if (!PL_tainting)
3221 TOO_LATE_FOR('t');
3222 s++;
3223 return s;
3224 case 'T':
3225 if (!PL_tainting)
3226 TOO_LATE_FOR('T');
3227 s++;
3228 return s;
3229 case 'u':
3230#ifdef MACOS_TRADITIONAL
3231 Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
3232#endif
3233 PL_do_undump = TRUE;
3234 s++;
3235 return s;
3236 case 'U':
3237 PL_unsafe = TRUE;
3238 s++;
3239 return s;
3240 case 'v':
3241 if (!sv_derived_from(PL_patchlevel, "version"))
3242 upg_version(PL_patchlevel, TRUE);
3243#if !defined(DGUX)
3244 PerlIO_printf(PerlIO_stdout(),
3245 Perl_form(aTHX_ "\nThis is perl, %"SVf
3246#ifdef PERL_PATCHNUM
3247 " DEVEL" STRINGIFY(PERL_PATCHNUM)
3248#endif
3249 " built for %s",
3250 SVfARG(vstringify(PL_patchlevel)),
3251 ARCHNAME));
3252#else
3253
3254 PerlIO_printf(PerlIO_stdout(),
3255 Perl_form(aTHX_ "\nThis is perl, %"SVf"\n",
3256 SVfARG(vstringify(PL_patchlevel))));
3257 PerlIO_printf(PerlIO_stdout(),
3258 Perl_form(aTHX_ " built under %s at %s %s\n",
3259 OSNAME, __DATE__, __TIME__));
3260 PerlIO_printf(PerlIO_stdout(),
3261 Perl_form(aTHX_ " OS Specific Release: %s\n",
3262 OSVERS));
3263#endif
3264
3265#if defined(LOCAL_PATCH_COUNT)
3266 if (LOCAL_PATCH_COUNT > 0)
3267 PerlIO_printf(PerlIO_stdout(),
3268 "\n(with %d registered patch%s, "
3269 "see perl -V for more detail)",
3270 LOCAL_PATCH_COUNT,
3271 (LOCAL_PATCH_COUNT!=1) ? "es" : "");
3272#endif
3273
3274 PerlIO_printf(PerlIO_stdout(),
3275 "\n\nCopyright 1987-2007, Larry Wall\n");
3276#ifdef MACOS_TRADITIONAL
3277 PerlIO_printf(PerlIO_stdout(),
3278 "\nMac OS port Copyright 1991-2002, Matthias Neeracher;\n"
3279 "maintained by Chris Nandor\n");
3280#endif
3281#ifdef MSDOS
3282 PerlIO_printf(PerlIO_stdout(),
3283 "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
3284#endif
3285#ifdef DJGPP
3286 PerlIO_printf(PerlIO_stdout(),
3287 "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
3288 "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
3289#endif
3290#ifdef OS2
3291 PerlIO_printf(PerlIO_stdout(),
3292 "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
3293 "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
3294#endif
3295#ifdef atarist
3296 PerlIO_printf(PerlIO_stdout(),
3297 "atariST series port, ++jrb bammi@cadence.com\n");
3298#endif
3299#ifdef __BEOS__
3300 PerlIO_printf(PerlIO_stdout(),
3301 "BeOS port Copyright Tom Spindler, 1997-1999\n");
3302#endif
3303#ifdef MPE
3304 PerlIO_printf(PerlIO_stdout(),
3305 "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-2003\n");
3306#endif
3307#ifdef OEMVS
3308 PerlIO_printf(PerlIO_stdout(),
3309 "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
3310#endif
3311#ifdef __VOS__
3312 PerlIO_printf(PerlIO_stdout(),
3313 "Stratus VOS port by Paul.Green@stratus.com, 1997-2002\n");
3314#endif
3315#ifdef __OPEN_VM
3316 PerlIO_printf(PerlIO_stdout(),
3317 "VM/ESA port by Neale Ferguson, 1998-1999\n");
3318#endif
3319#ifdef POSIX_BC
3320 PerlIO_printf(PerlIO_stdout(),
3321 "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
3322#endif
3323#ifdef __MINT__
3324 PerlIO_printf(PerlIO_stdout(),
3325 "MiNT port by Guido Flohr, 1997-1999\n");
3326#endif
3327#ifdef EPOC
3328 PerlIO_printf(PerlIO_stdout(),
3329 "EPOC port by Olaf Flebbe, 1999-2002\n");
3330#endif
3331#ifdef UNDER_CE
3332 PerlIO_printf(PerlIO_stdout(),"WINCE port by Rainer Keuchel, 2001-2002\n");
3333 PerlIO_printf(PerlIO_stdout(),"Built on " __DATE__ " " __TIME__ "\n\n");
3334 wce_hitreturn();
3335#endif
3336#ifdef __SYMBIAN32__
3337 PerlIO_printf(PerlIO_stdout(),
3338 "Symbian port by Nokia, 2004-2005\n");
3339#endif
3340#ifdef BINARY_BUILD_NOTICE
3341 BINARY_BUILD_NOTICE;
3342#endif
3343 PerlIO_printf(PerlIO_stdout(),
3344 "\n\
3345Perl may be copied only under the terms of either the Artistic License or the\n\
3346GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
3347Complete documentation for Perl, including FAQ lists, should be found on\n\
3348this system using \"man perl\" or \"perldoc perl\". If you have access to the\n\
3349Internet, point your browser at http:
3350 my_exit(0);
3351 case 'w':
3352 if (! (PL_dowarn & G_WARN_ALL_MASK)) {
3353 PL_dowarn |= G_WARN_ON;
3354 }
3355 s++;
3356 return s;
3357 case 'W':
3358 PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
3359 if (!specialWARN(PL_compiling.cop_warnings))
3360 PerlMemShared_free(PL_compiling.cop_warnings);
3361 PL_compiling.cop_warnings = pWARN_ALL ;
3362 s++;
3363 return s;
3364 case 'X':
3365 PL_dowarn = G_WARN_ALL_OFF;
3366 if (!specialWARN(PL_compiling.cop_warnings))
3367 PerlMemShared_free(PL_compiling.cop_warnings);
3368 PL_compiling.cop_warnings = pWARN_NONE ;
3369 s++;
3370 return s;
3371 case '*':
3372 case ' ':
3373 if (s[1] == '-')
3374 return s+2;
3375 break;
3376 case '-':
3377 case 0:
3378#if defined(WIN32) || !defined(PERL_STRICT_CR)
3379 case '\r':
3380#endif
3381 case '\n':
3382 case '\t':
3383 break;
3384#ifdef ALTERNATE_SHEBANG
3385 case 'S':
3386 break;
3387#endif
3388 case 'P':
3389 if (PL_preprocess)
3390 return s+1;
3391
3392 default:
3393 Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
3394 }
3395 return NULL;
3396}
3397
3398
3399
3400
3401
3402
3403void
3404Perl_my_unexec(pTHX)
3405{
3406 PERL_UNUSED_CONTEXT;
3407#ifdef UNEXEC
3408 SV * prog = newSVpv(BIN_EXP, 0);
3409 SV * file = newSVpv(PL_origfilename, 0);
3410 int status = 1;
3411 extern int etext;
3412
3413 sv_catpvs(prog, "/perl");
3414 sv_catpvs(file, ".perldump");
3415
3416 unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
3417
3418 PerlProc_exit(status);
3419#else
3420# ifdef VMS
3421# include <lib$routines.h>
3422 lib$signal(SS$_DEBUG);
3423# elif defined(WIN32) || defined(__CYGWIN__)
3424 Perl_croak(aTHX_ "dump is not supported");
3425# else
3426 ABORT();
3427# endif
3428#endif
3429}
3430
3431
3432STATIC void
3433S_init_interp(pTHX)
3434{
3435 dVAR;
3436#ifdef MULTIPLICITY
3437# define PERLVAR(var,type)
3438# define PERLVARA(var,n,type)
3439# if defined(PERL_IMPLICIT_CONTEXT)
3440# define PERLVARI(var,type,init) aTHX->var = init;
3441# define PERLVARIC(var,type,init) aTHX->var = init;
3442# else
3443# define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
3444# define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
3445# endif
3446# include "intrpvar.h"
3447# undef PERLVAR
3448# undef PERLVARA
3449# undef PERLVARI
3450# undef PERLVARIC
3451#else
3452# define PERLVAR(var,type)
3453# define PERLVARA(var,n,type)
3454# define PERLVARI(var,type,init) PL_##var = init;
3455# define PERLVARIC(var,type,init) PL_##var = init;
3456# include "intrpvar.h"
3457# undef PERLVAR
3458# undef PERLVARA
3459# undef PERLVARI
3460# undef PERLVARIC
3461#endif
3462
3463
3464
3465 PL_reg_oldcurpm = PL_reg_curpm = NULL;
3466 PL_reg_poscache = PL_reg_starttry = NULL;
3467}
3468
3469STATIC void
3470S_init_main_stash(pTHX)
3471{
3472 dVAR;
3473 GV *gv;
3474
3475 PL_curstash = PL_defstash = newHV();
3476
3477
3478
3479 PL_curstname = newSVpvs_share("main");
3480 gv = gv_fetchpvs("main::", GV_ADD|GV_NOTQUAL, SVt_PVHV);
3481
3482
3483
3484
3485 SvREFCNT_dec(GvHV(gv));
3486 hv_name_set(PL_defstash, "main", 4, 0);
3487 GvHV(gv) = (HV*)SvREFCNT_inc_simple(PL_defstash);
3488 SvREADONLY_on(gv);
3489 PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpvs("INC", GV_ADD|GV_NOTQUAL,
3490 SVt_PVAV)));
3491 SvREFCNT_inc_simple_void(PL_incgv);
3492 GvMULTI_on(PL_incgv);
3493 PL_hintgv = gv_fetchpvs("\010", GV_ADD|GV_NOTQUAL, SVt_PV);
3494 GvMULTI_on(PL_hintgv);
3495 PL_defgv = gv_fetchpvs("_", GV_ADD|GV_NOTQUAL, SVt_PVAV);
3496 SvREFCNT_inc_simple_void(PL_defgv);
3497 PL_errgv = gv_HVadd(gv_fetchpvs("@", GV_ADD|GV_NOTQUAL, SVt_PV));
3498 SvREFCNT_inc_simple_void(PL_errgv);
3499 GvMULTI_on(PL_errgv);
3500 PL_replgv = gv_fetchpvs("\022", GV_ADD|GV_NOTQUAL, SVt_PV);
3501 GvMULTI_on(PL_replgv);
3502 (void)Perl_form(aTHX_ "%240s","");
3503#ifdef PERL_DONT_CREATE_GVSV
3504 gv_SVadd(PL_errgv);
3505#endif
3506 sv_grow(ERRSV, 240);
3507 sv_setpvn(ERRSV, "", 0);
3508 PL_curstash = PL_defstash;
3509 CopSTASH_set(&PL_compiling, PL_defstash);
3510 PL_debstash = GvHV(gv_fetchpvs("DB::", GV_ADDMULTI, SVt_PVHV));
3511 PL_globalstash = GvHV(gv_fetchpvs("CORE::GLOBAL::", GV_ADDMULTI,
3512 SVt_PVHV));
3513
3514 sv_setpvn(get_sv("/", TRUE), "\n", 1);
3515}
3516
3517STATIC int
3518S_open_script(pTHX_ const char *scriptname, bool dosearch, SV *sv,
3519 int *suidscript, PerlIO **rsfpp)
3520{
3521#ifndef IAMSUID
3522 const char *quote;
3523 const char *code;
3524 const char *cpp_discard_flag;
3525 const char *perl;
3526#endif
3527 int fdscript = -1;
3528 dVAR;
3529
3530 *suidscript = -1;
3531
3532 if (PL_e_script) {
3533 PL_origfilename = savepvs("-e");
3534 }
3535 else {
3536
3537 scriptname = PL_origfilename = find_script(scriptname, dosearch, NULL, 1);
3538
3539 if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
3540 const char *s = scriptname + 8;
3541 fdscript = atoi(s);
3542 while (isDIGIT(*s))
3543 s++;
3544 if (*s) {
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554 *suidscript = 1;
3555
3556
3557
3558
3559 if (*s != '/') {
3560 Perl_croak(aTHX_ "Wrong syntax (suid) fd script name \"%s\"\n", s);
3561 }
3562 if (! *(s+1)) {
3563 Perl_croak(aTHX_ "Missing (suid) fd script name\n");
3564 }
3565 scriptname = savepv(s + 1);
3566 Safefree(PL_origfilename);
3567 PL_origfilename = (char *)scriptname;
3568 }
3569 }
3570 }
3571
3572 CopFILE_free(PL_curcop);
3573 CopFILE_set(PL_curcop, PL_origfilename);
3574 if (*PL_origfilename == '-' && PL_origfilename[1] == '\0')
3575 scriptname = (char *)"";
3576 if (fdscript >= 0) {
3577 *rsfpp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
3578# if defined(HAS_FCNTL) && defined(F_SETFD)
3579 if (*rsfpp)
3580
3581 fcntl(PerlIO_fileno(*rsfpp),F_SETFD,1);
3582# endif
3583 }
3584#ifdef IAMSUID
3585 else {
3586 Perl_croak(aTHX_ "sperl needs fd script\n"
3587 "You should not call sperl directly; do you need to "
3588 "change a #! line\nfrom sperl to perl?\n");
3589
3590
3591
3592
3593
3594
3595
3596 }
3597 if (*suidscript != 1) {
3598 Perl_croak(aTHX_ "suidperl needs (suid) fd script\n");
3599 }
3600#else
3601 else if (PL_preprocess) {
3602 const char * const cpp_cfg = CPPSTDIN;
3603 SV * const cpp = newSVpvs("");
3604 SV * const cmd = newSV(0);
3605
3606 if (cpp_cfg[0] == 0)
3607 Perl_croak(aTHX_ "Can't run with cpp -P with CPPSTDIN undefined");
3608 if (strEQ(cpp_cfg, "cppstdin"))
3609 Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
3610 sv_catpv(cpp, cpp_cfg);
3611
3612# ifndef VMS
3613 sv_catpvs(sv, "-I");
3614 sv_catpv(sv,PRIVLIB_EXP);
3615# endif
3616
3617 DEBUG_P(PerlIO_printf(Perl_debug_log,
3618 "PL_preprocess: scriptname=\"%s\", cpp=\"%s\", sv=\"%s\", CPPMINUS=\"%s\"\n",
3619 scriptname, SvPVX_const (cpp), SvPVX_const (sv),
3620 CPPMINUS));
3621
3622# if defined(MSDOS) || defined(WIN32) || defined(VMS)
3623 quote = "\"";
3624# else
3625 quote = "'";
3626# endif
3627
3628# ifdef VMS
3629 cpp_discard_flag = "";
3630# else
3631 cpp_discard_flag = "-C";
3632# endif
3633
3634# ifdef OS2
3635 perl = os2_execname(aTHX);
3636# else
3637 perl = PL_origargv[0];
3638# endif
3639
3640
3641
3642
3643
3644
3645
3646
3647 if( PL_doextract )
3648 code = "(1../^#!.*perl/i)|/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
3649 else
3650 code = "/^\\s*#(?!\\s*((ifn?|un)def|(el|end)?if|define|include|else|error|pragma)\\b)/||!($|=1)||print";
3651
3652 Perl_sv_setpvf(aTHX_ cmd, "\
3653%s -ne%s%s%s %s | %"SVf" %s %"SVf" %s",
3654 perl, quote, code, quote, scriptname, SVfARG(cpp),
3655 cpp_discard_flag, SVfARG(sv), CPPMINUS);
3656
3657 PL_doextract = FALSE;
3658
3659 DEBUG_P(PerlIO_printf(Perl_debug_log,
3660 "PL_preprocess: cmd=\"%s\"\n",
3661 SvPVX_const(cmd)));
3662
3663 *rsfpp = PerlProc_popen((char *)SvPVX_const(cmd), (char *)"r");
3664 SvREFCNT_dec(cmd);
3665 SvREFCNT_dec(cpp);
3666 }
3667 else if (!*scriptname) {
3668 forbid_setid(0, *suidscript);
3669 *rsfpp = PerlIO_stdin();
3670 }
3671 else {
3672#ifdef FAKE_BIT_BUCKET
3673
3674
3675
3676
3677
3678
3679
3680#define FAKE_BIT_BUCKET_PREFIX "/tmp/perlnull-"
3681#define FAKE_BIT_BUCKET_SUFFIX "XXXXXXXX"
3682#define FAKE_BIT_BUCKET_TEMPLATE FAKE_BIT_BUCKET_PREFIX FAKE_BIT_BUCKET_SUFFIX
3683 char tmpname[sizeof(FAKE_BIT_BUCKET_TEMPLATE)] = {
3684 FAKE_BIT_BUCKET_TEMPLATE
3685 };
3686 const char * const err = "Failed to create a fake bit bucket";
3687 if (strEQ(scriptname, BIT_BUCKET)) {
3688#ifdef HAS_MKSTEMP
3689 int tmpfd = mkstemp(tmpname);
3690 if (tmpfd > -1) {
3691 scriptname = tmpname;
3692 close(tmpfd);
3693 } else
3694 Perl_croak(aTHX_ err);
3695#else
3696# ifdef HAS_MKTEMP
3697 scriptname = mktemp(tmpname);
3698 if (!scriptname)
3699 Perl_croak(aTHX_ err);
3700# endif
3701#endif
3702 }
3703#endif
3704 *rsfpp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
3705#ifdef FAKE_BIT_BUCKET
3706 if (memEQ(scriptname, FAKE_BIT_BUCKET_PREFIX,
3707 sizeof(FAKE_BIT_BUCKET_PREFIX) - 1)
3708 && strlen(scriptname) == sizeof(tmpname) - 1) {
3709 unlink(scriptname);
3710 }
3711 scriptname = BIT_BUCKET;
3712#endif
3713# if defined(HAS_FCNTL) && defined(F_SETFD)
3714 if (*rsfpp)
3715
3716 fcntl(PerlIO_fileno(*rsfpp),F_SETFD,1);
3717# endif
3718 }
3719#endif
3720 if (!*rsfpp) {
3721
3722 if (PL_e_script)
3723 Perl_croak(aTHX_ "Can't open "BIT_BUCKET": %s\n", Strerror(errno));
3724 else
3725 Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3726 CopFILE(PL_curcop), Strerror(errno));
3727 }
3728 return fdscript;
3729}
3730
3731
3732
3733
3734
3735
3736
3737
3738#ifdef IAMSUID
3739STATIC int
3740S_fd_on_nosuid_fs(pTHX_ int fd)
3741{
3742
3743
3744
3745
3746
3747 int check_okay = 0;
3748 int on_nosuid = 0;
3749
3750
3751
3752
3753 int on_noexec = 0;
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764#undef FD_ON_NOSUID_CHECK_OKAY
3765
3766# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3767 defined(HAS_FSTATVFS)
3768# define FD_ON_NOSUID_CHECK_OKAY
3769 struct statvfs stfs;
3770
3771 check_okay = fstatvfs(fd, &stfs) == 0;
3772 on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
3773#ifdef ST_NOEXEC
3774
3775
3776 on_noexec = check_okay && (stfs.f_flag & ST_NOEXEC);
3777#endif
3778# endif
3779
3780# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3781 defined(PERL_MOUNT_NOSUID) && \
3782 defined(PERL_MOUNT_NOEXEC) && \
3783 defined(HAS_FSTATFS) && \
3784 defined(HAS_STRUCT_STATFS) && \
3785 defined(HAS_STRUCT_STATFS_F_FLAGS)
3786# define FD_ON_NOSUID_CHECK_OKAY
3787 struct statfs stfs;
3788
3789 check_okay = fstatfs(fd, &stfs) == 0;
3790 on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
3791 on_noexec = check_okay && (stfs.f_flags & PERL_MOUNT_NOEXEC);
3792# endif
3793
3794# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3795 defined(PERL_MOUNT_NOSUID) && \
3796 defined(PERL_MOUNT_NOEXEC) && \
3797 defined(HAS_FSTAT) && \
3798 defined(HAS_USTAT) && \
3799 defined(HAS_GETMNT) && \
3800 defined(HAS_STRUCT_FS_DATA) && \
3801 defined(NOSTAT_ONE)
3802# define FD_ON_NOSUID_CHECK_OKAY
3803 Stat_t fdst;
3804
3805 if (fstat(fd, &fdst) == 0) {
3806 struct ustat us;
3807 if (ustat(fdst.st_dev, &us) == 0) {
3808 struct fs_data fsd;
3809
3810
3811 if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
3812 size_t cmplen = sizeof(us.f_fname);
3813 if (sizeof(fsd.fd_req.path) < cmplen)
3814 cmplen = sizeof(fsd.fd_req.path);
3815 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
3816 fdst.st_dev == fsd.fd_req.dev) {
3817 check_okay = 1;
3818 on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
3819 on_noexec = fsd.fd_req.flags & PERL_MOUNT_NOEXEC;
3820 }
3821 }
3822 }
3823 }
3824# endif
3825
3826# if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
3827 defined(HAS_GETMNTENT) && \
3828 defined(HAS_HASMNTOPT) && \
3829 defined(MNTOPT_NOSUID) && \
3830 defined(MNTOPT_NOEXEC)
3831# define FD_ON_NOSUID_CHECK_OKAY
3832 FILE *mtab = fopen("/etc/mtab", "r");
3833 struct mntent *entry;
3834 Stat_t stb, fsb;
3835
3836 if (mtab && (fstat(fd, &stb) == 0)) {
3837 while (entry = getmntent(mtab)) {
3838 if (stat(entry->mnt_dir, &fsb) == 0
3839 && fsb.st_dev == stb.st_dev)
3840 {
3841
3842 check_okay = 1;
3843 if (hasmntopt(entry, MNTOPT_NOSUID))
3844 on_nosuid = 1;
3845 if (hasmntopt(entry, MNTOPT_NOEXEC))
3846 on_noexec = 1;
3847 break;
3848 }
3849 }
3850 }
3851 if (mtab)
3852 fclose(mtab);
3853# endif
3854
3855 if (!check_okay)
3856 Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid/noexec", PL_origfilename);
3857 if (on_nosuid)
3858 Perl_croak(aTHX_ "Setuid script \"%s\" on nosuid filesystem", PL_origfilename);
3859 if (on_noexec)
3860 Perl_croak(aTHX_ "Setuid script \"%s\" on noexec filesystem", PL_origfilename);
3861 return ((!check_okay) || on_nosuid || on_noexec);
3862}
3863#endif
3864
3865STATIC void
3866S_validate_suid(pTHX_ const char *validarg, const char *scriptname,
3867 int fdscript, int suidscript, SV *linestr_sv, PerlIO *rsfp)
3868{
3869 dVAR;
3870#ifdef IAMSUID
3871
3872#endif
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901#ifdef DOSUID
3902 const char *s, *s2;
3903
3904 if (PerlLIO_fstat(PerlIO_fileno(rsfp),&PL_statbuf) < 0)
3905 Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
3906 if (PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
3907 I32 len;
3908 const char *linestr;
3909 const char *s_end;
3910
3911# ifdef IAMSUID
3912 if (fdscript < 0 || suidscript != 1)
3913 Perl_croak(aTHX_ "Need (suid) fdscript in suidperl\n");
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944 if (PerlLIO_access(CopFILE(PL_curcop),1)) {
3945 Perl_croak(aTHX_ "Can't access() script\n");
3946 }
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973 {
3974 Stat_t tmpstatbuf;
3975 if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0 ||
3976 tmpstatbuf.st_dev != PL_statbuf.st_dev ||
3977 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
3978 Perl_croak(aTHX_ "Setuid script changed\n");
3979 }
3980
3981 }
3982 if (!cando(S_IXUSR,FALSE,&PL_statbuf))
3983 Perl_croak(aTHX_ "Real UID cannot exec script\n");
3984
3985
3986
3987
3988
3989
3990
3991
3992# if !defined(NO_NOSUID_CHECK)
3993 if (fd_on_nosuid_fs(PerlIO_fileno(rsfp))) {
3994 Perl_croak(aTHX_ "Setuid script on nosuid or noexec filesystem\n");
3995 }
3996# endif
3997# endif
3998
3999 if (!S_ISREG(PL_statbuf.st_mode)) {
4000 Perl_croak(aTHX_ "Setuid script not plain file\n");
4001 }
4002 if (PL_statbuf.st_mode & S_IWOTH)
4003 Perl_croak(aTHX_ "Setuid/gid script is writable by world");
4004 PL_doswitches = FALSE;
4005
4006 CopLINE_inc(PL_curcop);
4007 if (sv_gets(linestr_sv, rsfp, 0) == NULL)
4008 Perl_croak(aTHX_ "No #! line");
4009 linestr = SvPV_nolen_const(linestr_sv);
4010
4011 if (!*linestr || !linestr[1] || strnNE(linestr,"#!",2))
4012 Perl_croak(aTHX_ "No #! line");
4013 linestr += 2;
4014 s = linestr;
4015
4016
4017 s_end = s + strlen(s);
4018 if (s_end == s || (s_end - s) > 4000)
4019 Perl_croak(aTHX_ "Very long #! line");
4020
4021 while (isSPACE(*s)) s++;
4022
4023 while ((*s) && !isSPACE(*s)) s++;
4024 for (s2 = s; (s2 > linestr &&
4025 (isDIGIT(s2[-1]) || s2[-1] == '.' || s2[-1] == '_'
4026 || s2[-1] == '-')); s2--) ;
4027
4028 if ( (s2-4 < linestr || strnNE(s2-4,"perl",4)) &&
4029 (s-9 < linestr || strnNE(s-9,"perl",4)) )
4030 Perl_croak(aTHX_ "Not a perl script");
4031 while (*s == ' ' || *s == '\t') s++;
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054 len = strlen(validarg);
4055 if (strEQ(validarg," PHOOEY ") ||
4056 strnNE(s,validarg,len) || !isSPACE(s[len]) ||
4057 !((s_end - s) == len+1
4058 || ((s_end - s) == len+2 && isSPACE(s[len+1]))))
4059 Perl_croak(aTHX_ "Args must match #! line");
4060
4061# ifndef IAMSUID
4062 if (fdscript < 0 &&
4063 PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
4064 PL_euid == PL_statbuf.st_uid)
4065 if (!PL_do_undump)
4066 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
4067FIX YOUR KERNEL, OR PUT A C WRAPPER AROUND THIS SCRIPT!\n");
4068# endif
4069
4070 if (fdscript < 0 &&
4071 PL_euid) {
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086# ifndef IAMSUID
4087 int which;
4088
4089
4090
4091
4092
4093
4094
4095 PerlIO_rewind(rsfp);
4096 PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0);
4097
4098 if ((!scriptname) || (!*scriptname) ) {
4099 Perl_croak(aTHX_ "No setuid script name\n");
4100 }
4101 if (*scriptname == '-') {
4102 Perl_croak(aTHX_ "Setuid script name may not begin with dash\n");
4103
4104
4105
4106
4107 }
4108 for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
4109 if (!PL_origargv[which]) {
4110 Perl_croak(aTHX_ "Can't change argv to have fd script\n");
4111 }
4112 PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
4113 PerlIO_fileno(rsfp), PL_origargv[which]));
4114# if defined(HAS_FCNTL) && defined(F_SETFD)
4115 fcntl(PerlIO_fileno(rsfp),F_SETFD,0);
4116# endif
4117 PERL_FPU_PRE_EXEC
4118 PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
4119 (int)PERL_REVISION, (int)PERL_VERSION,
4120 (int)PERL_SUBVERSION), PL_origargv);
4121 PERL_FPU_POST_EXEC
4122# endif
4123 Perl_croak(aTHX_ "Can't do setuid (cannot exec sperl)\n");
4124 }
4125
4126 if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
4127
4128
4129
4130
4131
4132
4133# ifdef HAS_SETEGID
4134 (void)setegid(PL_statbuf.st_gid);
4135# else
4136# ifdef HAS_SETREGID
4137 (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
4138# else
4139# ifdef HAS_SETRESGID
4140 (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
4141# else
4142 PerlProc_setgid(PL_statbuf.st_gid);
4143# endif
4144# endif
4145# endif
4146 if (PerlProc_getegid() != PL_statbuf.st_gid)
4147 Perl_croak(aTHX_ "Can't do setegid!\n");
4148 }
4149 if (PL_statbuf.st_mode & S_ISUID) {
4150 if (PL_statbuf.st_uid != PL_euid)
4151# ifdef HAS_SETEUID
4152 (void)seteuid(PL_statbuf.st_uid);
4153# else
4154# ifdef HAS_SETREUID
4155 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
4156# else
4157# ifdef HAS_SETRESUID
4158 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
4159# else
4160 PerlProc_setuid(PL_statbuf.st_uid);
4161# endif
4162# endif
4163# endif
4164 if (PerlProc_geteuid() != PL_statbuf.st_uid)
4165 Perl_croak(aTHX_ "Can't do seteuid!\n");
4166 }
4167 else if (PL_uid) {
4168# ifdef HAS_SETEUID
4169 (void)seteuid((Uid_t)PL_uid);
4170# else
4171# ifdef HAS_SETREUID
4172 (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
4173# else
4174# ifdef HAS_SETRESUID
4175 (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
4176# else
4177 PerlProc_setuid((Uid_t)PL_uid);
4178# endif
4179# endif
4180# endif
4181 if (PerlProc_geteuid() != PL_uid)
4182 Perl_croak(aTHX_ "Can't do seteuid!\n");
4183 }
4184 init_ids();
4185 if (!cando(S_IXUSR,TRUE,&PL_statbuf))
4186 Perl_croak(aTHX_ "Effective UID cannot exec script\n");
4187 }
4188# ifdef IAMSUID
4189 else if (PL_preprocess)
4190 Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
4191 else if (fdscript < 0 || suidscript != 1)
4192
4193 Perl_croak(aTHX_ "(suid) fdscript needed in suidperl\n");
4194 else {
4195
4196 Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
4197 }
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232 PerlIO_rewind(rsfp);
4233 PerlLIO_lseek(PerlIO_fileno(rsfp),(Off_t)0,0);
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244# if defined(HAS_FCNTL) && defined(F_SETFD)
4245 fcntl(PerlIO_fileno(rsfp),F_SETFD,0);
4246# endif
4247 PERL_FPU_PRE_EXEC
4248 PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
4249 (int)PERL_REVISION, (int)PERL_VERSION,
4250 (int)PERL_SUBVERSION), PL_origargv);
4251 PERL_FPU_POST_EXEC
4252 Perl_croak(aTHX_ "Can't do setuid (suidperl cannot exec perl)\n");
4253# endif
4254#else
4255 PERL_UNUSED_ARG(fdscript);
4256 PERL_UNUSED_ARG(suidscript);
4257 if (PL_euid != PL_uid || PL_egid != PL_gid) {
4258# ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
4259 PERL_UNUSED_ARG(rsfp);
4260# else
4261 PerlLIO_fstat(PerlIO_fileno(rsfp),&PL_statbuf);
4262 if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
4263 ||
4264 (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
4265 )
4266 if (!PL_do_undump)
4267 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
4268FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
4269# endif
4270
4271 }
4272#endif
4273 PERL_UNUSED_ARG(validarg);
4274 PERL_UNUSED_ARG(scriptname);
4275 PERL_UNUSED_ARG(linestr_sv);
4276}
4277
4278STATIC void
4279S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp)
4280{
4281 dVAR;
4282 const char *s;
4283 register const char *s2;
4284#ifdef MACOS_TRADITIONAL
4285 int maclines = 0;
4286#endif
4287
4288
4289
4290#ifdef MACOS_TRADITIONAL
4291
4292
4293 while (PL_doextract || gMacPerl_AlwaysExtract) {
4294 if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL) {
4295 if (!gMacPerl_AlwaysExtract)
4296 Perl_croak(aTHX_ "No Perl script found in input\n");
4297
4298 if (PL_doextract)
4299 if (!OverrideExtract(PL_origfilename))
4300 Perl_croak(aTHX_ "User aborted script\n");
4301 else
4302 PL_doextract = FALSE;
4303
4304
4305 PerlIO_rewind(rsfp);
4306
4307 break;
4308 }
4309#else
4310 while (PL_doextract) {
4311 if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL)
4312 Perl_croak(aTHX_ "No Perl script found in input\n");
4313#endif
4314 s2 = s;
4315 if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) {
4316 PerlIO_ungetc(rsfp, '\n');
4317 PL_doextract = FALSE;
4318 while (*s && !(isSPACE (*s) || *s == '#')) s++;
4319 s2 = s;
4320 while (*s == ' ' || *s == '\t') s++;
4321 if (*s++ == '-') {
4322 while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.'
4323 || s2[-1] == '_') s2--;
4324 if (strnEQ(s2-4,"perl",4))
4325 while ((s = moreswitches(s)))
4326 ;
4327 }
4328#ifdef MACOS_TRADITIONAL
4329
4330
4331
4332
4333 for (; maclines > 0 ; maclines--)
4334 PerlIO_ungetc(rsfp, '\n');
4335
4336 break;
4337
4338
4339 } else if (gMacPerl_AlwaysExtract) {
4340 ++maclines;
4341#endif
4342 }
4343 }
4344}
4345
4346
4347STATIC void
4348S_init_ids(pTHX)
4349{
4350 dVAR;
4351 PL_uid = PerlProc_getuid();
4352 PL_euid = PerlProc_geteuid();
4353 PL_gid = PerlProc_getgid();
4354 PL_egid = PerlProc_getegid();
4355#ifdef VMS
4356 PL_uid |= PL_gid << 16;
4357 PL_euid |= PL_egid << 16;
4358#endif
4359
4360 CHECK_MALLOC_TAINT(PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
4361 PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371}
4372
4373
4374
4375
4376bool
4377Perl_doing_taint(int argc, char *argv[], char *envp[])
4378{
4379#ifndef PERL_IMPLICIT_SYS
4380
4381
4382
4383
4384
4385
4386
4387
4388 int uid = PerlProc_getuid();
4389 int euid = PerlProc_geteuid();
4390 int gid = PerlProc_getgid();
4391 int egid = PerlProc_getegid();
4392 (void)envp;
4393
4394#ifdef VMS
4395 uid |= gid << 16;
4396 euid |= egid << 16;
4397#endif
4398 if (uid && (euid != uid || egid != gid))
4399 return 1;
4400#endif
4401
4402
4403
4404 if ( argc > 1 && argv[1][0] == '-'
4405 && (argv[1][1] == 't' || argv[1][1] == 'T') )
4406 return 1;
4407 return 0;
4408}
4409
4410
4411
4412
4413
4414STATIC void
4415S_forbid_setid(pTHX_ const char flag, const int suidscript)
4416{
4417 dVAR;
4418 char string[3] = "-x";
4419 const char *message = "program input from stdin";
4420
4421 if (flag) {
4422 string[1] = flag;
4423 message = string;
4424 }
4425
4426#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
4427 if (PL_euid != PL_uid)
4428 Perl_croak(aTHX_ "No %s allowed while running setuid", message);
4429 if (PL_egid != PL_gid)
4430 Perl_croak(aTHX_ "No %s allowed while running setgid", message);
4431#endif
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454 if (suidscript >= 0)
4455 Perl_croak(aTHX_ "No %s allowed with (suid) fdscript", message);
4456#ifdef IAMSUID
4457
4458 Perl_croak(aTHX_ "No %s allowed in suidperl", message);
4459#endif
4460}
4461
4462void
4463Perl_init_debugger(pTHX)
4464{
4465 dVAR;
4466 HV * const ostash = PL_curstash;
4467
4468 PL_curstash = PL_debstash;
4469 PL_dbargs = GvAV(gv_AVadd((gv_fetchpvs("DB::args", GV_ADDMULTI,
4470 SVt_PVAV))));
4471 AvREAL_off(PL_dbargs);
4472 PL_DBgv = gv_fetchpvs("DB::DB", GV_ADDMULTI, SVt_PVGV);
4473 PL_DBline = gv_fetchpvs("DB::dbline", GV_ADDMULTI, SVt_PVAV);
4474 PL_DBsub = gv_HVadd(gv_fetchpvs("DB::sub", GV_ADDMULTI, SVt_PVHV));
4475 PL_DBsingle = GvSV((gv_fetchpvs("DB::single", GV_ADDMULTI, SVt_PV)));
4476 sv_setiv(PL_DBsingle, 0);
4477 PL_DBtrace = GvSV((gv_fetchpvs("DB::trace", GV_ADDMULTI, SVt_PV)));
4478 sv_setiv(PL_DBtrace, 0);
4479 PL_DBsignal = GvSV((gv_fetchpvs("DB::signal", GV_ADDMULTI, SVt_PV)));
4480 sv_setiv(PL_DBsignal, 0);
4481 PL_curstash = ostash;
4482}
4483
4484#ifndef STRESS_REALLOC
4485#define REASONABLE(size) (size)
4486#else
4487#define REASONABLE(size) (1)
4488#endif
4489
4490void
4491Perl_init_stacks(pTHX)
4492{
4493 dVAR;
4494
4495 PL_curstackinfo = new_stackinfo(REASONABLE(128),
4496 REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
4497 PL_curstackinfo->si_type = PERLSI_MAIN;
4498 PL_curstack = PL_curstackinfo->si_stack;
4499 PL_mainstack = PL_curstack;
4500
4501 PL_stack_base = AvARRAY(PL_curstack);
4502 PL_stack_sp = PL_stack_base;
4503 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
4504
4505 Newx(PL_tmps_stack,REASONABLE(128),SV*);
4506 PL_tmps_floor = -1;
4507 PL_tmps_ix = -1;
4508 PL_tmps_max = REASONABLE(128);
4509
4510 Newx(PL_markstack,REASONABLE(32),I32);
4511 PL_markstack_ptr = PL_markstack;
4512 PL_markstack_max = PL_markstack + REASONABLE(32);
4513
4514 SET_MARK_OFFSET;
4515
4516 Newx(PL_scopestack,REASONABLE(32),I32);
4517 PL_scopestack_ix = 0;
4518 PL_scopestack_max = REASONABLE(32);
4519
4520 Newx(PL_savestack,REASONABLE(128),ANY);
4521 PL_savestack_ix = 0;
4522 PL_savestack_max = REASONABLE(128);
4523}
4524
4525#undef REASONABLE
4526
4527STATIC void
4528S_nuke_stacks(pTHX)
4529{
4530 dVAR;
4531 while (PL_curstackinfo->si_next)
4532 PL_curstackinfo = PL_curstackinfo->si_next;
4533 while (PL_curstackinfo) {
4534 PERL_SI *p = PL_curstackinfo->si_prev;
4535
4536 Safefree(PL_curstackinfo->si_cxstack);
4537 Safefree(PL_curstackinfo);
4538 PL_curstackinfo = p;
4539 }
4540 Safefree(PL_tmps_stack);
4541 Safefree(PL_markstack);
4542 Safefree(PL_scopestack);
4543 Safefree(PL_savestack);
4544}
4545
4546
4547STATIC void
4548S_init_predump_symbols(pTHX)
4549{
4550 dVAR;
4551 GV *tmpgv;
4552 IO *io;
4553
4554 sv_setpvn(get_sv("\"", TRUE), " ", 1);
4555 PL_stdingv = gv_fetchpvs("STDIN", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4556 GvMULTI_on(PL_stdingv);
4557 io = GvIOp(PL_stdingv);
4558 IoTYPE(io) = IoTYPE_RDONLY;
4559 IoIFP(io) = PerlIO_stdin();
4560 tmpgv = gv_fetchpvs("stdin", GV_ADD|GV_NOTQUAL, SVt_PV);
4561 GvMULTI_on(tmpgv);
4562 GvIOp(tmpgv) = (IO*)SvREFCNT_inc_simple(io);
4563
4564 tmpgv = gv_fetchpvs("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4565 GvMULTI_on(tmpgv);
4566 io = GvIOp(tmpgv);
4567 IoTYPE(io) = IoTYPE_WRONLY;
4568 IoOFP(io) = IoIFP(io) = PerlIO_stdout();
4569 setdefout(tmpgv);
4570 tmpgv = gv_fetchpvs("stdout", GV_ADD|GV_NOTQUAL, SVt_PV);
4571 GvMULTI_on(tmpgv);
4572 GvIOp(tmpgv) = (IO*)SvREFCNT_inc_simple(io);
4573
4574 PL_stderrgv = gv_fetchpvs("STDERR", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4575 GvMULTI_on(PL_stderrgv);
4576 io = GvIOp(PL_stderrgv);
4577 IoTYPE(io) = IoTYPE_WRONLY;
4578 IoOFP(io) = IoIFP(io) = PerlIO_stderr();
4579 tmpgv = gv_fetchpvs("stderr", GV_ADD|GV_NOTQUAL, SVt_PV);
4580 GvMULTI_on(tmpgv);
4581 GvIOp(tmpgv) = (IO*)SvREFCNT_inc_simple(io);
4582
4583 PL_statname = newSV(0);
4584
4585 Safefree(PL_osname);
4586 PL_osname = savepv(OSNAME);
4587}
4588
4589void
4590Perl_init_argv_symbols(pTHX_ register int argc, register char **argv)
4591{
4592 dVAR;
4593 argc--,argv++;
4594 if (PL_doswitches) {
4595 for (; argc > 0 && **argv == '-'; argc--,argv++) {
4596 char *s;
4597 if (!argv[0][1])
4598 break;
4599 if (argv[0][1] == '-' && !argv[0][2]) {
4600 argc--,argv++;
4601 break;
4602 }
4603 if ((s = strchr(argv[0], '='))) {
4604 const char *const start_name = argv[0] + 1;
4605 sv_setpv(GvSV(gv_fetchpvn_flags(start_name, s - start_name,
4606 TRUE, SVt_PV)), s + 1);
4607 }
4608 else
4609 sv_setiv(GvSV(gv_fetchpv(argv[0]+1, GV_ADD, SVt_PV)),1);
4610 }
4611 }
4612 if ((PL_argvgv = gv_fetchpvs("ARGV", GV_ADD|GV_NOTQUAL, SVt_PVAV))) {
4613 GvMULTI_on(PL_argvgv);
4614 (void)gv_AVadd(PL_argvgv);
4615 av_clear(GvAVn(PL_argvgv));
4616 for (; argc > 0; argc--,argv++) {
4617 SV * const sv = newSVpv(argv[0],0);
4618 av_push(GvAVn(PL_argvgv),sv);
4619 if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
4620 if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
4621 SvUTF8_on(sv);
4622 }
4623 if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG)
4624 (void)sv_utf8_decode(sv);
4625 }
4626 }
4627}
4628
4629STATIC void
4630S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
4631{
4632 dVAR;
4633 GV* tmpgv;
4634
4635 PL_toptarget = newSV_type(SVt_PVFM);
4636 sv_setpvn(PL_toptarget, "", 0);
4637 PL_bodytarget = newSV_type(SVt_PVFM);
4638 sv_setpvn(PL_bodytarget, "", 0);
4639 PL_formtarget = PL_bodytarget;
4640
4641 TAINT;
4642
4643 init_argv_symbols(argc,argv);
4644
4645 if ((tmpgv = gv_fetchpvs("0", GV_ADD|GV_NOTQUAL, SVt_PV))) {
4646#ifdef MACOS_TRADITIONAL
4647
4648 sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
4649#else
4650 sv_setpv(GvSV(tmpgv),PL_origfilename);
4651 magicname("0", "0", 1);
4652#endif
4653 }
4654 if ((PL_envgv = gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV))) {
4655 HV *hv;
4656 bool env_is_not_environ;
4657 GvMULTI_on(PL_envgv);
4658 hv = GvHVn(PL_envgv);
4659 hv_magic(hv, NULL, PERL_MAGIC_env);
4660#ifndef PERL_MICRO
4661#ifdef USE_ENVIRON_ARRAY
4662
4663
4664
4665
4666
4667 if (!env)
4668 env = environ;
4669 env_is_not_environ = env != environ;
4670 if (env_is_not_environ
4671# ifdef USE_ITHREADS
4672 && PL_curinterp == aTHX
4673# endif
4674 )
4675 {
4676 environ[0] = NULL;
4677 }
4678 if (env) {
4679 char *s;
4680 SV *sv;
4681 for (; *env; env++) {
4682 if (!(s = strchr(*env,'=')) || s == *env)
4683 continue;
4684#if defined(MSDOS) && !defined(DJGPP)
4685 *s = '\0';
4686 (void)strupr(*env);
4687 *s = '=';
4688#endif
4689 sv = newSVpv(s+1, 0);
4690 (void)hv_store(hv, *env, s - *env, sv, 0);
4691 if (env_is_not_environ)
4692 mg_set(sv);
4693 }
4694 }
4695#endif
4696#endif
4697 }
4698 TAINT_NOT;
4699 if ((tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV))) {
4700 SvREADONLY_off(GvSV(tmpgv));
4701 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
4702 SvREADONLY_on(GvSV(tmpgv));
4703 }
4704#ifdef THREADS_HAVE_PIDS
4705 PL_ppid = (IV)getppid();
4706#endif
4707
4708
4709 if (PL_minus_a) {
4710 (void) get_av("main::F", TRUE | GV_ADDMULTI);
4711 }
4712}
4713
4714STATIC void
4715S_init_perllib(pTHX)
4716{
4717 dVAR;
4718 char *s;
4719 if (!PL_tainting) {
4720#ifndef VMS
4721 s = PerlEnv_getenv("PERL5LIB");
4722
4723
4724
4725
4726
4727#if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
4728 if (s && *s != '\0')
4729#else
4730 if (s)
4731#endif
4732 incpush(s, TRUE, TRUE, TRUE, FALSE);
4733 else
4734 incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE, TRUE, FALSE);
4735#else
4736
4737
4738
4739
4740 char buf[256];
4741 int idx = 0;
4742 if (my_trnlnm("PERL5LIB",buf,0))
4743 do { incpush(buf,TRUE,TRUE,TRUE,FALSE); } while (my_trnlnm("PERL5LIB",buf,++idx));
4744 else
4745 while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE,TRUE,FALSE);
4746#endif
4747 }
4748
4749
4750
4751
4752#ifdef APPLLIB_EXP
4753 incpush(APPLLIB_EXP, TRUE, TRUE, TRUE, TRUE);
4754#endif
4755
4756#ifdef ARCHLIB_EXP
4757 incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4758#endif
4759#ifdef MACOS_TRADITIONAL
4760 {
4761 Stat_t tmpstatbuf;
4762 SV * privdir = newSV(0);
4763 char * macperl = PerlEnv_getenv("MACPERL");
4764
4765 if (!macperl)
4766 macperl = "";
4767
4768 Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
4769 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
4770 incpush(SvPVX(privdir), TRUE, FALSE, TRUE, FALSE);
4771 Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
4772 if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
4773 incpush(SvPVX(privdir), TRUE, FALSE, TRUE, FALSE);
4774
4775 SvREFCNT_dec(privdir);
4776 }
4777 if (!PL_tainting)
4778 incpush(":", FALSE, FALSE, TRUE, FALSE);
4779#else
4780#ifndef PRIVLIB_EXP
4781# define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
4782#endif
4783#if defined(WIN32)
4784 incpush(PRIVLIB_EXP, TRUE, FALSE, TRUE, TRUE);
4785#else
4786 incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4787#endif
4788
4789#ifdef SITEARCH_EXP
4790
4791
4792# if !defined(WIN32)
4793 incpush(SITEARCH_EXP, FALSE, FALSE, TRUE, TRUE);
4794# endif
4795#endif
4796
4797#ifdef SITELIB_EXP
4798# if defined(WIN32)
4799
4800 incpush(SITELIB_EXP, TRUE, FALSE, TRUE, TRUE);
4801# else
4802 incpush(SITELIB_EXP, FALSE, FALSE, TRUE, TRUE);
4803# endif
4804#endif
4805
4806#if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST)
4807
4808 incpush(SITELIB_STEM, FALSE, TRUE, TRUE, TRUE);
4809#endif
4810
4811#ifdef PERL_VENDORARCH_EXP
4812
4813
4814# if !defined(WIN32)
4815 incpush(PERL_VENDORARCH_EXP, FALSE, FALSE, TRUE, TRUE);
4816# endif
4817#endif
4818
4819#ifdef PERL_VENDORLIB_EXP
4820# if defined(WIN32)
4821 incpush(PERL_VENDORLIB_EXP, TRUE, FALSE, TRUE, TRUE);
4822# else
4823 incpush(PERL_VENDORLIB_EXP, FALSE, FALSE, TRUE, TRUE);
4824# endif
4825#endif
4826
4827#ifdef PERL_VENDORLIB_STEM
4828 incpush(PERL_VENDORLIB_STEM, FALSE, TRUE, TRUE, TRUE);
4829#endif
4830
4831#ifdef PERL_OTHERLIBDIRS
4832 incpush(PERL_OTHERLIBDIRS, TRUE, TRUE, TRUE, TRUE);
4833#endif
4834
4835 if (!PL_tainting)
4836 incpush(".", FALSE, FALSE, TRUE, FALSE);
4837#endif
4838}
4839
4840#if defined(DOSISH) || defined(EPOC) || defined(__SYMBIAN32__)
4841# define PERLLIB_SEP ';'
4842#else
4843# if defined(VMS)
4844# define PERLLIB_SEP '|'
4845# else
4846# if defined(MACOS_TRADITIONAL)
4847# define PERLLIB_SEP ','
4848# else
4849# define PERLLIB_SEP ':'
4850# endif
4851# endif
4852#endif
4853#ifndef PERLLIB_MANGLE
4854# define PERLLIB_MANGLE(s,n) (s)
4855#endif
4856
4857
4858
4859
4860STATIC SV *
4861S_incpush_if_exists(pTHX_ SV *dir)
4862{
4863 dVAR;
4864 Stat_t tmpstatbuf;
4865 if (PerlLIO_stat(SvPVX_const(dir), &tmpstatbuf) >= 0 &&
4866 S_ISDIR(tmpstatbuf.st_mode)) {
4867 av_push(GvAVn(PL_incgv), dir);
4868 dir = newSV(0);
4869 }
4870 return dir;
4871}
4872
4873STATIC void
4874S_incpush(pTHX_ const char *dir, bool addsubdirs, bool addoldvers, bool usesep,
4875 bool canrelocate)
4876{
4877 dVAR;
4878 SV *subdir = NULL;
4879 const char *p = dir;
4880
4881 if (!p || !*p)
4882 return;
4883
4884 if (addsubdirs || addoldvers) {
4885 subdir = newSV(0);
4886 }
4887
4888
4889 while (p && *p) {
4890 SV *libdir = newSV(0);
4891 const char *s;
4892
4893
4894 if (usesep) {
4895 while ( *p == PERLLIB_SEP ) {
4896
4897
4898 p++;
4899 }
4900 }
4901
4902 if ( usesep && (s = strchr(p, PERLLIB_SEP)) != NULL ) {
4903 sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
4904 (STRLEN)(s - p));
4905 p = s + 1;
4906 }
4907 else {
4908 sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
4909 p = NULL;
4910 }
4911#ifdef MACOS_TRADITIONAL
4912 if (!strchr(SvPVX(libdir), ':')) {
4913 char buf[256];
4914
4915 sv_setpv(libdir, MacPerl_CanonDir(SvPVX(libdir), buf, 0));
4916 }
4917 if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
4918 sv_catpvs(libdir, ":");
4919#endif
4920
4921
4922
4923 if (canrelocate) {
4924#ifdef PERL_RELOCATABLE_INC
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941 const char *libpath = SvPVX(libdir);
4942 STRLEN libpath_len = SvCUR(libdir);
4943 if (libpath_len >= 4 && memEQ (libpath, ".../", 4)) {
4944
4945 SV * const caret_X = get_sv("\030", 0);
4946
4947
4948 SV *prefix_sv;
4949 char *prefix;
4950 char *lastslash;
4951
4952
4953
4954 assert(caret_X);
4955 assert(SvPOKp(caret_X));
4956 prefix_sv = newSVpvn(SvPVX(caret_X), SvCUR(caret_X));
4957
4958
4959
4960 sv_chop(libdir, libpath + 4);
4961
4962
4963
4964
4965 libpath = SvPVX(libdir);
4966 libpath_len = SvCUR(libdir);
4967
4968
4969
4970
4971
4972 prefix = SvPVX(prefix_sv);
4973 lastslash = strrchr(prefix, '/');
4974
4975
4976
4977
4978 if (lastslash) {
4979 SV *tempsv;
4980 while ((*lastslash = '\0'),
4981 (libpath_len >= 3 && memEQ(libpath, "../", 3)
4982 && (lastslash = strrchr(prefix, '/')))) {
4983 if (lastslash[1] == '\0'
4984 || (lastslash[1] == '.'
4985 && (lastslash[2] == '/'
4986 || (lastslash[2] == '/'
4987 && lastslash[3] == '/'
4988 )))) {
4989
4990
4991
4992 break;
4993 }
4994
4995 libpath += 3;
4996 libpath_len -= 3;
4997
4998
4999
5000 }
5001
5002
5003
5004
5005 tempsv = Perl_newSVpvf(aTHX_ "%s/%s", prefix, libpath);
5006 SvREFCNT_dec(libdir);
5007
5008 libdir = tempsv;
5009 if (PL_tainting &&
5010 (PL_uid != PL_euid || PL_gid != PL_egid)) {
5011
5012 SvTAINTED_on(libdir);
5013 }
5014 }
5015 SvREFCNT_dec(prefix_sv);
5016 }
5017#endif
5018 }
5019
5020
5021
5022
5023 if (addsubdirs || addoldvers) {
5024#ifdef PERL_INC_VERSION_LIST
5025
5026 const char * const incverlist[] = { PERL_INC_VERSION_LIST };
5027 const char * const *incver;
5028#endif
5029#ifdef VMS
5030 char *unix;
5031 STRLEN len;
5032
5033 if ((unix = tounixspec_ts(SvPV(libdir,len),NULL)) != NULL) {
5034 len = strlen(unix);
5035 while (unix[len-1] == '/') len--;
5036 sv_usepvn(libdir,unix,len);
5037 }
5038 else
5039 PerlIO_printf(Perl_error_log,
5040 "Failed to unixify @INC element \"%s\"\n",
5041 SvPV(libdir,len));
5042#endif
5043 if (addsubdirs) {
5044#ifdef MACOS_TRADITIONAL
5045#define PERL_AV_SUFFIX_FMT ""
5046#define PERL_ARCH_FMT "%s:"
5047#define PERL_ARCH_FMT_PATH PERL_FS_VER_FMT PERL_AV_SUFFIX_FMT
5048#else
5049#define PERL_AV_SUFFIX_FMT "/"
5050#define PERL_ARCH_FMT "/%s"
5051#define PERL_ARCH_FMT_PATH PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT
5052#endif
5053
5054 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH PERL_ARCH_FMT,
5055 SVfARG(libdir),
5056 (int)PERL_REVISION, (int)PERL_VERSION,
5057 (int)PERL_SUBVERSION, ARCHNAME);
5058 subdir = S_incpush_if_exists(aTHX_ subdir);
5059
5060
5061 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH,
5062 SVfARG(libdir),
5063 (int)PERL_REVISION, (int)PERL_VERSION,
5064 (int)PERL_SUBVERSION);
5065 subdir = S_incpush_if_exists(aTHX_ subdir);
5066
5067
5068 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT,
5069 SVfARG(libdir), ARCHNAME);
5070 subdir = S_incpush_if_exists(aTHX_ subdir);
5071
5072 }
5073
5074#ifdef PERL_INC_VERSION_LIST
5075 if (addoldvers) {
5076 for (incver = incverlist; *incver; incver++) {
5077
5078 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT,
5079 SVfARG(libdir), *incver);
5080 subdir = S_incpush_if_exists(aTHX_ subdir);
5081 }
5082 }
5083#endif
5084 }
5085
5086
5087 av_push(GvAVn(PL_incgv), libdir);
5088 }
5089 if (subdir) {
5090 assert (SvREFCNT(subdir) == 1);
5091 SvREFCNT_dec(subdir);
5092 }
5093}
5094
5095
5096void
5097Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
5098{
5099 dVAR;
5100 SV *atsv;
5101 volatile const line_t oldline = PL_curcop ? CopLINE(PL_curcop) : 0;
5102 CV *cv;
5103 STRLEN len;
5104 int ret;
5105 dJMPENV;
5106
5107 while (av_len(paramList) >= 0) {
5108 cv = (CV*)av_shift(paramList);
5109 if (PL_savebegin) {
5110 if (paramList == PL_beginav) {
5111
5112 Perl_av_create_and_push(aTHX_ &PL_beginav_save, (SV*)cv);
5113 }
5114 else if (paramList == PL_checkav) {
5115
5116 Perl_av_create_and_push(aTHX_ &PL_checkav_save, (SV*)cv);
5117 }
5118 else if (paramList == PL_unitcheckav) {
5119
5120 Perl_av_create_and_push(aTHX_ &PL_unitcheckav_save, (SV*)cv);
5121 }
5122 } else {
5123 if (!PL_madskills)
5124 SAVEFREESV(cv);
5125 }
5126 JMPENV_PUSH(ret);
5127 switch (ret) {
5128 case 0:
5129#ifdef PERL_MAD
5130 if (PL_madskills)
5131 PL_madskills |= 16384;
5132#endif
5133 CALL_LIST_BODY(cv);
5134#ifdef PERL_MAD
5135 if (PL_madskills)
5136 PL_madskills &= ~16384;
5137#endif
5138 atsv = ERRSV;
5139 (void)SvPV_const(atsv, len);
5140 if (len) {
5141 PL_curcop = &PL_compiling;
5142 CopLINE_set(PL_curcop, oldline);
5143 if (paramList == PL_beginav)
5144 sv_catpvs(atsv, "BEGIN failed--compilation aborted");
5145 else
5146 Perl_sv_catpvf(aTHX_ atsv,
5147 "%s failed--call queue aborted",
5148 paramList == PL_checkav ? "CHECK"
5149 : paramList == PL_initav ? "INIT"
5150 : paramList == PL_unitcheckav ? "UNITCHECK"
5151 : "END");
5152 while (PL_scopestack_ix > oldscope)
5153 LEAVE;
5154 JMPENV_POP;
5155 Perl_croak(aTHX_ "%"SVf"", SVfARG(atsv));
5156 }
5157 break;
5158 case 1:
5159 STATUS_ALL_FAILURE;
5160
5161 case 2:
5162
5163 while (PL_scopestack_ix > oldscope)
5164 LEAVE;
5165 FREETMPS;
5166 PL_curstash = PL_defstash;
5167 PL_curcop = &PL_compiling;
5168 CopLINE_set(PL_curcop, oldline);
5169 JMPENV_POP;
5170 if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
5171 if (paramList == PL_beginav)
5172 Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
5173 else
5174 Perl_croak(aTHX_ "%s failed--call queue aborted",
5175 paramList == PL_checkav ? "CHECK"
5176 : paramList == PL_initav ? "INIT"
5177 : paramList == PL_unitcheckav ? "UNITCHECK"
5178 : "END");
5179 }
5180 my_exit_jump();
5181
5182 case 3:
5183 if (PL_restartop) {
5184 PL_curcop = &PL_compiling;
5185 CopLINE_set(PL_curcop, oldline);
5186 JMPENV_JUMP(3);
5187 }
5188 PerlIO_printf(Perl_error_log, "panic: restartop\n");
5189 FREETMPS;
5190 break;
5191 }
5192 JMPENV_POP;
5193 }
5194}
5195
5196void
5197Perl_my_exit(pTHX_ U32 status)
5198{
5199 dVAR;
5200 DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
5201 (void*)thr, (unsigned long) status));
5202 switch (status) {
5203 case 0:
5204 STATUS_ALL_SUCCESS;
5205 break;
5206 case 1:
5207 STATUS_ALL_FAILURE;
5208 break;
5209 default:
5210 STATUS_EXIT_SET(status);
5211 break;
5212 }
5213 my_exit_jump();
5214}
5215
5216void
5217Perl_my_failure_exit(pTHX)
5218{
5219 dVAR;
5220#ifdef VMS
5221
5222
5223
5224
5225
5226
5227
5228 if (MY_POSIX_EXIT) {
5229
5230
5231
5232
5233
5234 if (STATUS_UNIX == 0)
5235 STATUS_UNIX_EXIT_SET(255);
5236 else {
5237 STATUS_UNIX_EXIT_SET(STATUS_UNIX);
5238
5239
5240
5241
5242
5243 if ((STATUS_NATIVE & (STS$K_SEVERE|STS$K_ERROR)) == 0)
5244 STATUS_UNIX_EXIT_SET(255);
5245 }
5246 }
5247 else {
5248
5249 if (vaxc$errno & 1) {
5250
5251
5252 if (STATUS_NATIVE & 1)
5253 STATUS_ALL_FAILURE;
5254 }
5255 else {
5256 if (!vaxc$errno) {
5257 STATUS_UNIX = EINTR;
5258 STATUS_ALL_FAILURE;
5259 }
5260 else {
5261 int severity;
5262 STATUS_NATIVE = vaxc$errno;
5263
5264
5265 severity = STATUS_NATIVE & STS$M_SEVERITY;
5266 STATUS_UNIX = (severity ? severity : 1) << 8;
5267
5268
5269 if (severity != STS$K_SEVERE)
5270 STATUS_ALL_FAILURE;
5271 }
5272 }
5273 }
5274
5275#else
5276 int exitstatus;
5277 if (errno & 255)
5278 STATUS_UNIX_SET(errno);
5279 else {
5280 exitstatus = STATUS_UNIX >> 8;
5281 if (exitstatus & 255)
5282 STATUS_UNIX_SET(exitstatus);
5283 else
5284 STATUS_UNIX_SET(255);
5285 }
5286#endif
5287 my_exit_jump();
5288}
5289
5290STATIC void
5291S_my_exit_jump(pTHX)
5292{
5293 dVAR;
5294
5295 if (PL_e_script) {
5296 SvREFCNT_dec(PL_e_script);
5297 PL_e_script = NULL;
5298 }
5299
5300 POPSTACK_TO(PL_mainstack);
5301 dounwind(-1);
5302 LEAVE_SCOPE(0);
5303
5304 JMPENV_JUMP(2);
5305}
5306
5307static I32
5308read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
5309{
5310 dVAR;
5311 const char * const p = SvPVX_const(PL_e_script);
5312 const char *nl = strchr(p, '\n');
5313
5314 PERL_UNUSED_ARG(idx);
5315 PERL_UNUSED_ARG(maxlen);
5316
5317 nl = (nl) ? nl+1 : SvEND(PL_e_script);
5318 if (nl-p == 0) {
5319 filter_del(read_e_script);
5320 return 0;
5321 }
5322 sv_catpvn(buf_sv, p, nl-p);
5323 sv_chop(PL_e_script, nl);
5324 return 1;
5325}
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336