This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Let Deparse.t be run from the top-level
[perl5.git] / mg.c
... / ...
CommitLineData
1/* mg.c
2 *
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
9 */
10
11/*
12 * Sam sat on the ground and put his head in his hands. 'I wish I had never
13 * come here, and I don't want to see no more magic,' he said, and fell silent.
14 *
15 * [p.363 of _The Lord of the Rings_, II/vii: "The Mirror of Galadriel"]
16 */
17
18/*
19=head1 Magical Functions
20"Magic" is special data attached to SV structures in order to give them
21"magical" properties. When any Perl code tries to read from, or assign to,
22an SV marked as magical, it calls the 'get' or 'set' function associated
23with that SV's magic. A get is called prior to reading an SV, in order to
24give it a chance to update its internal value (get on $. writes the line
25number of the last read filehandle into the SV's IV slot), while
26set is called after an SV has been written to, in order to allow it to make
27use of its changed value (set on $/ copies the SV's new value to the
28PL_rs global variable).
29
30Magic is implemented as a linked list of MAGIC structures attached to the
31SV. Each MAGIC struct holds the type of the magic, a pointer to an array
32of functions that implement the get(), set(), length() etc functions,
33plus space for some flags and pointers. For example, a tied variable has
34a MAGIC structure that contains a pointer to the object associated with the
35tie.
36
37=cut
38
39*/
40
41#include "EXTERN.h"
42#define PERL_IN_MG_C
43#include "perl.h"
44
45#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
46# ifdef I_GRP
47# include <grp.h>
48# endif
49#endif
50
51#if defined(HAS_SETGROUPS)
52# ifndef NGROUPS
53# define NGROUPS 32
54# endif
55#endif
56
57#ifdef __hpux
58# include <sys/pstat.h>
59#endif
60
61#ifdef HAS_PRCTL_SET_NAME
62# include <sys/prctl.h>
63#endif
64
65#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
66Signal_t Perl_csighandler(int sig, siginfo_t *, void *);
67#else
68Signal_t Perl_csighandler(int sig);
69#endif
70
71#ifdef __Lynx__
72/* Missing protos on LynxOS */
73void setruid(uid_t id);
74void seteuid(uid_t id);
75void setrgid(uid_t id);
76void setegid(uid_t id);
77#endif
78
79/*
80 * Pre-magic setup and post-magic takedown.
81 * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
82 */
83
84struct magic_state {
85 SV* mgs_sv;
86 I32 mgs_ss_ix;
87 U32 mgs_flags;
88 bool mgs_bumped;
89};
90/* MGS is typedef'ed to struct magic_state in perl.h */
91
92STATIC void
93S_save_magic_flags(pTHX_ I32 mgs_ix, SV *sv, U32 flags)
94{
95 MGS* mgs;
96 bool bumped = FALSE;
97
98 PERL_ARGS_ASSERT_SAVE_MAGIC_FLAGS;
99
100 assert(SvMAGICAL(sv));
101
102 /* we shouldn't really be called here with RC==0, but it can sometimes
103 * happen via mg_clear() (which also shouldn't be called when RC==0,
104 * but it can happen). Handle this case gracefully(ish) by not RC++
105 * and thus avoiding the resultant double free */
106 if (SvREFCNT(sv) > 0) {
107 /* guard against sv getting freed midway through the mg clearing,
108 * by holding a private reference for the duration. */
109 SvREFCNT_inc_simple_void_NN(sv);
110 bumped = TRUE;
111 }
112
113 SAVEDESTRUCTOR_X(S_restore_magic, INT2PTR(void*, (IV)mgs_ix));
114
115 mgs = SSPTR(mgs_ix, MGS*);
116 mgs->mgs_sv = sv;
117 mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
118 mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
119 mgs->mgs_bumped = bumped;
120
121 SvFLAGS(sv) &= ~flags;
122 SvREADONLY_off(sv);
123}
124
125#define save_magic(a,b) save_magic_flags(a,b,SVs_GMG|SVs_SMG|SVs_RMG)
126
127/*
128=for apidoc mg_magical
129
130Turns on the magical status of an SV. See C<L</sv_magic>>.
131
132=cut
133*/
134
135void
136Perl_mg_magical(SV *sv)
137{
138 const MAGIC* mg;
139 PERL_ARGS_ASSERT_MG_MAGICAL;
140
141 SvMAGICAL_off(sv);
142 if ((mg = SvMAGIC(sv))) {
143 do {
144 const MGVTBL* const vtbl = mg->mg_virtual;
145 if (vtbl) {
146 if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
147 SvGMAGICAL_on(sv);
148 if (vtbl->svt_set)
149 SvSMAGICAL_on(sv);
150 if (vtbl->svt_clear)
151 SvRMAGICAL_on(sv);
152 }
153 } while ((mg = mg->mg_moremagic));
154 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)))
155 SvRMAGICAL_on(sv);
156 }
157}
158
159/*
160=for apidoc mg_get
161
162Do magic before a value is retrieved from the SV. The type of SV must
163be >= C<SVt_PVMG>. See C<L</sv_magic>>.
164
165=cut
166*/
167
168int
169Perl_mg_get(pTHX_ SV *sv)
170{
171 const I32 mgs_ix = SSNEW(sizeof(MGS));
172 bool saved = FALSE;
173 bool have_new = 0;
174 bool taint_only = TRUE; /* the only get method seen is taint */
175 MAGIC *newmg, *head, *cur, *mg;
176
177 PERL_ARGS_ASSERT_MG_GET;
178
179 if (PL_localizing == 1 && sv == DEFSV) return 0;
180
181 /* We must call svt_get(sv, mg) for each valid entry in the linked
182 list of magic. svt_get() may delete the current entry, add new
183 magic to the head of the list, or upgrade the SV. AMS 20010810 */
184
185 newmg = cur = head = mg = SvMAGIC(sv);
186 while (mg) {
187 const MGVTBL * const vtbl = mg->mg_virtual;
188 MAGIC * const nextmg = mg->mg_moremagic; /* it may delete itself */
189
190 if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
191
192 /* taint's mg get is so dumb it doesn't need flag saving */
193 if (mg->mg_type != PERL_MAGIC_taint) {
194 taint_only = FALSE;
195 if (!saved) {
196 save_magic(mgs_ix, sv);
197 saved = TRUE;
198 }
199 }
200
201 vtbl->svt_get(aTHX_ sv, mg);
202
203 /* guard against magic having been deleted - eg FETCH calling
204 * untie */
205 if (!SvMAGIC(sv)) {
206 /* recalculate flags */
207 (SSPTR(mgs_ix, MGS *))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
208 break;
209 }
210
211 /* recalculate flags if this entry was deleted. */
212 if (mg->mg_flags & MGf_GSKIP)
213 (SSPTR(mgs_ix, MGS *))->mgs_flags &=
214 ~(SVs_GMG|SVs_SMG|SVs_RMG);
215 }
216 else if (vtbl == &PL_vtbl_utf8) {
217 /* get-magic can reallocate the PV, unless there's only taint
218 * magic */
219 if (taint_only) {
220 MAGIC *mg2;
221 for (mg2 = nextmg; mg2; mg2 = mg2->mg_moremagic) {
222 if ( mg2->mg_type != PERL_MAGIC_taint
223 && !(mg2->mg_flags & MGf_GSKIP)
224 && mg2->mg_virtual
225 && mg2->mg_virtual->svt_get
226 ) {
227 taint_only = FALSE;
228 break;
229 }
230 }
231 }
232 if (!taint_only)
233 magic_setutf8(sv, mg);
234 }
235
236 mg = nextmg;
237
238 if (have_new) {
239 /* Have we finished with the new entries we saw? Start again
240 where we left off (unless there are more new entries). */
241 if (mg == head) {
242 have_new = 0;
243 mg = cur;
244 head = newmg;
245 }
246 }
247
248 /* Were any new entries added? */
249 if (!have_new && (newmg = SvMAGIC(sv)) != head) {
250 have_new = 1;
251 cur = mg;
252 mg = newmg;
253 /* recalculate flags */
254 (SSPTR(mgs_ix, MGS *))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
255 }
256 }
257
258 if (saved)
259 restore_magic(INT2PTR(void *, (IV)mgs_ix));
260
261 return 0;
262}
263
264/*
265=for apidoc mg_set
266
267Do magic after a value is assigned to the SV. See C<L</sv_magic>>.
268
269=cut
270*/
271
272int
273Perl_mg_set(pTHX_ SV *sv)
274{
275 const I32 mgs_ix = SSNEW(sizeof(MGS));
276 MAGIC* mg;
277 MAGIC* nextmg;
278
279 PERL_ARGS_ASSERT_MG_SET;
280
281 if (PL_localizing == 2 && sv == DEFSV) return 0;
282
283 save_magic_flags(mgs_ix, sv, SVs_GMG|SVs_SMG); /* leave SVs_RMG on */
284
285 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
286 const MGVTBL* vtbl = mg->mg_virtual;
287 nextmg = mg->mg_moremagic; /* it may delete itself */
288 if (mg->mg_flags & MGf_GSKIP) {
289 mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
290 (SSPTR(mgs_ix, MGS*))->mgs_flags &= ~(SVs_GMG|SVs_SMG|SVs_RMG);
291 }
292 if (PL_localizing == 2
293 && PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type))
294 continue;
295 if (vtbl && vtbl->svt_set)
296 vtbl->svt_set(aTHX_ sv, mg);
297 }
298
299 restore_magic(INT2PTR(void*, (IV)mgs_ix));
300 return 0;
301}
302
303/*
304=for apidoc mg_length
305
306Reports on the SV's length in bytes, calling length magic if available,
307but does not set the UTF8 flag on C<sv>. It will fall back to 'get'
308magic if there is no 'length' magic, but with no indication as to
309whether it called 'get' magic. It assumes C<sv> is a C<PVMG> or
310higher. Use C<sv_len()> instead.
311
312=cut
313*/
314
315U32
316Perl_mg_length(pTHX_ SV *sv)
317{
318 MAGIC* mg;
319 STRLEN len;
320
321 PERL_ARGS_ASSERT_MG_LENGTH;
322
323 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
324 const MGVTBL * const vtbl = mg->mg_virtual;
325 if (vtbl && vtbl->svt_len) {
326 const I32 mgs_ix = SSNEW(sizeof(MGS));
327 save_magic(mgs_ix, sv);
328 /* omit MGf_GSKIP -- not changed here */
329 len = vtbl->svt_len(aTHX_ sv, mg);
330 restore_magic(INT2PTR(void*, (IV)mgs_ix));
331 return len;
332 }
333 }
334
335 (void)SvPV_const(sv, len);
336 return len;
337}
338
339I32
340Perl_mg_size(pTHX_ SV *sv)
341{
342 MAGIC* mg;
343
344 PERL_ARGS_ASSERT_MG_SIZE;
345
346 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
347 const MGVTBL* const vtbl = mg->mg_virtual;
348 if (vtbl && vtbl->svt_len) {
349 const I32 mgs_ix = SSNEW(sizeof(MGS));
350 I32 len;
351 save_magic(mgs_ix, sv);
352 /* omit MGf_GSKIP -- not changed here */
353 len = vtbl->svt_len(aTHX_ sv, mg);
354 restore_magic(INT2PTR(void*, (IV)mgs_ix));
355 return len;
356 }
357 }
358
359 switch(SvTYPE(sv)) {
360 case SVt_PVAV:
361 return AvFILLp((const AV *) sv); /* Fallback to non-tied array */
362 case SVt_PVHV:
363 /* FIXME */
364 default:
365 Perl_croak(aTHX_ "Size magic not implemented");
366
367 }
368 NOT_REACHED; /* NOTREACHED */
369}
370
371/*
372=for apidoc mg_clear
373
374Clear something magical that the SV represents. See C<L</sv_magic>>.
375
376=cut
377*/
378
379int
380Perl_mg_clear(pTHX_ SV *sv)
381{
382 const I32 mgs_ix = SSNEW(sizeof(MGS));
383 MAGIC* mg;
384 MAGIC *nextmg;
385
386 PERL_ARGS_ASSERT_MG_CLEAR;
387
388 save_magic(mgs_ix, sv);
389
390 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
391 const MGVTBL* const vtbl = mg->mg_virtual;
392 /* omit GSKIP -- never set here */
393
394 nextmg = mg->mg_moremagic; /* it may delete itself */
395
396 if (vtbl && vtbl->svt_clear)
397 vtbl->svt_clear(aTHX_ sv, mg);
398 }
399
400 restore_magic(INT2PTR(void*, (IV)mgs_ix));
401 return 0;
402}
403
404static MAGIC*
405S_mg_findext_flags(const SV *sv, int type, const MGVTBL *vtbl, U32 flags)
406{
407 assert(flags <= 1);
408
409 if (sv) {
410 MAGIC *mg;
411
412 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
413 if (mg->mg_type == type && (!flags || mg->mg_virtual == vtbl)) {
414 return mg;
415 }
416 }
417 }
418
419 return NULL;
420}
421
422/*
423=for apidoc mg_find
424
425Finds the magic pointer for C<type> matching the SV. See C<L</sv_magic>>.
426
427=cut
428*/
429
430MAGIC*
431Perl_mg_find(const SV *sv, int type)
432{
433 return S_mg_findext_flags(sv, type, NULL, 0);
434}
435
436/*
437=for apidoc mg_findext
438
439Finds the magic pointer of C<type> with the given C<vtbl> for the C<SV>. See
440C<L</sv_magicext>>.
441
442=cut
443*/
444
445MAGIC*
446Perl_mg_findext(const SV *sv, int type, const MGVTBL *vtbl)
447{
448 return S_mg_findext_flags(sv, type, vtbl, 1);
449}
450
451MAGIC *
452Perl_mg_find_mglob(pTHX_ SV *sv)
453{
454 PERL_ARGS_ASSERT_MG_FIND_MGLOB;
455 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
456 /* This sv is only a delegate. //g magic must be attached to
457 its target. */
458 vivify_defelem(sv);
459 sv = LvTARG(sv);
460 }
461 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
462 return S_mg_findext_flags(sv, PERL_MAGIC_regex_global, 0, 0);
463 return NULL;
464}
465
466/*
467=for apidoc mg_copy
468
469Copies the magic from one SV to another. See C<L</sv_magic>>.
470
471=cut
472*/
473
474int
475Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
476{
477 int count = 0;
478 MAGIC* mg;
479
480 PERL_ARGS_ASSERT_MG_COPY;
481
482 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
483 const MGVTBL* const vtbl = mg->mg_virtual;
484 if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
485 count += vtbl->svt_copy(aTHX_ sv, mg, nsv, key, klen);
486 }
487 else {
488 const char type = mg->mg_type;
489 if (isUPPER(type) && type != PERL_MAGIC_uvar) {
490 sv_magic(nsv,
491 (type == PERL_MAGIC_tied)
492 ? SvTIED_obj(sv, mg)
493 : mg->mg_obj,
494 toLOWER(type), key, klen);
495 count++;
496 }
497 }
498 }
499 return count;
500}
501
502/*
503=for apidoc mg_localize
504
505Copy some of the magic from an existing SV to new localized version of that
506SV. Container magic (I<e.g.>, C<%ENV>, C<$1>, C<tie>)
507gets copied, value magic doesn't (I<e.g.>,
508C<taint>, C<pos>).
509
510If C<setmagic> is false then no set magic will be called on the new (empty) SV.
511This typically means that assignment will soon follow (e.g. S<C<'local $x = $y'>>),
512and that will handle the magic.
513
514=cut
515*/
516
517void
518Perl_mg_localize(pTHX_ SV *sv, SV *nsv, bool setmagic)
519{
520 MAGIC *mg;
521
522 PERL_ARGS_ASSERT_MG_LOCALIZE;
523
524 if (nsv == DEFSV)
525 return;
526
527 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
528 const MGVTBL* const vtbl = mg->mg_virtual;
529 if (PERL_MAGIC_TYPE_IS_VALUE_MAGIC(mg->mg_type))
530 continue;
531
532 if ((mg->mg_flags & MGf_LOCAL) && vtbl->svt_local)
533 (void)vtbl->svt_local(aTHX_ nsv, mg);
534 else
535 sv_magicext(nsv, mg->mg_obj, mg->mg_type, vtbl,
536 mg->mg_ptr, mg->mg_len);
537
538 /* container types should remain read-only across localization */
539 SvFLAGS(nsv) |= SvREADONLY(sv);
540 }
541
542 if (SvTYPE(nsv) >= SVt_PVMG && SvMAGIC(nsv)) {
543 SvFLAGS(nsv) |= SvMAGICAL(sv);
544 if (setmagic) {
545 PL_localizing = 1;
546 SvSETMAGIC(nsv);
547 PL_localizing = 0;
548 }
549 }
550}
551
552#define mg_free_struct(sv, mg) S_mg_free_struct(aTHX_ sv, mg)
553static void
554S_mg_free_struct(pTHX_ SV *sv, MAGIC *mg)
555{
556 const MGVTBL* const vtbl = mg->mg_virtual;
557 if (vtbl && vtbl->svt_free)
558 vtbl->svt_free(aTHX_ sv, mg);
559 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
560 if (mg->mg_len > 0 || mg->mg_type == PERL_MAGIC_utf8)
561 Safefree(mg->mg_ptr);
562 else if (mg->mg_len == HEf_SVKEY)
563 SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
564 }
565 if (mg->mg_flags & MGf_REFCOUNTED)
566 SvREFCNT_dec(mg->mg_obj);
567 Safefree(mg);
568}
569
570/*
571=for apidoc mg_free
572
573Free any magic storage used by the SV. See C<L</sv_magic>>.
574
575=cut
576*/
577
578int
579Perl_mg_free(pTHX_ SV *sv)
580{
581 MAGIC* mg;
582 MAGIC* moremagic;
583
584 PERL_ARGS_ASSERT_MG_FREE;
585
586 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
587 moremagic = mg->mg_moremagic;
588 mg_free_struct(sv, mg);
589 SvMAGIC_set(sv, moremagic);
590 }
591 SvMAGIC_set(sv, NULL);
592 SvMAGICAL_off(sv);
593 return 0;
594}
595
596/*
597=for apidoc Am|void|mg_free_type|SV *sv|int how
598
599Remove any magic of type C<how> from the SV C<sv>. See L</sv_magic>.
600
601=cut
602*/
603
604void
605Perl_mg_free_type(pTHX_ SV *sv, int how)
606{
607 MAGIC *mg, *prevmg, *moremg;
608 PERL_ARGS_ASSERT_MG_FREE_TYPE;
609 for (prevmg = NULL, mg = SvMAGIC(sv); mg; prevmg = mg, mg = moremg) {
610 moremg = mg->mg_moremagic;
611 if (mg->mg_type == how) {
612 MAGIC *newhead;
613 /* temporarily move to the head of the magic chain, in case
614 custom free code relies on this historical aspect of mg_free */
615 if (prevmg) {
616 prevmg->mg_moremagic = moremg;
617 mg->mg_moremagic = SvMAGIC(sv);
618 SvMAGIC_set(sv, mg);
619 }
620 newhead = mg->mg_moremagic;
621 mg_free_struct(sv, mg);
622 SvMAGIC_set(sv, newhead);
623 mg = prevmg;
624 }
625 }
626 mg_magical(sv);
627}
628
629/*
630=for apidoc mg_freeext
631
632Remove any magic of type C<how> using virtual table C<vtbl> from the
633SV C<sv>. See L</sv_magic>.
634
635C<mg_freeext(sv, how, NULL)> is equivalent to C<mg_free_type(sv, how)>.
636
637=cut
638*/
639
640void
641Perl_mg_freeext(pTHX_ SV *sv, int how, const MGVTBL *vtbl)
642{
643 MAGIC *mg, *prevmg, *moremg;
644 PERL_ARGS_ASSERT_MG_FREEEXT;
645 for (prevmg = NULL, mg = SvMAGIC(sv); mg; prevmg = mg, mg = moremg) {
646 MAGIC *newhead;
647 moremg = mg->mg_moremagic;
648 if (mg->mg_type == how && (vtbl == NULL || mg->mg_virtual == vtbl)) {
649 /* temporarily move to the head of the magic chain, in case
650 custom free code relies on this historical aspect of mg_free */
651 if (prevmg) {
652 prevmg->mg_moremagic = moremg;
653 mg->mg_moremagic = SvMAGIC(sv);
654 SvMAGIC_set(sv, mg);
655 }
656 newhead = mg->mg_moremagic;
657 mg_free_struct(sv, mg);
658 SvMAGIC_set(sv, newhead);
659 mg = prevmg;
660 }
661 }
662 mg_magical(sv);
663}
664
665#include <signal.h>
666
667U32
668Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
669{
670 PERL_UNUSED_ARG(sv);
671
672 PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT;
673
674 if (PL_curpm) {
675 REGEXP * const rx = PM_GETRE(PL_curpm);
676 if (rx) {
677 const SSize_t n = (SSize_t)mg->mg_obj;
678 if (n == '+') { /* @+ */
679 /* return the number possible */
680 return RX_NPARENS(rx);
681 } else { /* @- @^CAPTURE @{^CAPTURE} */
682 I32 paren = RX_LASTPAREN(rx);
683
684 /* return the last filled */
685 while ( paren >= 0
686 && (RX_OFFS(rx)[paren].start == -1
687 || RX_OFFS(rx)[paren].end == -1) )
688 paren--;
689 if (n == '-') {
690 /* @- */
691 return (U32)paren;
692 } else {
693 /* @^CAPTURE @{^CAPTURE} */
694 return paren >= 0 ? (U32)(paren-1) : (U32)-1;
695 }
696 }
697 }
698 }
699
700 return (U32)-1;
701}
702
703/* @-, @+ */
704
705int
706Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
707{
708 PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET;
709
710 if (PL_curpm) {
711 REGEXP * const rx = PM_GETRE(PL_curpm);
712 if (rx) {
713 const SSize_t n = (SSize_t)mg->mg_obj;
714 /* @{^CAPTURE} does not contain $&, so we need to increment by 1 */
715 const I32 paren = mg->mg_len
716 + (n == '\003' ? 1 : 0);
717 SSize_t s;
718 SSize_t t;
719 if (paren < 0)
720 return 0;
721 if (paren <= (I32)RX_NPARENS(rx) &&
722 (s = RX_OFFS(rx)[paren].start) != -1 &&
723 (t = RX_OFFS(rx)[paren].end) != -1)
724 {
725 SSize_t i;
726
727 if (n == '+') /* @+ */
728 i = t;
729 else if (n == '-') /* @- */
730 i = s;
731 else { /* @^CAPTURE @{^CAPTURE} */
732 CALLREG_NUMBUF_FETCH(rx,paren,sv);
733 return 0;
734 }
735
736 if (RX_MATCH_UTF8(rx)) {
737 const char * const b = RX_SUBBEG(rx);
738 if (b)
739 i = RX_SUBCOFFSET(rx) +
740 utf8_length((U8*)b,
741 (U8*)(b-RX_SUBOFFSET(rx)+i));
742 }
743
744 sv_setuv(sv, i);
745 return 0;
746 }
747 }
748 }
749 sv_set_undef(sv);
750 return 0;
751}
752
753/* @-, @+ */
754
755int
756Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
757{
758 PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET;
759 PERL_UNUSED_CONTEXT;
760 PERL_UNUSED_ARG(sv);
761 PERL_UNUSED_ARG(mg);
762 Perl_croak_no_modify();
763 NORETURN_FUNCTION_END;
764}
765
766#define SvRTRIM(sv) STMT_START { \
767 if (SvPOK(sv)) { \
768 STRLEN len = SvCUR(sv); \
769 char * const p = SvPVX(sv); \
770 while (len > 0 && isSPACE(p[len-1])) \
771 --len; \
772 SvCUR_set(sv, len); \
773 p[len] = '\0'; \
774 } \
775} STMT_END
776
777void
778Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv)
779{
780 PERL_ARGS_ASSERT_EMULATE_COP_IO;
781
782 if (!(CopHINTS_get(c) & (HINT_LEXICAL_IO_IN|HINT_LEXICAL_IO_OUT)))
783 sv_set_undef(sv);
784 else {
785 SvPVCLEAR(sv);
786 SvUTF8_off(sv);
787 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_IN)) {
788 SV *const value = cop_hints_fetch_pvs(c, "open<", 0);
789 assert(value);
790 sv_catsv(sv, value);
791 }
792 sv_catpvs(sv, "\0");
793 if ((CopHINTS_get(c) & HINT_LEXICAL_IO_OUT)) {
794 SV *const value = cop_hints_fetch_pvs(c, "open>", 0);
795 assert(value);
796 sv_catsv(sv, value);
797 }
798 }
799}
800
801STATIC void
802S_fixup_errno_string(pTHX_ SV* sv)
803{
804 /* Do what is necessary to fixup the non-empty string in 'sv' for return to
805 * Perl space. */
806
807 PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING;
808
809 assert(SvOK(sv));
810
811 if(strEQ(SvPVX(sv), "")) {
812 sv_catpv(sv, UNKNOWN_ERRNO_MSG);
813 }
814 else {
815
816 /* In some locales the error string may come back as UTF-8, in which
817 * case we should turn on that flag. This didn't use to happen, and to
818 * avoid as many possible backward compatibility issues as possible, we
819 * don't turn on the flag unless we have to. So the flag stays off for
820 * an entirely invariant string. We assume that if the string looks
821 * like UTF-8, it really is UTF-8: "text in any other encoding that
822 * uses bytes with the high bit set is extremely unlikely to pass a
823 * UTF-8 validity test"
824 * (http://en.wikipedia.org/wiki/Charset_detection). There is a
825 * potential that we will get it wrong however, especially on short
826 * error message text, so do an additional check. */
827 if ( ! IN_BYTES /* respect 'use bytes' */
828 && ! is_utf8_invariant_string((U8*) SvPVX_const(sv), SvCUR(sv))
829 && is_utf8_string((U8*) SvPVX_const(sv), SvCUR(sv))
830
831#ifdef USE_LOCALE_MESSAGES
832
833 && _is_cur_LC_category_utf8(LC_MESSAGES)
834
835#elif defined(USE_LOCLAE_CTYPE)
836
837 /* For systems that don't have a separate message category,
838 * this assumes that they follow the CTYPE one */
839 && _is_cur_LC_category_utf8(LC_CTYPE)
840
841#endif
842
843 ) {
844 SvUTF8_on(sv);
845 }
846 }
847}
848
849/*
850=for apidoc Am|SV *|sv_string_from_errnum|int errnum|SV *tgtsv
851
852Generates the message string describing an OS error and returns it as
853an SV. C<errnum> must be a value that C<errno> could take, identifying
854the type of error.
855
856If C<tgtsv> is non-null then the string will be written into that SV
857(overwriting existing content) and it will be returned. If C<tgtsv>
858is a null pointer then the string will be written into a new mortal SV
859which will be returned.
860
861The message will be taken from whatever locale would be used by C<$!>,
862and will be encoded in the SV in whatever manner would be used by C<$!>.
863The details of this process are subject to future change. Currently,
864the message is taken from the C locale by default (usually producing an
865English message), and from the currently selected locale when in the scope
866of the C<use locale> pragma. A heuristic attempt is made to decode the
867message from the locale's character encoding, but it will only be decoded
868as either UTF-8 or ISO-8859-1. It is always correctly decoded in a UTF-8
869locale, usually in an ISO-8859-1 locale, and never in any other locale.
870
871The SV is always returned containing an actual string, and with no other
872OK bits set. Unlike C<$!>, a message is even yielded for C<errnum> zero
873(meaning success), and if no useful message is available then a useless
874string (currently empty) is returned.
875
876=cut
877*/
878
879SV *
880Perl_sv_string_from_errnum(pTHX_ int errnum, SV *tgtsv)
881{
882 char const *errstr;
883 if(!tgtsv)
884 tgtsv = sv_newmortal();
885 errstr = my_strerror(errnum);
886 if(errstr) {
887 sv_setpv(tgtsv, errstr);
888 fixup_errno_string(tgtsv);
889 } else {
890 SvPVCLEAR(tgtsv);
891 }
892 return tgtsv;
893}
894
895#ifdef VMS
896#include <descrip.h>
897#include <starlet.h>
898#endif
899
900int
901Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
902{
903 I32 paren;
904 const char *s = NULL;
905 REGEXP *rx;
906 const char * const remaining = mg->mg_ptr + 1;
907 char nextchar;
908
909 PERL_ARGS_ASSERT_MAGIC_GET;
910
911 if (!mg->mg_ptr) {
912 paren = mg->mg_len;
913 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
914 do_numbuf_fetch:
915 CALLREG_NUMBUF_FETCH(rx,paren,sv);
916 }
917 else
918 goto set_undef;
919 return 0;
920 }
921
922 nextchar = *remaining;
923 switch (*mg->mg_ptr) {
924 case '\001': /* ^A */
925 if (SvOK(PL_bodytarget)) sv_copypv(sv, PL_bodytarget);
926 else
927 sv_set_undef(sv);
928 if (SvTAINTED(PL_bodytarget))
929 SvTAINTED_on(sv);
930 break;
931 case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
932 if (nextchar == '\0') {
933 sv_setiv(sv, (IV)PL_minus_c);
934 }
935 else if (strEQ(remaining, "HILD_ERROR_NATIVE")) {
936 sv_setiv(sv, (IV)STATUS_NATIVE);
937 }
938 break;
939
940 case '\004': /* ^D */
941 sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
942 break;
943 case '\005': /* ^E */
944 if (nextchar != '\0') {
945 if (strEQ(remaining, "NCODING"))
946 sv_set_undef(sv);
947 break;
948 }
949
950#if defined(VMS) || defined(OS2) || defined(WIN32)
951# if defined(VMS)
952 {
953 char msg[255];
954 $DESCRIPTOR(msgdsc,msg);
955 sv_setnv(sv,(NV) vaxc$errno);
956 if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
957 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
958 else
959 SvPVCLEAR(sv);
960 }
961#elif defined(OS2)
962 if (!(_emx_env & 0x200)) { /* Under DOS */
963 sv_setnv(sv, (NV)errno);
964 sv_setpv(sv, errno ? my_strerror(errno) : "");
965 } else {
966 if (errno != errno_isOS2) {
967 const int tmp = _syserrno();
968 if (tmp) /* 2nd call to _syserrno() makes it 0 */
969 Perl_rc = tmp;
970 }
971 sv_setnv(sv, (NV)Perl_rc);
972 sv_setpv(sv, os2error(Perl_rc));
973 }
974 if (SvOK(sv) && strNE(SvPVX(sv), "")) {
975 fixup_errno_string(sv);
976 }
977# elif defined(WIN32)
978 {
979 const DWORD dwErr = GetLastError();
980 sv_setnv(sv, (NV)dwErr);
981 if (dwErr) {
982 PerlProc_GetOSError(sv, dwErr);
983 fixup_errno_string(sv);
984 }
985 else
986 SvPVCLEAR(sv);
987 SetLastError(dwErr);
988 }
989# else
990# error Missing code for platform
991# endif
992 SvRTRIM(sv);
993 SvNOK_on(sv); /* what a wonderful hack! */
994 break;
995#endif /* End of platforms with special handling for $^E; others just fall
996 through to $! */
997
998 case '!':
999 {
1000 dSAVE_ERRNO;
1001#ifdef VMS
1002 sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
1003#else
1004 sv_setnv(sv, (NV)errno);
1005#endif
1006#ifdef OS2
1007 if (errno == errno_isOS2 || errno == errno_isOS2_set)
1008 sv_setpv(sv, os2error(Perl_rc));
1009 else
1010#endif
1011 if (! errno) {
1012 SvPVCLEAR(sv);
1013 }
1014 else {
1015 sv_string_from_errnum(errno, sv);
1016 /* If no useful string is available, don't
1017 * claim to have a string part. The SvNOK_on()
1018 * below will cause just the number part to be valid */
1019 if (!SvCUR(sv))
1020 SvPOK_off(sv);
1021 }
1022 RESTORE_ERRNO;
1023 }
1024
1025 SvRTRIM(sv);
1026 SvNOK_on(sv); /* what a wonderful hack! */
1027 break;
1028
1029 case '\006': /* ^F */
1030 sv_setiv(sv, (IV)PL_maxsysfd);
1031 break;
1032 case '\007': /* ^GLOBAL_PHASE */
1033 if (strEQ(remaining, "LOBAL_PHASE")) {
1034 sv_setpvn(sv, PL_phase_names[PL_phase],
1035 strlen(PL_phase_names[PL_phase]));
1036 }
1037 break;
1038 case '\010': /* ^H */
1039 sv_setuv(sv, PL_hints);
1040 break;
1041 case '\011': /* ^I */ /* NOT \t in EBCDIC */
1042 sv_setpv(sv, PL_inplace); /* Will undefine sv if PL_inplace is NULL */
1043 break;
1044 case '\014': /* ^LAST_FH */
1045 if (strEQ(remaining, "AST_FH")) {
1046 if (PL_last_in_gv && (SV*)PL_last_in_gv != &PL_sv_undef) {
1047 assert(isGV_with_GP(PL_last_in_gv));
1048 SV_CHECK_THINKFIRST_COW_DROP(sv);
1049 prepare_SV_for_RV(sv);
1050 SvOK_off(sv);
1051 SvRV_set(sv, SvREFCNT_inc_simple_NN(PL_last_in_gv));
1052 SvROK_on(sv);
1053 sv_rvweaken(sv);
1054 }
1055 else
1056 sv_set_undef(sv);
1057 }
1058 break;
1059 case '\017': /* ^O & ^OPEN */
1060 if (nextchar == '\0') {
1061 sv_setpv(sv, PL_osname);
1062 SvTAINTED_off(sv);
1063 }
1064 else if (strEQ(remaining, "PEN")) {
1065 Perl_emulate_cop_io(aTHX_ &PL_compiling, sv);
1066 }
1067 break;
1068 case '\020':
1069 sv_setiv(sv, (IV)PL_perldb);
1070 break;
1071 case '\023': /* ^S */
1072 {
1073 if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING)
1074 SvOK_off(sv);
1075 else if (PL_in_eval)
1076 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
1077 else
1078 sv_setiv(sv, 0);
1079 }
1080 break;
1081 case '\024': /* ^T */
1082 if (nextchar == '\0') {
1083#ifdef BIG_TIME
1084 sv_setnv(sv, PL_basetime);
1085#else
1086 sv_setiv(sv, (IV)PL_basetime);
1087#endif
1088 }
1089 else if (strEQ(remaining, "AINT"))
1090 sv_setiv(sv, TAINTING_get
1091 ? (TAINT_WARN_get || PL_unsafe ? -1 : 1)
1092 : 0);
1093 break;
1094 case '\025': /* $^UNICODE, $^UTF8LOCALE, $^UTF8CACHE */
1095 if (strEQ(remaining, "NICODE"))
1096 sv_setuv(sv, (UV) PL_unicode);
1097 else if (strEQ(remaining, "TF8LOCALE"))
1098 sv_setuv(sv, (UV) PL_utf8locale);
1099 else if (strEQ(remaining, "TF8CACHE"))
1100 sv_setiv(sv, (IV) PL_utf8cache);
1101 break;
1102 case '\027': /* ^W & $^WARNING_BITS */
1103 if (nextchar == '\0')
1104 sv_setiv(sv, (IV)cBOOL(PL_dowarn & G_WARN_ON));
1105 else if (strEQ(remaining, "ARNING_BITS")) {
1106 if (PL_compiling.cop_warnings == pWARN_NONE) {
1107 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
1108 }
1109 else if (PL_compiling.cop_warnings == pWARN_STD) {
1110 goto set_undef;
1111 }
1112 else if (PL_compiling.cop_warnings == pWARN_ALL) {
1113 /* Get the bit mask for $warnings::Bits{all}, because
1114 * it could have been extended by warnings::register */
1115 HV * const bits = get_hv("warnings::Bits", 0);
1116 SV ** const bits_all = bits ? hv_fetchs(bits, "all", FALSE) : NULL;
1117 if (bits_all)
1118 sv_copypv(sv, *bits_all);
1119 else
1120 sv_setpvn(sv, WARN_ALLstring, WARNsize);
1121 }
1122 else {
1123 sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1),
1124 *PL_compiling.cop_warnings);
1125 }
1126 }
1127#ifdef WIN32
1128 else if (strEQ(remaining, "IN32_SLOPPY_STAT")) {
1129 sv_setiv(sv, w32_sloppystat);
1130 }
1131#endif
1132 break;
1133 case '+':
1134 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
1135 paren = RX_LASTPAREN(rx);
1136 if (paren)
1137 goto do_numbuf_fetch;
1138 }
1139 goto set_undef;
1140 case '\016': /* ^N */
1141 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
1142 paren = RX_LASTCLOSEPAREN(rx);
1143 if (paren)
1144 goto do_numbuf_fetch;
1145 }
1146 goto set_undef;
1147 case '.':
1148 if (GvIO(PL_last_in_gv)) {
1149 sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
1150 }
1151 break;
1152 case '?':
1153 {
1154 sv_setiv(sv, (IV)STATUS_CURRENT);
1155#ifdef COMPLEX_STATUS
1156 SvUPGRADE(sv, SVt_PVLV);
1157 LvTARGOFF(sv) = PL_statusvalue;
1158 LvTARGLEN(sv) = PL_statusvalue_vms;
1159#endif
1160 }
1161 break;
1162 case '^':
1163 if (GvIOp(PL_defoutgv))
1164 s = IoTOP_NAME(GvIOp(PL_defoutgv));
1165 if (s)
1166 sv_setpv(sv,s);
1167 else {
1168 sv_setpv(sv,GvENAME(PL_defoutgv));
1169 sv_catpvs(sv,"_TOP");
1170 }
1171 break;
1172 case '~':
1173 if (GvIOp(PL_defoutgv))
1174 s = IoFMT_NAME(GvIOp(PL_defoutgv));
1175 if (!s)
1176 s = GvENAME(PL_defoutgv);
1177 sv_setpv(sv,s);
1178 break;
1179 case '=':
1180 if (GvIO(PL_defoutgv))
1181 sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
1182 break;
1183 case '-':
1184 if (GvIO(PL_defoutgv))
1185 sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
1186 break;
1187 case '%':
1188 if (GvIO(PL_defoutgv))
1189 sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
1190 break;
1191 case ':':
1192 case '/':
1193 break;
1194 case '[':
1195 sv_setiv(sv, 0);
1196 break;
1197 case '|':
1198 if (GvIO(PL_defoutgv))
1199 sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
1200 break;
1201 case '\\':
1202 if (PL_ors_sv)
1203 sv_copypv(sv, PL_ors_sv);
1204 else
1205 goto set_undef;
1206 break;
1207 case '$': /* $$ */
1208 {
1209 IV const pid = (IV)PerlProc_getpid();
1210 if (isGV(mg->mg_obj) || SvIV(mg->mg_obj) != pid) {
1211 /* never set manually, or at least not since last fork */
1212 sv_setiv(sv, pid);
1213 /* never unsafe, even if reading in a tainted expression */
1214 SvTAINTED_off(sv);
1215 }
1216 /* else a value has been assigned manually, so do nothing */
1217 }
1218 break;
1219 case '<':
1220 sv_setuid(sv, PerlProc_getuid());
1221 break;
1222 case '>':
1223 sv_setuid(sv, PerlProc_geteuid());
1224 break;
1225 case '(':
1226 sv_setgid(sv, PerlProc_getgid());
1227 goto add_groups;
1228 case ')':
1229 sv_setgid(sv, PerlProc_getegid());
1230 add_groups:
1231#ifdef HAS_GETGROUPS
1232 {
1233 Groups_t *gary = NULL;
1234 I32 num_groups = getgroups(0, gary);
1235 if (num_groups > 0) {
1236 I32 i;
1237 Newx(gary, num_groups, Groups_t);
1238 num_groups = getgroups(num_groups, gary);
1239 for (i = 0; i < num_groups; i++)
1240 Perl_sv_catpvf(aTHX_ sv, " %" IVdf, (IV)gary[i]);
1241 Safefree(gary);
1242 }
1243 }
1244 (void)SvIOK_on(sv); /* what a wonderful hack! */
1245#endif
1246 break;
1247 case '0':
1248 break;
1249 }
1250 return 0;
1251
1252 set_undef:
1253 sv_set_undef(sv);
1254 return 0;
1255}
1256
1257int
1258Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
1259{
1260 struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
1261
1262 PERL_ARGS_ASSERT_MAGIC_GETUVAR;
1263
1264 if (uf && uf->uf_val)
1265 (*uf->uf_val)(aTHX_ uf->uf_index, sv);
1266 return 0;
1267}
1268
1269int
1270Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
1271{
1272 STRLEN len = 0, klen;
1273 const char * const key = MgPV_const(mg,klen);
1274 const char *s = "";
1275
1276 PERL_ARGS_ASSERT_MAGIC_SETENV;
1277
1278 SvGETMAGIC(sv);
1279 if (SvOK(sv)) {
1280 /* defined environment variables are byte strings; unfortunately
1281 there is no SvPVbyte_force_nomg(), so we must do this piecewise */
1282 (void)SvPV_force_nomg_nolen(sv);
1283 sv_utf8_downgrade(sv, /* fail_ok */ TRUE);
1284 if (SvUTF8(sv)) {
1285 Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "setenv");
1286 SvUTF8_off(sv);
1287 }
1288 s = SvPVX(sv);
1289 len = SvCUR(sv);
1290 }
1291 my_setenv(key, s); /* does the deed */
1292
1293#ifdef DYNAMIC_ENV_FETCH
1294 /* We just undefd an environment var. Is a replacement */
1295 /* waiting in the wings? */
1296 if (!len) {
1297 SV ** const valp = hv_fetch(GvHVn(PL_envgv), key, klen, FALSE);
1298 if (valp)
1299 s = SvOK(*valp) ? SvPV_const(*valp, len) : "";
1300 }
1301#endif
1302
1303#if !defined(OS2) && !defined(WIN32) && !defined(MSDOS)
1304 /* And you'll never guess what the dog had */
1305 /* in its mouth... */
1306 if (TAINTING_get) {
1307 MgTAINTEDDIR_off(mg);
1308#ifdef VMS
1309 if (s && memEQs(key, klen, "DCL$PATH")) {
1310 char pathbuf[256], eltbuf[256], *cp, *elt;
1311 int i = 0, j = 0;
1312
1313 my_strlcpy(eltbuf, s, sizeof(eltbuf));
1314 elt = eltbuf;
1315 do { /* DCL$PATH may be a search list */
1316 while (1) { /* as may dev portion of any element */
1317 if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
1318 if ( *(cp+1) == '.' || *(cp+1) == '-' ||
1319 cando_by_name(S_IWUSR,0,elt) ) {
1320 MgTAINTEDDIR_on(mg);
1321 return 0;
1322 }
1323 }
1324 if ((cp = strchr(elt, ':')) != NULL)
1325 *cp = '\0';
1326 if (my_trnlnm(elt, eltbuf, j++))
1327 elt = eltbuf;
1328 else
1329 break;
1330 }
1331 j = 0;
1332 } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
1333 }
1334#endif /* VMS */
1335 if (s && memEQs(key, klen, "PATH")) {
1336 const char * const strend = s + len;
1337
1338 /* set MGf_TAINTEDDIR if any component of the new path is
1339 * relative or world-writeable */
1340 while (s < strend) {
1341 char tmpbuf[256];
1342 Stat_t st;
1343 I32 i;
1344#ifdef __VMS /* Hmm. How do we get $Config{path_sep} from C? */
1345 const char path_sep = PL_perllib_sep;
1346#else
1347 const char path_sep = ':';
1348#endif
1349 s = delimcpy_no_escape(tmpbuf, tmpbuf + sizeof tmpbuf,
1350 s, strend, path_sep, &i);
1351 s++;
1352 if (i >= (I32)sizeof tmpbuf /* too long -- assume the worst */
1353#ifdef __VMS
1354 /* no colon thus no device name -- assume relative path */
1355 || (PL_perllib_sep != ':' && !strchr(tmpbuf, ':'))
1356 /* Using Unix separator, e.g. under bash, so act line Unix */
1357 || (PL_perllib_sep == ':' && *tmpbuf != '/')
1358#else
1359 || *tmpbuf != '/' /* no starting slash -- assume relative path */
1360#endif
1361 || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
1362 MgTAINTEDDIR_on(mg);
1363 return 0;
1364 }
1365 }
1366 }
1367 }
1368#endif /* neither OS2 nor WIN32 nor MSDOS */
1369
1370 return 0;
1371}
1372
1373int
1374Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1375{
1376 PERL_ARGS_ASSERT_MAGIC_CLEARENV;
1377 PERL_UNUSED_ARG(sv);
1378 my_setenv(MgPV_nolen_const(mg),NULL);
1379 return 0;
1380}
1381
1382int
1383Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1384{
1385 PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV;
1386 PERL_UNUSED_ARG(mg);
1387#if defined(VMS)
1388 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1389#else
1390 if (PL_localizing) {
1391 HE* entry;
1392 my_clearenv();
1393 hv_iterinit(MUTABLE_HV(sv));
1394 while ((entry = hv_iternext(MUTABLE_HV(sv)))) {
1395 I32 keylen;
1396 my_setenv(hv_iterkey(entry, &keylen),
1397 SvPV_nolen_const(hv_iterval(MUTABLE_HV(sv), entry)));
1398 }
1399 }
1400#endif
1401 return 0;
1402}
1403
1404int
1405Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1406{
1407 PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV;
1408 PERL_UNUSED_ARG(sv);
1409 PERL_UNUSED_ARG(mg);
1410#if defined(VMS)
1411 Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1412#else
1413 my_clearenv();
1414#endif
1415 return 0;
1416}
1417
1418#ifndef PERL_MICRO
1419#ifdef HAS_SIGPROCMASK
1420static void
1421restore_sigmask(pTHX_ SV *save_sv)
1422{
1423 const sigset_t * const ossetp = (const sigset_t *) SvPV_nolen_const( save_sv );
1424 (void)sigprocmask(SIG_SETMASK, ossetp, NULL);
1425}
1426#endif
1427int
1428Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1429{
1430 /* Are we fetching a signal entry? */
1431 int i = (I16)mg->mg_private;
1432
1433 PERL_ARGS_ASSERT_MAGIC_GETSIG;
1434
1435 if (!i) {
1436 STRLEN siglen;
1437 const char * sig = MgPV_const(mg, siglen);
1438 mg->mg_private = i = whichsig_pvn(sig, siglen);
1439 }
1440
1441 if (i > 0) {
1442 if(PL_psig_ptr[i])
1443 sv_setsv(sv,PL_psig_ptr[i]);
1444 else {
1445 Sighandler_t sigstate = rsignal_state(i);
1446#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1447 if (PL_sig_handlers_initted && PL_sig_ignoring[i])
1448 sigstate = SIG_IGN;
1449#endif
1450#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1451 if (PL_sig_handlers_initted && PL_sig_defaulting[i])
1452 sigstate = SIG_DFL;
1453#endif
1454 /* cache state so we don't fetch it again */
1455 if(sigstate == (Sighandler_t) SIG_IGN)
1456 sv_setpvs(sv,"IGNORE");
1457 else
1458 sv_set_undef(sv);
1459 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1460 SvTEMP_off(sv);
1461 }
1462 }
1463 return 0;
1464}
1465int
1466Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1467{
1468 PERL_ARGS_ASSERT_MAGIC_CLEARSIG;
1469
1470 magic_setsig(NULL, mg);
1471 return sv_unmagic(sv, mg->mg_type);
1472}
1473
1474Signal_t
1475#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1476Perl_csighandler(int sig, siginfo_t *sip PERL_UNUSED_DECL, void *uap PERL_UNUSED_DECL)
1477#else
1478Perl_csighandler(int sig)
1479#endif
1480{
1481#ifdef PERL_GET_SIG_CONTEXT
1482 dTHXa(PERL_GET_SIG_CONTEXT);
1483#else
1484 dTHX;
1485#endif
1486#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1487#if defined(__cplusplus) && defined(__GNUC__)
1488 /* g++ doesn't support PERL_UNUSED_DECL, so the sip and uap
1489 * parameters would be warned about. */
1490 PERL_UNUSED_ARG(sip);
1491 PERL_UNUSED_ARG(uap);
1492#endif
1493#endif
1494#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1495 (void) rsignal(sig, PL_csighandlerp);
1496 if (PL_sig_ignoring[sig]) return;
1497#endif
1498#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1499 if (PL_sig_defaulting[sig])
1500#ifdef KILL_BY_SIGPRC
1501 exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1502#else
1503 exit(1);
1504#endif
1505#endif
1506 if (
1507#ifdef SIGILL
1508 sig == SIGILL ||
1509#endif
1510#ifdef SIGBUS
1511 sig == SIGBUS ||
1512#endif
1513#ifdef SIGSEGV
1514 sig == SIGSEGV ||
1515#endif
1516 (PL_signals & PERL_SIGNALS_UNSAFE_FLAG))
1517 /* Call the perl level handler now--
1518 * with risk we may be in malloc() or being destructed etc. */
1519#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1520 (*PL_sighandlerp)(sig, NULL, NULL);
1521#else
1522 (*PL_sighandlerp)(sig);
1523#endif
1524 else {
1525 if (!PL_psig_pend) return;
1526 /* Set a flag to say this signal is pending, that is awaiting delivery after
1527 * the current Perl opcode completes */
1528 PL_psig_pend[sig]++;
1529
1530#ifndef SIG_PENDING_DIE_COUNT
1531# define SIG_PENDING_DIE_COUNT 120
1532#endif
1533 /* Add one to say _a_ signal is pending */
1534 if (++PL_sig_pending >= SIG_PENDING_DIE_COUNT)
1535 Perl_croak(aTHX_ "Maximal count of pending signals (%lu) exceeded",
1536 (unsigned long)SIG_PENDING_DIE_COUNT);
1537 }
1538}
1539
1540#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1541void
1542Perl_csighandler_init(void)
1543{
1544 int sig;
1545 if (PL_sig_handlers_initted) return;
1546
1547 for (sig = 1; sig < SIG_SIZE; sig++) {
1548#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1549 dTHX;
1550 PL_sig_defaulting[sig] = 1;
1551 (void) rsignal(sig, PL_csighandlerp);
1552#endif
1553#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1554 PL_sig_ignoring[sig] = 0;
1555#endif
1556 }
1557 PL_sig_handlers_initted = 1;
1558}
1559#endif
1560
1561#if defined HAS_SIGPROCMASK
1562static void
1563unblock_sigmask(pTHX_ void* newset)
1564{
1565 PERL_UNUSED_CONTEXT;
1566 sigprocmask(SIG_UNBLOCK, (sigset_t*)newset, NULL);
1567}
1568#endif
1569
1570void
1571Perl_despatch_signals(pTHX)
1572{
1573 int sig;
1574 PL_sig_pending = 0;
1575 for (sig = 1; sig < SIG_SIZE; sig++) {
1576 if (PL_psig_pend[sig]) {
1577 dSAVE_ERRNO;
1578#ifdef HAS_SIGPROCMASK
1579 /* From sigaction(2) (FreeBSD man page):
1580 * | Signal routines normally execute with the signal that
1581 * | caused their invocation blocked, but other signals may
1582 * | yet occur.
1583 * Emulation of this behavior (from within Perl) is enabled
1584 * using sigprocmask
1585 */
1586 int was_blocked;
1587 sigset_t newset, oldset;
1588
1589 sigemptyset(&newset);
1590 sigaddset(&newset, sig);
1591 sigprocmask(SIG_BLOCK, &newset, &oldset);
1592 was_blocked = sigismember(&oldset, sig);
1593 if (!was_blocked) {
1594 SV* save_sv = newSVpvn((char *)(&newset), sizeof(sigset_t));
1595 ENTER;
1596 SAVEFREESV(save_sv);
1597 SAVEDESTRUCTOR_X(unblock_sigmask, SvPV_nolen(save_sv));
1598 }
1599#endif
1600 PL_psig_pend[sig] = 0;
1601#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
1602 (*PL_sighandlerp)(sig, NULL, NULL);
1603#else
1604 (*PL_sighandlerp)(sig);
1605#endif
1606#ifdef HAS_SIGPROCMASK
1607 if (!was_blocked)
1608 LEAVE;
1609#endif
1610 RESTORE_ERRNO;
1611 }
1612 }
1613}
1614
1615/* sv of NULL signifies that we're acting as magic_clearsig. */
1616int
1617Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1618{
1619 dVAR;
1620 I32 i;
1621 SV** svp = NULL;
1622 /* Need to be careful with SvREFCNT_dec(), because that can have side
1623 * effects (due to closures). We must make sure that the new disposition
1624 * is in place before it is called.
1625 */
1626 SV* to_dec = NULL;
1627 STRLEN len;
1628#ifdef HAS_SIGPROCMASK
1629 sigset_t set, save;
1630 SV* save_sv;
1631#endif
1632 const char *s = MgPV_const(mg,len);
1633
1634 PERL_ARGS_ASSERT_MAGIC_SETSIG;
1635
1636 if (*s == '_') {
1637 if (memEQs(s, len, "__DIE__"))
1638 svp = &PL_diehook;
1639 else if (memEQs(s, len, "__WARN__")
1640 && (sv ? 1 : PL_warnhook != PERL_WARNHOOK_FATAL)) {
1641 /* Merge the existing behaviours, which are as follows:
1642 magic_setsig, we always set svp to &PL_warnhook
1643 (hence we always change the warnings handler)
1644 For magic_clearsig, we don't change the warnings handler if it's
1645 set to the &PL_warnhook. */
1646 svp = &PL_warnhook;
1647 } else if (sv) {
1648 SV *tmp = sv_newmortal();
1649 Perl_croak(aTHX_ "No such hook: %s",
1650 pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
1651 }
1652 i = 0;
1653 if (svp && *svp) {
1654 if (*svp != PERL_WARNHOOK_FATAL)
1655 to_dec = *svp;
1656 *svp = NULL;
1657 }
1658 }
1659 else {
1660 i = (I16)mg->mg_private;
1661 if (!i) {
1662 i = whichsig_pvn(s, len); /* ...no, a brick */
1663 mg->mg_private = (U16)i;
1664 }
1665 if (i <= 0) {
1666 if (sv) {
1667 SV *tmp = sv_newmortal();
1668 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s",
1669 pv_pretty(tmp, s, len, 0, NULL, NULL, 0));
1670 }
1671 return 0;
1672 }
1673#ifdef HAS_SIGPROCMASK
1674 /* Avoid having the signal arrive at a bad time, if possible. */
1675 sigemptyset(&set);
1676 sigaddset(&set,i);
1677 sigprocmask(SIG_BLOCK, &set, &save);
1678 ENTER;
1679 save_sv = newSVpvn((char *)(&save), sizeof(sigset_t));
1680 SAVEFREESV(save_sv);
1681 SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1682#endif
1683 PERL_ASYNC_CHECK();
1684#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1685 if (!PL_sig_handlers_initted) Perl_csighandler_init();
1686#endif
1687#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1688 PL_sig_ignoring[i] = 0;
1689#endif
1690#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1691 PL_sig_defaulting[i] = 0;
1692#endif
1693 to_dec = PL_psig_ptr[i];
1694 if (sv) {
1695 PL_psig_ptr[i] = SvREFCNT_inc_simple_NN(sv);
1696 SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1697
1698 /* Signals don't change name during the program's execution, so once
1699 they're cached in the appropriate slot of PL_psig_name, they can
1700 stay there.
1701
1702 Ideally we'd find some way of making SVs at (C) compile time, or
1703 at least, doing most of the work. */
1704 if (!PL_psig_name[i]) {
1705 PL_psig_name[i] = newSVpvn(s, len);
1706 SvREADONLY_on(PL_psig_name[i]);
1707 }
1708 } else {
1709 SvREFCNT_dec(PL_psig_name[i]);
1710 PL_psig_name[i] = NULL;
1711 PL_psig_ptr[i] = NULL;
1712 }
1713 }
1714 if (sv && (isGV_with_GP(sv) || SvROK(sv))) {
1715 if (i) {
1716 (void)rsignal(i, PL_csighandlerp);
1717 }
1718 else
1719 *svp = SvREFCNT_inc_simple_NN(sv);
1720 } else {
1721 if (sv && SvOK(sv)) {
1722 s = SvPV_force(sv, len);
1723 } else {
1724 sv = NULL;
1725 }
1726 if (sv && memEQs(s, len,"IGNORE")) {
1727 if (i) {
1728#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1729 PL_sig_ignoring[i] = 1;
1730 (void)rsignal(i, PL_csighandlerp);
1731#else
1732 (void)rsignal(i, (Sighandler_t) SIG_IGN);
1733#endif
1734 }
1735 }
1736 else if (!sv || memEQs(s, len,"DEFAULT") || !len) {
1737 if (i) {
1738#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1739 PL_sig_defaulting[i] = 1;
1740 (void)rsignal(i, PL_csighandlerp);
1741#else
1742 (void)rsignal(i, (Sighandler_t) SIG_DFL);
1743#endif
1744 }
1745 }
1746 else {
1747 /*
1748 * We should warn if HINT_STRICT_REFS, but without
1749 * access to a known hint bit in a known OP, we can't
1750 * tell whether HINT_STRICT_REFS is in force or not.
1751 */
1752 if (!strchr(s,':') && !strchr(s,'\''))
1753 Perl_sv_insert_flags(aTHX_ sv, 0, 0, STR_WITH_LEN("main::"),
1754 SV_GMAGIC);
1755 if (i)
1756 (void)rsignal(i, PL_csighandlerp);
1757 else
1758 *svp = SvREFCNT_inc_simple_NN(sv);
1759 }
1760 }
1761
1762#ifdef HAS_SIGPROCMASK
1763 if(i)
1764 LEAVE;
1765#endif
1766 SvREFCNT_dec(to_dec);
1767 return 0;
1768}
1769#endif /* !PERL_MICRO */
1770
1771int
1772Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1773{
1774 PERL_ARGS_ASSERT_MAGIC_SETISA;
1775 PERL_UNUSED_ARG(sv);
1776
1777 /* Skip _isaelem because _isa will handle it shortly */
1778 if (PL_delaymagic & DM_ARRAY_ISA && mg->mg_type == PERL_MAGIC_isaelem)
1779 return 0;
1780
1781 return magic_clearisa(NULL, mg);
1782}
1783
1784/* sv of NULL signifies that we're acting as magic_setisa. */
1785int
1786Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg)
1787{
1788 HV* stash;
1789 PERL_ARGS_ASSERT_MAGIC_CLEARISA;
1790
1791 /* Bail out if destruction is going on */
1792 if(PL_phase == PERL_PHASE_DESTRUCT) return 0;
1793
1794 if (sv)
1795 av_clear(MUTABLE_AV(sv));
1796
1797 if (SvTYPE(mg->mg_obj) != SVt_PVGV && SvSMAGICAL(mg->mg_obj))
1798 /* This occurs with setisa_elem magic, which calls this
1799 same function. */
1800 mg = mg_find(mg->mg_obj, PERL_MAGIC_isa);
1801
1802 assert(mg);
1803 if (SvTYPE(mg->mg_obj) == SVt_PVAV) { /* multiple stashes */
1804 SV **svp = AvARRAY((AV *)mg->mg_obj);
1805 I32 items = AvFILLp((AV *)mg->mg_obj) + 1;
1806 while (items--) {
1807 stash = GvSTASH((GV *)*svp++);
1808 if (stash && HvENAME(stash)) mro_isa_changed_in(stash);
1809 }
1810
1811 return 0;
1812 }
1813
1814 stash = GvSTASH(
1815 (const GV *)mg->mg_obj
1816 );
1817
1818 /* The stash may have been detached from the symbol table, so check its
1819 name before doing anything. */
1820 if (stash && HvENAME_get(stash))
1821 mro_isa_changed_in(stash);
1822
1823 return 0;
1824}
1825
1826int
1827Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1828{
1829 HV * const hv = MUTABLE_HV(LvTARG(sv));
1830 I32 i = 0;
1831
1832 PERL_ARGS_ASSERT_MAGIC_GETNKEYS;
1833 PERL_UNUSED_ARG(mg);
1834
1835 if (hv) {
1836 (void) hv_iterinit(hv);
1837 if (! SvTIED_mg((const SV *)hv, PERL_MAGIC_tied))
1838 i = HvUSEDKEYS(hv);
1839 else {
1840 while (hv_iternext(hv))
1841 i++;
1842 }
1843 }
1844
1845 sv_setiv(sv, (IV)i);
1846 return 0;
1847}
1848
1849int
1850Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1851{
1852 PERL_ARGS_ASSERT_MAGIC_SETNKEYS;
1853 PERL_UNUSED_ARG(mg);
1854 if (LvTARG(sv)) {
1855 hv_ksplit(MUTABLE_HV(LvTARG(sv)), SvIV(sv));
1856 }
1857 return 0;
1858}
1859
1860/*
1861=for apidoc magic_methcall
1862
1863Invoke a magic method (like FETCH).
1864
1865C<sv> and C<mg> are the tied thingy and the tie magic.
1866
1867C<meth> is the name of the method to call.
1868
1869C<argc> is the number of args (in addition to $self) to pass to the method.
1870
1871The C<flags> can be:
1872
1873 G_DISCARD invoke method with G_DISCARD flag and don't
1874 return a value
1875 G_UNDEF_FILL fill the stack with argc pointers to
1876 PL_sv_undef
1877
1878The arguments themselves are any values following the C<flags> argument.
1879
1880Returns the SV (if any) returned by the method, or C<NULL> on failure.
1881
1882
1883=cut
1884*/
1885
1886SV*
1887Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags,
1888 U32 argc, ...)
1889{
1890 dSP;
1891 SV* ret = NULL;
1892
1893 PERL_ARGS_ASSERT_MAGIC_METHCALL;
1894
1895 ENTER;
1896
1897 if (flags & G_WRITING_TO_STDERR) {
1898 SAVETMPS;
1899
1900 save_re_context();
1901 SAVESPTR(PL_stderrgv);
1902 PL_stderrgv = NULL;
1903 }
1904
1905 PUSHSTACKi(PERLSI_MAGIC);
1906 PUSHMARK(SP);
1907
1908 /* EXTEND() expects a signed argc; don't wrap when casting */
1909 assert(argc <= I32_MAX);
1910 EXTEND(SP, (I32)argc+1);
1911 PUSHs(SvTIED_obj(sv, mg));
1912 if (flags & G_UNDEF_FILL) {
1913 while (argc--) {
1914 PUSHs(&PL_sv_undef);
1915 }
1916 } else if (argc > 0) {
1917 va_list args;
1918 va_start(args, argc);
1919
1920 do {
1921 SV *const sv = va_arg(args, SV *);
1922 PUSHs(sv);
1923 } while (--argc);
1924
1925 va_end(args);
1926 }
1927 PUTBACK;
1928 if (flags & G_DISCARD) {
1929 call_sv(meth, G_SCALAR|G_DISCARD|G_METHOD_NAMED);
1930 }
1931 else {
1932 if (call_sv(meth, G_SCALAR|G_METHOD_NAMED))
1933 ret = *PL_stack_sp--;
1934 }
1935 POPSTACK;
1936 if (flags & G_WRITING_TO_STDERR)
1937 FREETMPS;
1938 LEAVE;
1939 return ret;
1940}
1941
1942/* wrapper for magic_methcall that creates the first arg */
1943
1944STATIC SV*
1945S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags,
1946 int n, SV *val)
1947{
1948 SV* arg1 = NULL;
1949
1950 PERL_ARGS_ASSERT_MAGIC_METHCALL1;
1951
1952 if (mg->mg_ptr) {
1953 if (mg->mg_len >= 0) {
1954 arg1 = newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
1955 }
1956 else if (mg->mg_len == HEf_SVKEY)
1957 arg1 = MUTABLE_SV(mg->mg_ptr);
1958 }
1959 else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1960 arg1 = newSViv((IV)(mg->mg_len));
1961 sv_2mortal(arg1);
1962 }
1963 if (!arg1) {
1964 return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n - 1, val);
1965 }
1966 return Perl_magic_methcall(aTHX_ sv, mg, meth, flags, n, arg1, val);
1967}
1968
1969STATIC int
1970S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, SV *meth)
1971{
1972 SV* ret;
1973
1974 PERL_ARGS_ASSERT_MAGIC_METHPACK;
1975
1976 ret = magic_methcall1(sv, mg, meth, 0, 1, NULL);
1977 if (ret)
1978 sv_setsv(sv, ret);
1979 return 0;
1980}
1981
1982int
1983Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1984{
1985 PERL_ARGS_ASSERT_MAGIC_GETPACK;
1986
1987 if (mg->mg_type == PERL_MAGIC_tiedelem)
1988 mg->mg_flags |= MGf_GSKIP;
1989 magic_methpack(sv,mg,SV_CONST(FETCH));
1990 return 0;
1991}
1992
1993int
1994Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1995{
1996 MAGIC *tmg;
1997 SV *val;
1998
1999 PERL_ARGS_ASSERT_MAGIC_SETPACK;
2000
2001 /* in the code C<$tied{foo} = $val>, the "thing" that gets passed to
2002 * STORE() is not $val, but rather a PVLV (the sv in this call), whose
2003 * public flags indicate its value based on copying from $val. Doing
2004 * mg_set() on the PVLV temporarily does SvMAGICAL_off(), then calls us.
2005 * So STORE()'s $_[2] arg is a temporarily disarmed PVLV. This goes
2006 * wrong if $val happened to be tainted, as sv hasn't got magic
2007 * enabled, even though taint magic is in the chain. In which case,
2008 * fake up a temporary tainted value (this is easier than temporarily
2009 * re-enabling magic on sv). */
2010
2011 if (TAINTING_get && (tmg = mg_find(sv, PERL_MAGIC_taint))
2012 && (tmg->mg_len & 1))
2013 {
2014 val = sv_mortalcopy(sv);
2015 SvTAINTED_on(val);
2016 }
2017 else
2018 val = sv;
2019
2020 magic_methcall1(sv, mg, SV_CONST(STORE), G_DISCARD, 2, val);
2021 return 0;
2022}
2023
2024int
2025Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
2026{
2027 PERL_ARGS_ASSERT_MAGIC_CLEARPACK;
2028
2029 if (mg->mg_type == PERL_MAGIC_tiedscalar) return 0;
2030 return magic_methpack(sv,mg,SV_CONST(DELETE));
2031}
2032
2033
2034U32
2035Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
2036{
2037 I32 retval = 0;
2038 SV* retsv;
2039
2040 PERL_ARGS_ASSERT_MAGIC_SIZEPACK;
2041
2042 retsv = magic_methcall1(sv, mg, SV_CONST(FETCHSIZE), 0, 1, NULL);
2043 if (retsv) {
2044 retval = SvIV(retsv)-1;
2045 if (retval < -1)
2046 Perl_croak(aTHX_ "FETCHSIZE returned a negative value");
2047 }
2048 return (U32) retval;
2049}
2050
2051int
2052Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
2053{
2054 PERL_ARGS_ASSERT_MAGIC_WIPEPACK;
2055
2056 Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(CLEAR), G_DISCARD, 0);
2057 return 0;
2058}
2059
2060int
2061Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
2062{
2063 SV* ret;
2064
2065 PERL_ARGS_ASSERT_MAGIC_NEXTPACK;
2066
2067 ret = SvOK(key) ? Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(NEXTKEY), 0, 1, key)
2068 : Perl_magic_methcall(aTHX_ sv, mg, SV_CONST(FIRSTKEY), 0, 0);
2069 if (ret)
2070 sv_setsv(key,ret);
2071 return 0;
2072}
2073
2074int
2075Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg)
2076{
2077 PERL_ARGS_ASSERT_MAGIC_EXISTSPACK;
2078
2079 return magic_methpack(sv,mg,SV_CONST(EXISTS));
2080}
2081
2082SV *
2083Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
2084{
2085 SV *retval;
2086 SV * const tied = SvTIED_obj(MUTABLE_SV(hv), mg);
2087 HV * const pkg = SvSTASH((const SV *)SvRV(tied));
2088
2089 PERL_ARGS_ASSERT_MAGIC_SCALARPACK;
2090
2091 if (!gv_fetchmethod_autoload(pkg, "SCALAR", FALSE)) {
2092 SV *key;
2093 if (HvEITER_get(hv))
2094 /* we are in an iteration so the hash cannot be empty */
2095 return &PL_sv_yes;
2096 /* no xhv_eiter so now use FIRSTKEY */
2097 key = sv_newmortal();
2098 magic_nextpack(MUTABLE_SV(hv), mg, key);
2099 HvEITER_set(hv, NULL); /* need to reset iterator */
2100 return SvOK(key) ? &PL_sv_yes : &PL_sv_no;
2101 }
2102
2103 /* there is a SCALAR method that we can call */
2104 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(hv), mg, SV_CONST(SCALAR), 0, 0);
2105 if (!retval)
2106 retval = &PL_sv_undef;
2107 return retval;
2108}
2109
2110int
2111Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
2112{
2113 SV **svp;
2114
2115 PERL_ARGS_ASSERT_MAGIC_SETDBLINE;
2116
2117 /* The magic ptr/len for the debugger's hash should always be an SV. */
2118 if (UNLIKELY(mg->mg_len != HEf_SVKEY)) {
2119 Perl_croak(aTHX_ "panic: magic_setdbline len=%" IVdf ", ptr='%s'",
2120 (IV)mg->mg_len, mg->mg_ptr);
2121 }
2122
2123 /* Use sv_2iv instead of SvIV() as the former generates smaller code, and
2124 setting/clearing debugger breakpoints is not a hot path. */
2125 svp = av_fetch(MUTABLE_AV(mg->mg_obj),
2126 sv_2iv(MUTABLE_SV((mg)->mg_ptr)), FALSE);
2127
2128 if (svp && SvIOKp(*svp)) {
2129 OP * const o = INT2PTR(OP*,SvIVX(*svp));
2130 if (o) {
2131#ifdef PERL_DEBUG_READONLY_OPS
2132 Slab_to_rw(OpSLAB(o));
2133#endif
2134 /* set or clear breakpoint in the relevant control op */
2135 if (SvTRUE(sv))
2136 o->op_flags |= OPf_SPECIAL;
2137 else
2138 o->op_flags &= ~OPf_SPECIAL;
2139#ifdef PERL_DEBUG_READONLY_OPS
2140 Slab_to_ro(OpSLAB(o));
2141#endif
2142 }
2143 }
2144 return 0;
2145}
2146
2147int
2148Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg)
2149{
2150 AV * const obj = MUTABLE_AV(mg->mg_obj);
2151
2152 PERL_ARGS_ASSERT_MAGIC_GETARYLEN;
2153
2154 if (obj) {
2155 sv_setiv(sv, AvFILL(obj));
2156 } else {
2157 sv_set_undef(sv);
2158 }
2159 return 0;
2160}
2161
2162int
2163Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
2164{
2165 AV * const obj = MUTABLE_AV(mg->mg_obj);
2166
2167 PERL_ARGS_ASSERT_MAGIC_SETARYLEN;
2168
2169 if (obj) {
2170 av_fill(obj, SvIV(sv));
2171 } else {
2172 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
2173 "Attempt to set length of freed array");
2174 }
2175 return 0;
2176}
2177
2178int
2179Perl_magic_cleararylen_p(pTHX_ SV *sv, MAGIC *mg)
2180{
2181 PERL_ARGS_ASSERT_MAGIC_CLEARARYLEN_P;
2182 PERL_UNUSED_ARG(sv);
2183 PERL_UNUSED_CONTEXT;
2184
2185 /* Reset the iterator when the array is cleared */
2186#if IVSIZE == I32SIZE
2187 *((IV *) &(mg->mg_len)) = 0;
2188#else
2189 if (mg->mg_ptr)
2190 *((IV *) mg->mg_ptr) = 0;
2191#endif
2192
2193 return 0;
2194}
2195
2196int
2197Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg)
2198{
2199 PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P;
2200 PERL_UNUSED_ARG(sv);
2201
2202 /* during global destruction, mg_obj may already have been freed */
2203 if (PL_in_clean_all)
2204 return 0;
2205
2206 mg = mg_find (mg->mg_obj, PERL_MAGIC_arylen);
2207
2208 if (mg) {
2209 /* arylen scalar holds a pointer back to the array, but doesn't own a
2210 reference. Hence the we (the array) are about to go away with it
2211 still pointing at us. Clear its pointer, else it would be pointing
2212 at free memory. See the comment in sv_magic about reference loops,
2213 and why it can't own a reference to us. */
2214 mg->mg_obj = 0;
2215 }
2216 return 0;
2217}
2218
2219int
2220Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
2221{
2222 SV* const lsv = LvTARG(sv);
2223 MAGIC * const found = mg_find_mglob(lsv);
2224
2225 PERL_ARGS_ASSERT_MAGIC_GETPOS;
2226 PERL_UNUSED_ARG(mg);
2227
2228 if (found && found->mg_len != -1) {
2229 STRLEN i = found->mg_len;
2230 if (found->mg_flags & MGf_BYTES && DO_UTF8(lsv))
2231 i = sv_pos_b2u_flags(lsv, i, SV_GMAGIC|SV_CONST_RETURN);
2232 sv_setuv(sv, i);
2233 return 0;
2234 }
2235 sv_set_undef(sv);
2236 return 0;
2237}
2238
2239int
2240Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
2241{
2242 SV* const lsv = LvTARG(sv);
2243 SSize_t pos;
2244 STRLEN len;
2245 MAGIC* found;
2246 const char *s;
2247
2248 PERL_ARGS_ASSERT_MAGIC_SETPOS;
2249 PERL_UNUSED_ARG(mg);
2250
2251 found = mg_find_mglob(lsv);
2252 if (!found) {
2253 if (!SvOK(sv))
2254 return 0;
2255 found = sv_magicext_mglob(lsv);
2256 }
2257 else if (!SvOK(sv)) {
2258 found->mg_len = -1;
2259 return 0;
2260 }
2261 s = SvPV_const(lsv, len);
2262
2263 pos = SvIV(sv);
2264
2265 if (DO_UTF8(lsv)) {
2266 const STRLEN ulen = sv_or_pv_len_utf8(lsv, s, len);
2267 if (ulen)
2268 len = ulen;
2269 }
2270
2271 if (pos < 0) {
2272 pos += len;
2273 if (pos < 0)
2274 pos = 0;
2275 }
2276 else if (pos > (SSize_t)len)
2277 pos = len;
2278
2279 found->mg_len = pos;
2280 found->mg_flags &= ~(MGf_MINMATCH|MGf_BYTES);
2281
2282 return 0;
2283}
2284
2285int
2286Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
2287{
2288 STRLEN len;
2289 SV * const lsv = LvTARG(sv);
2290 const char * const tmps = SvPV_const(lsv,len);
2291 STRLEN offs = LvTARGOFF(sv);
2292 STRLEN rem = LvTARGLEN(sv);
2293 const bool negoff = LvFLAGS(sv) & LVf_NEG_OFF;
2294 const bool negrem = LvFLAGS(sv) & LVf_NEG_LEN;
2295
2296 PERL_ARGS_ASSERT_MAGIC_GETSUBSTR;
2297 PERL_UNUSED_ARG(mg);
2298
2299 if (!translate_substr_offsets(
2300 SvUTF8(lsv) ? sv_or_pv_len_utf8(lsv, tmps, len) : len,
2301 negoff ? -(IV)offs : (IV)offs, !negoff,
2302 negrem ? -(IV)rem : (IV)rem, !negrem, &offs, &rem
2303 )) {
2304 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR), "substr outside of string");
2305 sv_set_undef(sv);
2306 return 0;
2307 }
2308
2309 if (SvUTF8(lsv))
2310 offs = sv_or_pv_pos_u2b(lsv, tmps, offs, &rem);
2311 sv_setpvn(sv, tmps + offs, rem);
2312 if (SvUTF8(lsv))
2313 SvUTF8_on(sv);
2314 return 0;
2315}
2316
2317int
2318Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
2319{
2320 STRLEN len, lsv_len, oldtarglen, newtarglen;
2321 const char * const tmps = SvPV_const(sv, len);
2322 SV * const lsv = LvTARG(sv);
2323 STRLEN lvoff = LvTARGOFF(sv);
2324 STRLEN lvlen = LvTARGLEN(sv);
2325 const bool negoff = LvFLAGS(sv) & LVf_NEG_OFF;
2326 const bool neglen = LvFLAGS(sv) & LVf_NEG_LEN;
2327
2328 PERL_ARGS_ASSERT_MAGIC_SETSUBSTR;
2329 PERL_UNUSED_ARG(mg);
2330
2331 SvGETMAGIC(lsv);
2332 if (SvROK(lsv))
2333 Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
2334 "Attempt to use reference as lvalue in substr"
2335 );
2336 SvPV_force_nomg(lsv,lsv_len);
2337 if (SvUTF8(lsv)) lsv_len = sv_len_utf8_nomg(lsv);
2338 if (!translate_substr_offsets(
2339 lsv_len,
2340 negoff ? -(IV)lvoff : (IV)lvoff, !negoff,
2341 neglen ? -(IV)lvlen : (IV)lvlen, !neglen, &lvoff, &lvlen
2342 ))
2343 Perl_croak(aTHX_ "substr outside of string");
2344 oldtarglen = lvlen;
2345 if (DO_UTF8(sv)) {
2346 sv_utf8_upgrade_nomg(lsv);
2347 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2348 sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
2349 newtarglen = sv_or_pv_len_utf8(sv, tmps, len);
2350 SvUTF8_on(lsv);
2351 }
2352 else if (SvUTF8(lsv)) {
2353 const char *utf8;
2354 lvoff = sv_pos_u2b_flags(lsv, lvoff, &lvlen, SV_CONST_RETURN);
2355 newtarglen = len;
2356 utf8 = (char*)bytes_to_utf8((U8*)tmps, &len);
2357 sv_insert_flags(lsv, lvoff, lvlen, utf8, len, 0);
2358 Safefree(utf8);
2359 }
2360 else {
2361 sv_insert_flags(lsv, lvoff, lvlen, tmps, len, 0);
2362 newtarglen = len;
2363 }
2364 if (!neglen) LvTARGLEN(sv) = newtarglen;
2365 if (negoff) LvTARGOFF(sv) += newtarglen - oldtarglen;
2366
2367 return 0;
2368}
2369
2370int
2371Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
2372{
2373 PERL_ARGS_ASSERT_MAGIC_GETTAINT;
2374 PERL_UNUSED_ARG(sv);
2375#ifdef NO_TAINT_SUPPORT
2376 PERL_UNUSED_ARG(mg);
2377#endif
2378
2379 TAINT_IF((PL_localizing != 1) && (mg->mg_len & 1) && IN_PERL_RUNTIME);
2380 return 0;
2381}
2382
2383int
2384Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
2385{
2386 PERL_ARGS_ASSERT_MAGIC_SETTAINT;
2387 PERL_UNUSED_ARG(sv);
2388
2389 /* update taint status */
2390 if (TAINT_get)
2391 mg->mg_len |= 1;
2392 else
2393 mg->mg_len &= ~1;
2394 return 0;
2395}
2396
2397int
2398Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
2399{
2400 SV * const lsv = LvTARG(sv);
2401 char errflags = LvFLAGS(sv);
2402
2403 PERL_ARGS_ASSERT_MAGIC_GETVEC;
2404 PERL_UNUSED_ARG(mg);
2405
2406 /* non-zero errflags implies deferred out-of-range condition */
2407 assert(!(errflags & ~(LVf_NEG_OFF|LVf_OUT_OF_RANGE)));
2408 sv_setuv(sv, errflags ? 0 : do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
2409
2410 return 0;
2411}
2412
2413int
2414Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
2415{
2416 PERL_ARGS_ASSERT_MAGIC_SETVEC;
2417 PERL_UNUSED_ARG(mg);
2418 do_vecset(sv); /* XXX slurp this routine */
2419 return 0;
2420}
2421
2422SV *
2423Perl_defelem_target(pTHX_ SV *sv, MAGIC *mg)
2424{
2425 SV *targ = NULL;
2426 PERL_ARGS_ASSERT_DEFELEM_TARGET;
2427 if (!mg) mg = mg_find(sv, PERL_MAGIC_defelem);
2428 assert(mg);
2429 if (LvTARGLEN(sv)) {
2430 if (mg->mg_obj) {
2431 SV * const ahv = LvTARG(sv);
2432 HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, FALSE, 0);
2433 if (he)
2434 targ = HeVAL(he);
2435 }
2436 else if (LvSTARGOFF(sv) >= 0) {
2437 AV *const av = MUTABLE_AV(LvTARG(sv));
2438 if (LvSTARGOFF(sv) <= AvFILL(av))
2439 {
2440 if (SvRMAGICAL(av)) {
2441 SV * const * const svp = av_fetch(av, LvSTARGOFF(sv), 0);
2442 targ = svp ? *svp : NULL;
2443 }
2444 else
2445 targ = AvARRAY(av)[LvSTARGOFF(sv)];
2446 }
2447 }
2448 if (targ && (targ != &PL_sv_undef)) {
2449 /* somebody else defined it for us */
2450 SvREFCNT_dec(LvTARG(sv));
2451 LvTARG(sv) = SvREFCNT_inc_simple_NN(targ);
2452 LvTARGLEN(sv) = 0;
2453 SvREFCNT_dec(mg->mg_obj);
2454 mg->mg_obj = NULL;
2455 mg->mg_flags &= ~MGf_REFCOUNTED;
2456 }
2457 return targ;
2458 }
2459 else
2460 return LvTARG(sv);
2461}
2462
2463int
2464Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
2465{
2466 PERL_ARGS_ASSERT_MAGIC_GETDEFELEM;
2467
2468 sv_setsv(sv, defelem_target(sv, mg));
2469 return 0;
2470}
2471
2472int
2473Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
2474{
2475 PERL_ARGS_ASSERT_MAGIC_SETDEFELEM;
2476 PERL_UNUSED_ARG(mg);
2477 if (LvTARGLEN(sv))
2478 vivify_defelem(sv);
2479 if (LvTARG(sv)) {
2480 sv_setsv(LvTARG(sv), sv);
2481 SvSETMAGIC(LvTARG(sv));
2482 }
2483 return 0;
2484}
2485
2486void
2487Perl_vivify_defelem(pTHX_ SV *sv)
2488{
2489 MAGIC *mg;
2490 SV *value = NULL;
2491
2492 PERL_ARGS_ASSERT_VIVIFY_DEFELEM;
2493
2494 if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
2495 return;
2496 if (mg->mg_obj) {
2497 SV * const ahv = LvTARG(sv);
2498 HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, TRUE, 0);
2499 if (he)
2500 value = HeVAL(he);
2501 if (!value || value == &PL_sv_undef)
2502 Perl_croak(aTHX_ PL_no_helem_sv, SVfARG(mg->mg_obj));
2503 }
2504 else if (LvSTARGOFF(sv) < 0)
2505 Perl_croak(aTHX_ PL_no_aelem, LvSTARGOFF(sv));
2506 else {
2507 AV *const av = MUTABLE_AV(LvTARG(sv));
2508 if ((I32)LvTARGLEN(sv) < 0 && LvSTARGOFF(sv) > AvFILL(av))
2509 LvTARG(sv) = NULL; /* array can't be extended */
2510 else {
2511 SV* const * const svp = av_fetch(av, LvSTARGOFF(sv), TRUE);
2512 if (!svp || !(value = *svp))
2513 Perl_croak(aTHX_ PL_no_aelem, LvSTARGOFF(sv));
2514 }
2515 }
2516 SvREFCNT_inc_simple_void(value);
2517 SvREFCNT_dec(LvTARG(sv));
2518 LvTARG(sv) = value;
2519 LvTARGLEN(sv) = 0;
2520 SvREFCNT_dec(mg->mg_obj);
2521 mg->mg_obj = NULL;
2522 mg->mg_flags &= ~MGf_REFCOUNTED;
2523}
2524
2525int
2526Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
2527{
2528 PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS;
2529 Perl_sv_kill_backrefs(aTHX_ sv, MUTABLE_AV(mg->mg_obj));
2530 return 0;
2531}
2532
2533int
2534Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
2535{
2536 PERL_ARGS_ASSERT_MAGIC_SETMGLOB;
2537 PERL_UNUSED_CONTEXT;
2538 PERL_UNUSED_ARG(sv);
2539 mg->mg_len = -1;
2540 return 0;
2541}
2542
2543int
2544Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
2545{
2546 const struct ufuncs * const uf = (struct ufuncs *)mg->mg_ptr;
2547
2548 PERL_ARGS_ASSERT_MAGIC_SETUVAR;
2549
2550 if (uf && uf->uf_set)
2551 (*uf->uf_set)(aTHX_ uf->uf_index, sv);
2552 return 0;
2553}
2554
2555int
2556Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
2557{
2558 const char type = mg->mg_type;
2559
2560 PERL_ARGS_ASSERT_MAGIC_SETREGEXP;
2561
2562 assert( type == PERL_MAGIC_fm
2563 || type == PERL_MAGIC_qr
2564 || type == PERL_MAGIC_bm);
2565 return sv_unmagic(sv, type);
2566}
2567
2568#ifdef USE_LOCALE_COLLATE
2569int
2570Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
2571{
2572 PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM;
2573
2574 /*
2575 * RenE<eacute> Descartes said "I think not."
2576 * and vanished with a faint plop.
2577 */
2578 PERL_UNUSED_CONTEXT;
2579 PERL_UNUSED_ARG(sv);
2580 if (mg->mg_ptr) {
2581 Safefree(mg->mg_ptr);
2582 mg->mg_ptr = NULL;
2583 mg->mg_len = -1;
2584 }
2585 return 0;
2586}
2587#endif /* USE_LOCALE_COLLATE */
2588
2589/* Just clear the UTF-8 cache data. */
2590int
2591Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
2592{
2593 PERL_ARGS_ASSERT_MAGIC_SETUTF8;
2594 PERL_UNUSED_CONTEXT;
2595 PERL_UNUSED_ARG(sv);
2596 Safefree(mg->mg_ptr); /* The mg_ptr holds the pos cache. */
2597 mg->mg_ptr = NULL;
2598 mg->mg_len = -1; /* The mg_len holds the len cache. */
2599 return 0;
2600}
2601
2602int
2603Perl_magic_setlvref(pTHX_ SV *sv, MAGIC *mg)
2604{
2605 const char *bad = NULL;
2606 PERL_ARGS_ASSERT_MAGIC_SETLVREF;
2607 if (!SvROK(sv)) Perl_croak(aTHX_ "Assigned value is not a reference");
2608 switch (mg->mg_private & OPpLVREF_TYPE) {
2609 case OPpLVREF_SV:
2610 if (SvTYPE(SvRV(sv)) > SVt_PVLV)
2611 bad = " SCALAR";
2612 break;
2613 case OPpLVREF_AV:
2614 if (SvTYPE(SvRV(sv)) != SVt_PVAV)
2615 bad = "n ARRAY";
2616 break;
2617 case OPpLVREF_HV:
2618 if (SvTYPE(SvRV(sv)) != SVt_PVHV)
2619 bad = " HASH";
2620 break;
2621 case OPpLVREF_CV:
2622 if (SvTYPE(SvRV(sv)) != SVt_PVCV)
2623 bad = " CODE";
2624 }
2625 if (bad)
2626 /* diag_listed_as: Assigned value is not %s reference */
2627 Perl_croak(aTHX_ "Assigned value is not a%s reference", bad);
2628 switch (mg->mg_obj ? SvTYPE(mg->mg_obj) : 0) {
2629 case 0:
2630 {
2631 SV * const old = PAD_SV(mg->mg_len);
2632 PAD_SETSV(mg->mg_len, SvREFCNT_inc_NN(SvRV(sv)));
2633 SvREFCNT_dec(old);
2634 break;
2635 }
2636 case SVt_PVGV:
2637 gv_setref(mg->mg_obj, sv);
2638 SvSETMAGIC(mg->mg_obj);
2639 break;
2640 case SVt_PVAV:
2641 av_store((AV *)mg->mg_obj, SvIV((SV *)mg->mg_ptr),
2642 SvREFCNT_inc_simple_NN(SvRV(sv)));
2643 break;
2644 case SVt_PVHV:
2645 (void)hv_store_ent((HV *)mg->mg_obj, (SV *)mg->mg_ptr,
2646 SvREFCNT_inc_simple_NN(SvRV(sv)), 0);
2647 }
2648 if (mg->mg_flags & MGf_PERSIST)
2649 NOOP; /* This sv is in use as an iterator var and will be reused,
2650 so we must leave the magic. */
2651 else
2652 /* This sv could be returned by the assignment op, so clear the
2653 magic, as lvrefs are an implementation detail that must not be
2654 leaked to the user. */
2655 sv_unmagic(sv, PERL_MAGIC_lvref);
2656 return 0;
2657}
2658
2659static void
2660S_set_dollarzero(pTHX_ SV *sv)
2661 PERL_TSA_REQUIRES(PL_dollarzero_mutex)
2662{
2663#ifdef USE_ITHREADS
2664 dVAR;
2665#endif
2666 const char *s;
2667 STRLEN len;
2668#ifdef HAS_SETPROCTITLE
2669 /* The BSDs don't show the argv[] in ps(1) output, they
2670 * show a string from the process struct and provide
2671 * the setproctitle() routine to manipulate that. */
2672 if (PL_origalen != 1) {
2673 s = SvPV_const(sv, len);
2674# if __FreeBSD_version > 410001 || defined(__DragonFly__)
2675 /* The leading "-" removes the "perl: " prefix,
2676 * but not the "(perl) suffix from the ps(1)
2677 * output, because that's what ps(1) shows if the
2678 * argv[] is modified. */
2679 setproctitle("-%s", s);
2680# else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2681 /* This doesn't really work if you assume that
2682 * $0 = 'foobar'; will wipe out 'perl' from the $0
2683 * because in ps(1) output the result will be like
2684 * sprintf("perl: %s (perl)", s)
2685 * I guess this is a security feature:
2686 * one (a user process) cannot get rid of the original name.
2687 * --jhi */
2688 setproctitle("%s", s);
2689# endif
2690 }
2691#elif defined(__hpux) && defined(PSTAT_SETCMD)
2692 if (PL_origalen != 1) {
2693 union pstun un;
2694 s = SvPV_const(sv, len);
2695 un.pst_command = (char *)s;
2696 pstat(PSTAT_SETCMD, un, len, 0, 0);
2697 }
2698#else
2699 if (PL_origalen > 1) {
2700 I32 i;
2701 /* PL_origalen is set in perl_parse(). */
2702 s = SvPV_force(sv,len);
2703 if (len >= (STRLEN)PL_origalen-1) {
2704 /* Longer than original, will be truncated. We assume that
2705 * PL_origalen bytes are available. */
2706 Copy(s, PL_origargv[0], PL_origalen-1, char);
2707 }
2708 else {
2709 /* Shorter than original, will be padded. */
2710#ifdef PERL_DARWIN
2711 /* Special case for Mac OS X: see [perl #38868] */
2712 const int pad = 0;
2713#else
2714 /* Is the space counterintuitive? Yes.
2715 * (You were expecting \0?)
2716 * Does it work? Seems to. (In Linux 2.4.20 at least.)
2717 * --jhi */
2718 const int pad = ' ';
2719#endif
2720 Copy(s, PL_origargv[0], len, char);
2721 PL_origargv[0][len] = 0;
2722 memset(PL_origargv[0] + len + 1,
2723 pad, PL_origalen - len - 1);
2724 }
2725 PL_origargv[0][PL_origalen-1] = 0;
2726 for (i = 1; i < PL_origargc; i++)
2727 PL_origargv[i] = 0;
2728#ifdef HAS_PRCTL_SET_NAME
2729 /* Set the legacy process name in addition to the POSIX name on Linux */
2730 if (prctl(PR_SET_NAME, (unsigned long)s, 0, 0, 0) != 0) {
2731 /* diag_listed_as: SKIPME */
2732 Perl_croak(aTHX_ "Can't set $0 with prctl(): %s", Strerror(errno));
2733 }
2734#endif
2735 }
2736#endif
2737}
2738
2739int
2740Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
2741{
2742#ifdef USE_ITHREADS
2743 dVAR;
2744#endif
2745 I32 paren;
2746 const REGEXP * rx;
2747 I32 i;
2748 STRLEN len;
2749 MAGIC *tmg;
2750
2751 PERL_ARGS_ASSERT_MAGIC_SET;
2752
2753 if (!mg->mg_ptr) {
2754 paren = mg->mg_len;
2755 if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
2756 setparen_got_rx:
2757 CALLREG_NUMBUF_STORE((REGEXP * const)rx,paren,sv);
2758 } else {
2759 /* Croak with a READONLY error when a numbered match var is
2760 * set without a previous pattern match. Unless it's C<local $1>
2761 */
2762 croakparen:
2763 if (!PL_localizing) {
2764 Perl_croak_no_modify();
2765 }
2766 }
2767 return 0;
2768 }
2769
2770 switch (*mg->mg_ptr) {
2771 case '\001': /* ^A */
2772 if (SvOK(sv)) sv_copypv(PL_bodytarget, sv);
2773 else SvOK_off(PL_bodytarget);
2774 FmLINES(PL_bodytarget) = 0;
2775 if (SvPOK(PL_bodytarget)) {
2776 char *s = SvPVX(PL_bodytarget);
2777 while ( ((s = strchr(s, '\n'))) ) {
2778 FmLINES(PL_bodytarget)++;
2779 s++;
2780 }
2781 }
2782 /* mg_set() has temporarily made sv non-magical */
2783 if (TAINTING_get) {
2784 if ((tmg = mg_find(sv,PERL_MAGIC_taint)) && tmg->mg_len & 1)
2785 SvTAINTED_on(PL_bodytarget);
2786 else
2787 SvTAINTED_off(PL_bodytarget);
2788 }
2789 break;
2790 case '\003': /* ^C */
2791 PL_minus_c = cBOOL(SvIV(sv));
2792 break;
2793
2794 case '\004': /* ^D */
2795#ifdef DEBUGGING
2796 {
2797 const char *s = SvPV_nolen_const(sv);
2798 PL_debug = get_debug_opts(&s, 0) | DEBUG_TOP_FLAG;
2799 if (DEBUG_x_TEST || DEBUG_B_TEST)
2800 dump_all_perl(!DEBUG_B_TEST);
2801 }
2802#else
2803 PL_debug = (SvIV(sv)) | DEBUG_TOP_FLAG;
2804#endif
2805 break;
2806 case '\005': /* ^E */
2807 if (*(mg->mg_ptr+1) == '\0') {
2808#ifdef VMS
2809 set_vaxc_errno(SvIV(sv));
2810#else
2811# ifdef WIN32
2812 SetLastError( SvIV(sv) );
2813# else
2814# ifdef OS2
2815 os2_setsyserrno(SvIV(sv));
2816# else
2817 /* will anyone ever use this? */
2818 SETERRNO(SvIV(sv), 4);
2819# endif
2820# endif
2821#endif
2822 }
2823 else if (strEQ(mg->mg_ptr + 1, "NCODING") && SvOK(sv))
2824 Perl_croak(aTHX_ "${^ENCODING} is no longer supported");
2825 break;
2826 case '\006': /* ^F */
2827 PL_maxsysfd = SvIV(sv);
2828 break;
2829 case '\010': /* ^H */
2830 {
2831 U32 save_hints = PL_hints;
2832 PL_hints = SvUV(sv);
2833
2834 /* If wasn't UTF-8, and now is, notify the parser */
2835 if ((PL_hints & HINT_UTF8) && ! (save_hints & HINT_UTF8)) {
2836 notify_parser_that_changed_to_utf8();
2837 }
2838 }
2839 break;
2840 case '\011': /* ^I */ /* NOT \t in EBCDIC */
2841 Safefree(PL_inplace);
2842 PL_inplace = SvOK(sv) ? savesvpv(sv) : NULL;
2843 break;
2844 case '\016': /* ^N */
2845 if (PL_curpm && (rx = PM_GETRE(PL_curpm))
2846 && (paren = RX_LASTCLOSEPAREN(rx))) goto setparen_got_rx;
2847 goto croakparen;
2848 case '\017': /* ^O */
2849 if (*(mg->mg_ptr+1) == '\0') {
2850 Safefree(PL_osname);
2851 PL_osname = NULL;
2852 if (SvOK(sv)) {
2853 TAINT_PROPER("assigning to $^O");
2854 PL_osname = savesvpv(sv);
2855 }
2856 }
2857 else if (strEQ(mg->mg_ptr, "\017PEN")) {
2858 STRLEN len;
2859 const char *const start = SvPV(sv, len);
2860 const char *out = (const char*)memchr(start, '\0', len);
2861 SV *tmp;
2862
2863
2864 PL_compiling.cop_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2865 PL_hints |= HINT_LEXICAL_IO_IN | HINT_LEXICAL_IO_OUT;
2866
2867 /* Opening for input is more common than opening for output, so
2868 ensure that hints for input are sooner on linked list. */
2869 tmp = out ? newSVpvn_flags(out + 1, start + len - out - 1,
2870 SvUTF8(sv))
2871 : newSVpvs_flags("", SvUTF8(sv));
2872 (void)hv_stores(GvHV(PL_hintgv), "open>", tmp);
2873 mg_set(tmp);
2874
2875 tmp = newSVpvn_flags(start, out ? (STRLEN)(out - start) : len,
2876 SvUTF8(sv));
2877 (void)hv_stores(GvHV(PL_hintgv), "open<", tmp);
2878 mg_set(tmp);
2879 }
2880 break;
2881 case '\020': /* ^P */
2882 PL_perldb = SvIV(sv);
2883 if (PL_perldb && !PL_DBsingle)
2884 init_debugger();
2885 break;
2886 case '\024': /* ^T */
2887#ifdef BIG_TIME
2888 PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2889#else
2890 PL_basetime = (Time_t)SvIV(sv);
2891#endif
2892 break;
2893 case '\025': /* ^UTF8CACHE */
2894 if (strEQ(mg->mg_ptr+1, "TF8CACHE")) {
2895 PL_utf8cache = (signed char) sv_2iv(sv);
2896 }
2897 break;
2898 case '\027': /* ^W & $^WARNING_BITS */
2899 if (*(mg->mg_ptr+1) == '\0') {
2900 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2901 i = SvIV(sv);
2902 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2903 | (i ? G_WARN_ON : G_WARN_OFF) ;
2904 }
2905 }
2906 else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2907 if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2908 if (!SvPOK(sv)) {
2909 PL_compiling.cop_warnings = pWARN_STD;
2910 break;
2911 }
2912 {
2913 STRLEN len, i;
2914 int accumulate = 0 ;
2915 int any_fatals = 0 ;
2916 const char * const ptr = SvPV_const(sv, len) ;
2917 for (i = 0 ; i < len ; ++i) {
2918 accumulate |= ptr[i] ;
2919 any_fatals |= (ptr[i] & 0xAA) ;
2920 }
2921 if (!accumulate) {
2922 if (!specialWARN(PL_compiling.cop_warnings))
2923 PerlMemShared_free(PL_compiling.cop_warnings);
2924 PL_compiling.cop_warnings = pWARN_NONE;
2925 }
2926 /* Yuck. I can't see how to abstract this: */
2927 else if (isWARN_on(
2928 ((STRLEN *)SvPV_nolen_const(sv)) - 1,
2929 WARN_ALL)
2930 && !any_fatals)
2931 {
2932 if (!specialWARN(PL_compiling.cop_warnings))
2933 PerlMemShared_free(PL_compiling.cop_warnings);
2934 PL_compiling.cop_warnings = pWARN_ALL;
2935 PL_dowarn |= G_WARN_ONCE ;
2936 }
2937 else {
2938 STRLEN len;
2939 const char *const p = SvPV_const(sv, len);
2940
2941 PL_compiling.cop_warnings
2942 = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings,
2943 p, len);
2944
2945 if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2946 PL_dowarn |= G_WARN_ONCE ;
2947 }
2948
2949 }
2950 }
2951 }
2952#ifdef WIN32
2953 else if (strEQ(mg->mg_ptr+1, "IN32_SLOPPY_STAT")) {
2954 w32_sloppystat = (bool)sv_true(sv);
2955 }
2956#endif
2957 break;
2958 case '.':
2959 if (PL_localizing) {
2960 if (PL_localizing == 1)
2961 SAVESPTR(PL_last_in_gv);
2962 }
2963 else if (SvOK(sv) && GvIO(PL_last_in_gv))
2964 IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2965 break;
2966 case '^':
2967 Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2968 IoTOP_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2969 IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2970 break;
2971 case '~':
2972 Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2973 IoFMT_NAME(GvIOp(PL_defoutgv)) = savesvpv(sv);
2974 IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchsv(sv, GV_ADD, SVt_PVIO);
2975 break;
2976 case '=':
2977 IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIV(sv));
2978 break;
2979 case '-':
2980 IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIV(sv));
2981 if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2982 IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2983 break;
2984 case '%':
2985 IoPAGE(GvIOp(PL_defoutgv)) = (SvIV(sv));
2986 break;
2987 case '|':
2988 {
2989 IO * const io = GvIO(PL_defoutgv);
2990 if(!io)
2991 break;
2992 if ((SvIV(sv)) == 0)
2993 IoFLAGS(io) &= ~IOf_FLUSH;
2994 else {
2995 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2996 PerlIO *ofp = IoOFP(io);
2997 if (ofp)
2998 (void)PerlIO_flush(ofp);
2999 IoFLAGS(io) |= IOf_FLUSH;
3000 }
3001 }
3002 }
3003 break;
3004 case '/':
3005 {
3006 if (SvROK(sv)) {
3007 SV *referent = SvRV(sv);
3008 const char *reftype = sv_reftype(referent, 0);
3009 /* XXX: dodgy type check: This leaves me feeling dirty, but
3010 * the alternative is to copy pretty much the entire
3011 * sv_reftype() into this routine, or to do a full string
3012 * comparison on the return of sv_reftype() both of which
3013 * make me feel worse! NOTE, do not modify this comment
3014 * without reviewing the corresponding comment in
3015 * sv_reftype(). - Yves */
3016 if (reftype[0] == 'S' || reftype[0] == 'L') {
3017 IV val = SvIV(referent);
3018 if (val <= 0) {
3019 sv_setsv(sv, PL_rs);
3020 Perl_croak(aTHX_ "Setting $/ to a reference to %s is forbidden",
3021 val < 0 ? "a negative integer" : "zero");
3022 }
3023 } else {
3024 sv_setsv(sv, PL_rs);
3025 /* diag_listed_as: Setting $/ to %s reference is forbidden */
3026 Perl_croak(aTHX_ "Setting $/ to a%s %s reference is forbidden",
3027 *reftype == 'A' ? "n" : "", reftype);
3028 }
3029 }
3030 SvREFCNT_dec(PL_rs);
3031 PL_rs = newSVsv(sv);
3032 }
3033 break;
3034 case '\\':
3035 SvREFCNT_dec(PL_ors_sv);
3036 if (SvOK(sv)) {
3037 PL_ors_sv = newSVsv(sv);
3038 }
3039 else {
3040 PL_ors_sv = NULL;
3041 }
3042 break;
3043 case '[':
3044 if (SvIV(sv) != 0)
3045 Perl_croak(aTHX_ "Assigning non-zero to $[ is no longer possible");
3046 break;
3047 case '?':
3048#ifdef COMPLEX_STATUS
3049 if (PL_localizing == 2) {
3050 SvUPGRADE(sv, SVt_PVLV);
3051 PL_statusvalue = LvTARGOFF(sv);
3052 PL_statusvalue_vms = LvTARGLEN(sv);
3053 }
3054 else
3055#endif
3056#ifdef VMSISH_STATUS
3057 if (VMSISH_STATUS)
3058 STATUS_NATIVE_CHILD_SET((U32)SvIV(sv));
3059 else
3060#endif
3061 STATUS_UNIX_EXIT_SET(SvIV(sv));
3062 break;
3063 case '!':
3064 {
3065#ifdef VMS
3066# define PERL_VMS_BANG vaxc$errno
3067#else
3068# define PERL_VMS_BANG 0
3069#endif
3070#if defined(WIN32) && ! defined(UNDER_CE)
3071 SETERRNO(win32_get_errno(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0),
3072 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
3073#else
3074 SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
3075 (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
3076#endif
3077 }
3078 break;
3079 case '<':
3080 {
3081 /* XXX $< currently silently ignores failures */
3082 const Uid_t new_uid = SvUID(sv);
3083 PL_delaymagic_uid = new_uid;
3084 if (PL_delaymagic) {
3085 PL_delaymagic |= DM_RUID;
3086 break; /* don't do magic till later */
3087 }
3088#ifdef HAS_SETRUID
3089 PERL_UNUSED_RESULT(setruid(new_uid));
3090#else
3091#ifdef HAS_SETREUID
3092 PERL_UNUSED_RESULT(setreuid(new_uid, (Uid_t)-1));
3093#else
3094#ifdef HAS_SETRESUID
3095 PERL_UNUSED_RESULT(setresuid(new_uid, (Uid_t)-1, (Uid_t)-1));
3096#else
3097 if (new_uid == PerlProc_geteuid()) { /* special case $< = $> */
3098#ifdef PERL_DARWIN
3099 /* workaround for Darwin's setuid peculiarity, cf [perl #24122] */
3100 if (new_uid != 0 && PerlProc_getuid() == 0)
3101 PERL_UNUSED_RESULT(PerlProc_setuid(0));
3102#endif
3103 PERL_UNUSED_RESULT(PerlProc_setuid(new_uid));
3104 } else {
3105 Perl_croak(aTHX_ "setruid() not implemented");
3106 }
3107#endif
3108#endif
3109#endif
3110 break;
3111 }
3112 case '>':
3113 {
3114 /* XXX $> currently silently ignores failures */
3115 const Uid_t new_euid = SvUID(sv);
3116 PL_delaymagic_euid = new_euid;
3117 if (PL_delaymagic) {
3118 PL_delaymagic |= DM_EUID;
3119 break; /* don't do magic till later */
3120 }
3121#ifdef HAS_SETEUID
3122 PERL_UNUSED_RESULT(seteuid(new_euid));
3123#else
3124#ifdef HAS_SETREUID
3125 PERL_UNUSED_RESULT(setreuid((Uid_t)-1, new_euid));
3126#else
3127#ifdef HAS_SETRESUID
3128 PERL_UNUSED_RESULT(setresuid((Uid_t)-1, new_euid, (Uid_t)-1));
3129#else
3130 if (new_euid == PerlProc_getuid()) /* special case $> = $< */
3131 PERL_UNUSED_RESULT(PerlProc_setuid(new_euid));
3132 else {
3133 Perl_croak(aTHX_ "seteuid() not implemented");
3134 }
3135#endif
3136#endif
3137#endif
3138 break;
3139 }
3140 case '(':
3141 {
3142 /* XXX $( currently silently ignores failures */
3143 const Gid_t new_gid = SvGID(sv);
3144 PL_delaymagic_gid = new_gid;
3145 if (PL_delaymagic) {
3146 PL_delaymagic |= DM_RGID;
3147 break; /* don't do magic till later */
3148 }
3149#ifdef HAS_SETRGID
3150 PERL_UNUSED_RESULT(setrgid(new_gid));
3151#else
3152#ifdef HAS_SETREGID
3153 PERL_UNUSED_RESULT(setregid(new_gid, (Gid_t)-1));
3154#else
3155#ifdef HAS_SETRESGID
3156 PERL_UNUSED_RESULT(setresgid(new_gid, (Gid_t)-1, (Gid_t) -1));
3157#else
3158 if (new_gid == PerlProc_getegid()) /* special case $( = $) */
3159 PERL_UNUSED_RESULT(PerlProc_setgid(new_gid));
3160 else {
3161 Perl_croak(aTHX_ "setrgid() not implemented");
3162 }
3163#endif
3164#endif
3165#endif
3166 break;
3167 }
3168 case ')':
3169 {
3170/* (hv) best guess: maybe we'll need configure probes to do a better job,
3171 * but you can override it if you need to.
3172 */
3173#ifndef INVALID_GID
3174#define INVALID_GID ((Gid_t)-1)
3175#endif
3176 /* XXX $) currently silently ignores failures */
3177 Gid_t new_egid;
3178#ifdef HAS_SETGROUPS
3179 {
3180 const char *p = SvPV_const(sv, len);
3181 Groups_t *gary = NULL;
3182 const char* endptr;
3183 UV uv;
3184#ifdef _SC_NGROUPS_MAX
3185 int maxgrp = sysconf(_SC_NGROUPS_MAX);
3186
3187 if (maxgrp < 0)
3188 maxgrp = NGROUPS;
3189#else
3190 int maxgrp = NGROUPS;
3191#endif
3192
3193 while (isSPACE(*p))
3194 ++p;
3195 if (grok_atoUV(p, &uv, &endptr))
3196 new_egid = (Gid_t)uv;
3197 else {
3198 new_egid = INVALID_GID;
3199 endptr = NULL;
3200 }
3201 for (i = 0; i < maxgrp; ++i) {
3202 if (endptr == NULL)
3203 break;
3204 p = endptr;
3205 while (isSPACE(*p))
3206 ++p;
3207 if (!*p)
3208 break;
3209 if (!gary)
3210 Newx(gary, i + 1, Groups_t);
3211 else
3212 Renew(gary, i + 1, Groups_t);
3213 if (grok_atoUV(p, &uv, &endptr))
3214 gary[i] = (Groups_t)uv;
3215 else {
3216 gary[i] = INVALID_GID;
3217 endptr = NULL;
3218 }
3219 }
3220 if (i)
3221 PERL_UNUSED_RESULT(setgroups(i, gary));
3222 Safefree(gary);
3223 }
3224#else /* HAS_SETGROUPS */
3225 new_egid = SvGID(sv);
3226#endif /* HAS_SETGROUPS */
3227 PL_delaymagic_egid = new_egid;
3228 if (PL_delaymagic) {
3229 PL_delaymagic |= DM_EGID;
3230 break; /* don't do magic till later */
3231 }
3232#ifdef HAS_SETEGID
3233 PERL_UNUSED_RESULT(setegid(new_egid));
3234#else
3235#ifdef HAS_SETREGID
3236 PERL_UNUSED_RESULT(setregid((Gid_t)-1, new_egid));
3237#else
3238#ifdef HAS_SETRESGID
3239 PERL_UNUSED_RESULT(setresgid((Gid_t)-1, new_egid, (Gid_t)-1));
3240#else
3241 if (new_egid == PerlProc_getgid()) /* special case $) = $( */
3242 PERL_UNUSED_RESULT(PerlProc_setgid(new_egid));
3243 else {
3244 Perl_croak(aTHX_ "setegid() not implemented");
3245 }
3246#endif
3247#endif
3248#endif
3249 break;
3250 }
3251 case ':':
3252 PL_chopset = SvPV_force(sv,len);
3253 break;
3254 case '$': /* $$ */
3255 /* Store the pid in mg->mg_obj so we can tell when a fork has
3256 occurred. mg->mg_obj points to *$ by default, so clear it. */
3257 if (isGV(mg->mg_obj)) {
3258 if (mg->mg_flags & MGf_REFCOUNTED) /* probably never true */
3259 SvREFCNT_dec(mg->mg_obj);
3260 mg->mg_flags |= MGf_REFCOUNTED;
3261 mg->mg_obj = newSViv((IV)PerlProc_getpid());
3262 }
3263 else sv_setiv(mg->mg_obj, (IV)PerlProc_getpid());
3264 break;
3265 case '0':
3266 LOCK_DOLLARZERO_MUTEX;
3267 S_set_dollarzero(aTHX_ sv);
3268 UNLOCK_DOLLARZERO_MUTEX;
3269 break;
3270 }
3271 return 0;
3272}
3273
3274I32
3275Perl_whichsig_sv(pTHX_ SV *sigsv)
3276{
3277 const char *sigpv;
3278 STRLEN siglen;
3279 PERL_ARGS_ASSERT_WHICHSIG_SV;
3280 sigpv = SvPV_const(sigsv, siglen);
3281 return whichsig_pvn(sigpv, siglen);
3282}
3283
3284I32
3285Perl_whichsig_pv(pTHX_ const char *sig)
3286{
3287 PERL_ARGS_ASSERT_WHICHSIG_PV;
3288 return whichsig_pvn(sig, strlen(sig));
3289}
3290
3291I32
3292Perl_whichsig_pvn(pTHX_ const char *sig, STRLEN len)
3293{
3294 char* const* sigv;
3295
3296 PERL_ARGS_ASSERT_WHICHSIG_PVN;
3297 PERL_UNUSED_CONTEXT;
3298
3299 for (sigv = (char* const*)PL_sig_name; *sigv; sigv++)
3300 if (strlen(*sigv) == len && memEQ(sig,*sigv, len))
3301 return PL_sig_num[sigv - (char* const*)PL_sig_name];
3302#ifdef SIGCLD
3303 if (memEQs(sig, len, "CHLD"))
3304 return SIGCLD;
3305#endif
3306#ifdef SIGCHLD
3307 if (memEQs(sig, len, "CLD"))
3308 return SIGCHLD;
3309#endif
3310 return -1;
3311}
3312
3313Signal_t
3314#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
3315Perl_sighandler(int sig, siginfo_t *sip, void *uap)
3316#else
3317Perl_sighandler(int sig)
3318#endif
3319{
3320#ifdef PERL_GET_SIG_CONTEXT
3321 dTHXa(PERL_GET_SIG_CONTEXT);
3322#else
3323 dTHX;
3324#endif
3325 dSP;
3326 GV *gv = NULL;
3327 SV *sv = NULL;
3328 SV * const tSv = PL_Sv;
3329 CV *cv = NULL;
3330 OP *myop = PL_op;
3331 U32 flags = 0;
3332 XPV * const tXpv = PL_Xpv;
3333 I32 old_ss_ix = PL_savestack_ix;
3334 SV *errsv_save = NULL;
3335
3336
3337 if (!PL_psig_ptr[sig]) {
3338 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
3339 PL_sig_name[sig]);
3340 exit(sig);
3341 }
3342
3343 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG) {
3344 /* Max number of items pushed there is 3*n or 4. We cannot fix
3345 infinity, so we fix 4 (in fact 5): */
3346 if (PL_savestack_ix + 15 <= PL_savestack_max) {
3347 flags |= 1;
3348 PL_savestack_ix += 5; /* Protect save in progress. */
3349 SAVEDESTRUCTOR_X(S_unwind_handler_stack, NULL);
3350 }
3351 }
3352 /* sv_2cv is too complicated, try a simpler variant first: */
3353 if (!SvROK(PL_psig_ptr[sig]) || !(cv = MUTABLE_CV(SvRV(PL_psig_ptr[sig])))
3354 || SvTYPE(cv) != SVt_PVCV) {
3355 HV *st;
3356 cv = sv_2cv(PL_psig_ptr[sig], &st, &gv, GV_ADD);
3357 }
3358
3359 if (!cv || !CvROOT(cv)) {
3360 const HEK * const hek = gv
3361 ? GvENAME_HEK(gv)
3362 : cv && CvNAMED(cv)
3363 ? CvNAME_HEK(cv)
3364 : cv && CvGV(cv) ? GvENAME_HEK(CvGV(cv)) : NULL;
3365 if (hek)
3366 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
3367 "SIG%s handler \"%" HEKf "\" not defined.\n",
3368 PL_sig_name[sig], HEKfARG(hek));
3369 /* diag_listed_as: SIG%s handler "%s" not defined */
3370 else Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
3371 "SIG%s handler \"__ANON__\" not defined.\n",
3372 PL_sig_name[sig]);
3373 goto cleanup;
3374 }
3375
3376 sv = PL_psig_name[sig]
3377 ? SvREFCNT_inc_NN(PL_psig_name[sig])
3378 : newSVpv(PL_sig_name[sig],0);
3379 flags |= 8;
3380 SAVEFREESV(sv);
3381
3382 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG) {
3383 /* make sure our assumption about the size of the SAVEs are correct:
3384 * 3 for SAVEDESTRUCTOR_X, 2 for SAVEFREESV */
3385 assert(old_ss_ix + 2 + ((flags & 1) ? 3+5 : 0) == PL_savestack_ix);
3386 }
3387
3388 PUSHSTACKi(PERLSI_SIGNAL);
3389 PUSHMARK(SP);
3390 PUSHs(sv);
3391#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
3392 {
3393 struct sigaction oact;
3394
3395 if (sigaction(sig, 0, &oact) == 0 && oact.sa_flags & SA_SIGINFO) {
3396 if (sip) {
3397 HV *sih = newHV();
3398 SV *rv = newRV_noinc(MUTABLE_SV(sih));
3399 /* The siginfo fields signo, code, errno, pid, uid,
3400 * addr, status, and band are defined by POSIX/SUSv3. */
3401 (void)hv_stores(sih, "signo", newSViv(sip->si_signo));
3402 (void)hv_stores(sih, "code", newSViv(sip->si_code));
3403#ifdef HAS_SIGINFO_SI_ERRNO
3404 (void)hv_stores(sih, "errno", newSViv(sip->si_errno));
3405#endif
3406#ifdef HAS_SIGINFO_SI_STATUS
3407 (void)hv_stores(sih, "status", newSViv(sip->si_status));
3408#endif
3409#ifdef HAS_SIGINFO_SI_UID
3410 {
3411 SV *uid = newSV(0);
3412 sv_setuid(uid, sip->si_uid);
3413 (void)hv_stores(sih, "uid", uid);
3414 }
3415#endif
3416#ifdef HAS_SIGINFO_SI_PID
3417 (void)hv_stores(sih, "pid", newSViv(sip->si_pid));
3418#endif
3419#ifdef HAS_SIGINFO_SI_ADDR
3420 (void)hv_stores(sih, "addr", newSVuv(PTR2UV(sip->si_addr)));
3421#endif
3422#ifdef HAS_SIGINFO_SI_BAND
3423 (void)hv_stores(sih, "band", newSViv(sip->si_band));
3424#endif
3425 EXTEND(SP, 2);
3426 PUSHs(rv);
3427 mPUSHp((char *)sip, sizeof(*sip));
3428 }
3429
3430 }
3431 }
3432#endif
3433 PUTBACK;
3434
3435 errsv_save = newSVsv(ERRSV);
3436
3437 call_sv(MUTABLE_SV(cv), G_DISCARD|G_EVAL);
3438
3439 POPSTACK;
3440 {
3441 SV * const errsv = ERRSV;
3442 if (SvTRUE_NN(errsv)) {
3443 SvREFCNT_dec(errsv_save);
3444#ifndef PERL_MICRO
3445 /* Handler "died", for example to get out of a restart-able read().
3446 * Before we re-do that on its behalf re-enable the signal which was
3447 * blocked by the system when we entered.
3448 */
3449#ifdef HAS_SIGPROCMASK
3450#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
3451 if (sip || uap)
3452#endif
3453 {
3454 sigset_t set;
3455 sigemptyset(&set);
3456 sigaddset(&set,sig);
3457 sigprocmask(SIG_UNBLOCK, &set, NULL);
3458 }
3459#else
3460 /* Not clear if this will work */
3461 (void)rsignal(sig, SIG_IGN);
3462 (void)rsignal(sig, PL_csighandlerp);
3463#endif
3464#endif /* !PERL_MICRO */
3465 die_sv(errsv);
3466 }
3467 else {
3468 sv_setsv(errsv, errsv_save);
3469 SvREFCNT_dec(errsv_save);
3470 }
3471 }
3472
3473 cleanup:
3474 /* pop any of SAVEFREESV, SAVEDESTRUCTOR_X and "save in progress" */
3475 PL_savestack_ix = old_ss_ix;
3476 if (flags & 8)
3477 SvREFCNT_dec_NN(sv);
3478 PL_op = myop; /* Apparently not needed... */
3479
3480 PL_Sv = tSv; /* Restore global temporaries. */
3481 PL_Xpv = tXpv;
3482 return;
3483}
3484
3485
3486static void
3487S_restore_magic(pTHX_ const void *p)
3488{
3489 MGS* const mgs = SSPTR(PTR2IV(p), MGS*);
3490 SV* const sv = mgs->mgs_sv;
3491 bool bumped;
3492
3493 if (!sv)
3494 return;
3495
3496 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3497 SvTEMP_off(sv); /* if it's still magical, this value isn't temporary */
3498 if (mgs->mgs_flags)
3499 SvFLAGS(sv) |= mgs->mgs_flags;
3500 else
3501 mg_magical(sv);
3502 }
3503
3504 bumped = mgs->mgs_bumped;
3505 mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
3506
3507 /* If we're still on top of the stack, pop us off. (That condition
3508 * will be satisfied if restore_magic was called explicitly, but *not*
3509 * if it's being called via leave_scope.)
3510 * The reason for doing this is that otherwise, things like sv_2cv()
3511 * may leave alloc gunk on the savestack, and some code
3512 * (e.g. sighandler) doesn't expect that...
3513 */
3514 if (PL_savestack_ix == mgs->mgs_ss_ix)
3515 {
3516 UV popval = SSPOPUV;
3517 assert(popval == SAVEt_DESTRUCTOR_X);
3518 PL_savestack_ix -= 2;
3519 popval = SSPOPUV;
3520 assert((popval & SAVE_MASK) == SAVEt_ALLOC);
3521 PL_savestack_ix -= popval >> SAVE_TIGHT_SHIFT;
3522 }
3523 if (bumped) {
3524 if (SvREFCNT(sv) == 1) {
3525 /* We hold the last reference to this SV, which implies that the
3526 SV was deleted as a side effect of the routines we called.
3527 So artificially keep it alive a bit longer.
3528 We avoid turning on the TEMP flag, which can cause the SV's
3529 buffer to get stolen (and maybe other stuff). */
3530 sv_2mortal(sv);
3531 SvTEMP_off(sv);
3532 }
3533 else
3534 SvREFCNT_dec_NN(sv); /* undo the inc in S_save_magic() */
3535 }
3536}
3537
3538/* clean up the mess created by Perl_sighandler().
3539 * Note that this is only called during an exit in a signal handler;
3540 * a die is trapped by the call_sv() and the SAVEDESTRUCTOR_X manually
3541 * skipped over. */
3542
3543static void
3544S_unwind_handler_stack(pTHX_ const void *p)
3545{
3546 PERL_UNUSED_ARG(p);
3547
3548 PL_savestack_ix -= 5; /* Unprotect save in progress. */
3549}
3550
3551/*
3552=for apidoc magic_sethint
3553
3554Triggered by a store to C<%^H>, records the key/value pair to
3555C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
3556anything that would need a deep copy. Maybe we should warn if we find a
3557reference.
3558
3559=cut
3560*/
3561int
3562Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg)
3563{
3564 SV *key = (mg->mg_len == HEf_SVKEY) ? MUTABLE_SV(mg->mg_ptr)
3565 : newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP);
3566
3567 PERL_ARGS_ASSERT_MAGIC_SETHINT;
3568
3569 /* mg->mg_obj isn't being used. If needed, it would be possible to store
3570 an alternative leaf in there, with PL_compiling.cop_hints being used if
3571 it's NULL. If needed for threads, the alternative could lock a mutex,
3572 or take other more complex action. */
3573
3574 /* Something changed in %^H, so it will need to be restored on scope exit.
3575 Doing this here saves a lot of doing it manually in perl code (and
3576 forgetting to do it, and consequent subtle errors. */
3577 PL_hints |= HINT_LOCALIZE_HH;
3578 CopHINTHASH_set(&PL_compiling,
3579 cophh_store_sv(CopHINTHASH_get(&PL_compiling), key, 0, sv, 0));
3580 return 0;
3581}
3582
3583/*
3584=for apidoc magic_clearhint
3585
3586Triggered by a delete from C<%^H>, records the key to
3587C<PL_compiling.cop_hints_hash>.
3588
3589=cut
3590*/
3591int
3592Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg)
3593{
3594 PERL_ARGS_ASSERT_MAGIC_CLEARHINT;
3595 PERL_UNUSED_ARG(sv);
3596
3597 PL_hints |= HINT_LOCALIZE_HH;
3598 CopHINTHASH_set(&PL_compiling,
3599 mg->mg_len == HEf_SVKEY
3600 ? cophh_delete_sv(CopHINTHASH_get(&PL_compiling),
3601 MUTABLE_SV(mg->mg_ptr), 0, 0)
3602 : cophh_delete_pvn(CopHINTHASH_get(&PL_compiling),
3603 mg->mg_ptr, mg->mg_len, 0, 0));
3604 return 0;
3605}
3606
3607/*
3608=for apidoc magic_clearhints
3609
3610Triggered by clearing C<%^H>, resets C<PL_compiling.cop_hints_hash>.
3611
3612=cut
3613*/
3614int
3615Perl_magic_clearhints(pTHX_ SV *sv, MAGIC *mg)
3616{
3617 PERL_ARGS_ASSERT_MAGIC_CLEARHINTS;
3618 PERL_UNUSED_ARG(sv);
3619 PERL_UNUSED_ARG(mg);
3620 cophh_free(CopHINTHASH_get(&PL_compiling));
3621 CopHINTHASH_set(&PL_compiling, cophh_new_empty());
3622 return 0;
3623}
3624
3625int
3626Perl_magic_copycallchecker(pTHX_ SV *sv, MAGIC *mg, SV *nsv,
3627 const char *name, I32 namlen)
3628{
3629 MAGIC *nmg;
3630
3631 PERL_ARGS_ASSERT_MAGIC_COPYCALLCHECKER;
3632 PERL_UNUSED_ARG(sv);
3633 PERL_UNUSED_ARG(name);
3634 PERL_UNUSED_ARG(namlen);
3635
3636 sv_magic(nsv, &PL_sv_undef, mg->mg_type, NULL, 0);
3637 nmg = mg_find(nsv, mg->mg_type);
3638 assert(nmg);
3639 if (nmg->mg_flags & MGf_REFCOUNTED) SvREFCNT_dec(nmg->mg_obj);
3640 nmg->mg_ptr = mg->mg_ptr;
3641 nmg->mg_obj = SvREFCNT_inc_simple(mg->mg_obj);
3642 nmg->mg_flags |= MGf_REFCOUNTED;
3643 return 1;
3644}
3645
3646int
3647Perl_magic_setdebugvar(pTHX_ SV *sv, MAGIC *mg) {
3648 PERL_ARGS_ASSERT_MAGIC_SETDEBUGVAR;
3649
3650#if DBVARMG_SINGLE != 0
3651 assert(mg->mg_private >= DBVARMG_SINGLE);
3652#endif
3653 assert(mg->mg_private < DBVARMG_COUNT);
3654
3655 PL_DBcontrol[mg->mg_private] = SvIV_nomg(sv);
3656
3657 return 1;
3658}
3659
3660int
3661Perl_magic_getdebugvar(pTHX_ SV *sv, MAGIC *mg) {
3662 PERL_ARGS_ASSERT_MAGIC_GETDEBUGVAR;
3663
3664#if DBVARMG_SINGLE != 0
3665 assert(mg->mg_private >= DBVARMG_SINGLE);
3666#endif
3667 assert(mg->mg_private < DBVARMG_COUNT);
3668 sv_setiv(sv, PL_DBcontrol[mg->mg_private]);
3669
3670 return 0;
3671}
3672
3673/*
3674 * ex: set ts=8 sts=4 sw=4 et:
3675 */