diff options
author | Jesse Luehrs <doy@tozt.net> | 2010-11-13 13:03:30 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2010-11-13 13:03:30 -0600 |
commit | 1d6c978bb7d895ccd3ee8d9c1c2fad0d627af732 (patch) | |
tree | e225365fddfcb26e635348d8331c396944dbf0f8 | |
parent | 6cce0a028629adb097bf4948e8e03e60c0f47ef9 (diff) | |
download | package-stash-xs-1d6c978bb7d895ccd3ee8d9c1c2fad0d627af732.tar.gz package-stash-xs-1d6c978bb7d895ccd3ee8d9c1c2fad0d627af732.zip |
don't leak memory on hv_store fail
-rw-r--r-- | Stash.xs | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -271,17 +271,23 @@ new(class, package_name) PREINIT: HV *instance; HV *namespace; + SV *nsref; CODE: if (!SvPOK(package_name)) croak("The constructor argument must be the name of a package"); instance = newHV(); - if (!hv_store(instance, "name", 4, SvREFCNT_inc_simple_NN(package_name), 0)) + if (!hv_store(instance, "name", 4, SvREFCNT_inc_simple_NN(package_name), 0)) { + SvREFCNT_dec(package_name); croak("Couldn't initialize the 'name' key, hv_store failed"); + } namespace = gv_stashpv(SvPV_nolen(package_name), GV_ADD); - if (!hv_store(instance, "namespace", 9, newRV_inc((SV*)namespace), 0)) + nsref = newRV_inc((SV*)namespace); + if (!hv_store(instance, "namespace", 9, nsref, 0)) { + SvREFCNT_dec(nsref); croak("Couldn't initialize the 'namespace' key, hv_store failed"); + } RETVAL = sv_bless(newRV_noinc((SV*)instance), gv_stashpv(class, 0)); OUTPUT: |