From: Nicholas Clark Date: Tue, 23 Mar 2004 17:47:44 +0000 (+0000) Subject: hv_delete_common was freeing the key, then passing the freed pointer X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=b84d08606128d31ab874c747150180e32486af44;p=p5sagit%2Fp5-mst-13.2.git hv_delete_common was freeing the key, then passing the freed pointer to S_hv_notallowed. D'oh! p4raw-id: //depot/perl@22569 --- diff --git a/hv.c b/hv.c index cc642e0..627140b 100644 --- a/hv.c +++ b/hv.c @@ -977,19 +977,21 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, continue; if ((HeKFLAGS(entry) ^ masked_flags) & HVhek_UTF8) continue; - if (k_flags & HVhek_FREEKEY) - Safefree(key); /* if placeholder is here, it's already been deleted.... */ if (HeVAL(entry) == &PL_sv_placeholder) { - return Nullsv; + if (k_flags & HVhek_FREEKEY) + Safefree(key); + return Nullsv; } else if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) { S_hv_notallowed(aTHX_ k_flags, key, klen, "delete readonly key '%"SVf"' from" ); } + if (k_flags & HVhek_FREEKEY) + Safefree(key); if (d_flags & G_DISCARD) sv = Nullsv;