X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mg.c;h=b9310650e066b7d9e52441f350c2c003c0b33820;hb=2ddcc7aa6c936ba8e7a9703319dfd8959bb54574;hp=1355740cb346d4aeada150d3607c07b0eb2b2178;hpb=8cc95fdbe3687330bd987cea170494b4cd263d90;p=p5sagit%2Fp5-mst-13.2.git diff --git a/mg.c b/mg.c index 1355740..b931065 100644 --- a/mg.c +++ b/mg.c @@ -454,11 +454,14 @@ MAGIC *mg; #endif break; case '?': - sv_setiv(sv, (IV)STATUS_CURRENT); + { + dTHR; + sv_setiv(sv, (IV)STATUS_CURRENT); #ifdef COMPLEX_STATUS - LvTARGOFF(sv) = statusvalue; - LvTARGLEN(sv) = statusvalue_vms; + LvTARGOFF(sv) = statusvalue; + LvTARGLEN(sv) = statusvalue_vms; #endif + } break; case '^': s = IoTOP_NAME(GvIOp(defoutgv)); @@ -491,7 +494,7 @@ MAGIC *mg; case '/': break; case '[': - sv_setiv(sv, (IV)curcop->cop_arybase); + WITH_THR(sv_setiv(sv, (IV)curcop->cop_arybase)); break; case '|': sv_setiv(sv, (IV)(IoFLAGS(GvIOp(defoutgv)) & IOf_FLUSH) != 0 ); @@ -531,27 +534,20 @@ MAGIC *mg; break; case '(': sv_setiv(sv, (IV)gid); - s = buf; - (void)sprintf(s,"%d",(int)gid); + sv_setpvf(sv, "%Vd", (IV)gid); goto add_groups; case ')': sv_setiv(sv, (IV)egid); - s = buf; - (void)sprintf(s,"%d",(int)egid); + sv_setpvf(sv, "%Vd", (IV)egid); add_groups: - while (*s) s++; #ifdef HAS_GETGROUPS { Groups_t gary[NGROUPS]; - i = getgroups(NGROUPS,gary); - while (--i >= 0) { - (void)sprintf(s," %d", (int)gary[i]); - while (*s) s++; - } + while (--i >= 0) + sv_catpvf(sv, " %Vd", (IV)gary[i]); } #endif - sv_setpv(sv,buf); SvIOK_on(sv); /* what a wonderful hack! */ break; case '*': @@ -634,9 +630,11 @@ MAGIC* mg; while (s < strend) { struct stat st; - s = cpytill(tokenbuf, s, strend, ':', &i); + s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, + s, strend, ':', &i); s++; - if (*tokenbuf != '/' + if (i >= sizeof tokenbuf /* too long -- assume the worst */ + || *tokenbuf != '/' || (Stat(tokenbuf, &st) == 0 && (st.st_mode & 2)) ) { MgTAINTEDDIR_on(mg); return 0; @@ -670,6 +668,7 @@ MAGIC* mg; if(psig_ptr[i]) sv_setsv(sv,psig_ptr[i]); else { + dTHR; /* just for SvREFCNT_inc */ Sighandler_t sigstate = rsignal_state(i); /* cache state so we don't fetch it again */ @@ -709,6 +708,7 @@ magic_setsig(sv,mg) SV* sv; MAGIC* mg; { + dTHR; register char *s; I32 i; SV** svp; @@ -769,10 +769,8 @@ MAGIC* mg; * access to a known hint bit in a known OP, we can't * tell whether HINT_STRICT_REFS is in force or not. */ - if (!strchr(s,':') && !strchr(s,'\'')) { - sprintf(tokenbuf, "main::%s",s); - sv_setpv(sv,tokenbuf); - } + if (!strchr(s,':') && !strchr(s,'\'')) + sv_setpv(sv, form("main::%s", s)); if (i) (void)rsignal(i, sighandler); else @@ -822,6 +820,7 @@ SV* sv; MAGIC* mg; char *meth; { + dTHR; dSP; ENTER; @@ -863,6 +862,7 @@ magic_setpack(sv,mg) SV* sv; MAGIC* mg; { + dTHR; dSP; PUSHMARK(sp); @@ -896,6 +896,7 @@ int magic_wipepack(sv,mg) SV* sv; MAGIC* mg; { + dTHR; dSP; PUSHMARK(sp); @@ -913,6 +914,7 @@ SV* sv; MAGIC* mg; SV* key; { + dTHR; dSP; char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY"; @@ -946,6 +948,7 @@ magic_setdbline(sv,mg) SV* sv; MAGIC* mg; { + dTHR; OP *o; I32 i; GV* gv; @@ -967,6 +970,7 @@ magic_getarylen(sv,mg) SV* sv; MAGIC* mg; { + dTHR; sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + curcop->cop_arybase); return 0; } @@ -976,6 +980,7 @@ magic_setarylen(sv,mg) SV* sv; MAGIC* mg; { + dTHR; av_fill((AV*)mg->mg_obj, SvIV(sv) - curcop->cop_arybase); return 0; } @@ -990,6 +995,7 @@ MAGIC* mg; if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) { mg = mg_find(lsv, 'g'); if (mg && mg->mg_len >= 0) { + dTHR; sv_setiv(sv, mg->mg_len + curcop->cop_arybase); return 0; } @@ -1023,7 +1029,7 @@ MAGIC* mg; } len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv); - pos = SvIV(sv) - curcop->cop_arybase; + WITH_THR(pos = SvIV(sv) - curcop->cop_arybase); if (pos < 0) { pos += len; if (pos < 0) @@ -1100,6 +1106,7 @@ magic_settaint(sv,mg) SV* sv; MAGIC* mg; { + dTHR; if (localizing) { if (localizing == 1) mg->mg_len <<= 1; @@ -1141,6 +1148,7 @@ MAGIC* mg; targ = AvARRAY(av)[LvTARGOFF(sv)]; } if (targ && targ != &sv_undef) { + dTHR; /* just for SvREFCNT_dec */ /* somebody else defined it for us */ SvREFCNT_dec(LvTARG(sv)); LvTARG(sv) = SvREFCNT_inc(targ); @@ -1183,6 +1191,7 @@ void vivify_defelem(sv) SV* sv; { + dTHR; /* just for SvREFCNT_inc and SvREFCNT_dec*/ MAGIC* mg; SV* value; @@ -1279,6 +1288,7 @@ magic_set(sv,mg) SV* sv; MAGIC* mg; { + dTHR; register char *s; I32 i; STRLEN len; @@ -1612,6 +1622,23 @@ MAGIC* mg; return 0; } +#ifdef USE_THREADS +int +magic_mutexfree(sv, mg) +SV *sv; +MAGIC *mg; +{ + dTHR; + DEBUG_L(PerlIO_printf(PerlIO_stderr(), "0x%lx: magic_mutexfree 0x%lx\n", + (unsigned long)thr, (unsigned long)sv);) + if (MgOWNER(mg)) + croak("panic: magic_mutexfree"); + MUTEX_DESTROY(MgMUTEXP(mg)); + COND_DESTROY(MgCONDP(mg)); + return 0; +} +#endif /* USE_THREADS */ + I32 whichsig(sig) char *sig; @@ -1636,6 +1663,7 @@ Signal_t sighandler(sig) int sig; { + dTHR; dSP; GV *gv; HV *st;