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