summaryrefslogtreecommitdiffstats
path: root/Stash.xs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2010-11-13 13:03:30 -0600
committerJesse Luehrs <doy@tozt.net>2010-11-13 13:03:30 -0600
commit1d6c978bb7d895ccd3ee8d9c1c2fad0d627af732 (patch)
treee225365fddfcb26e635348d8331c396944dbf0f8 /Stash.xs
parent6cce0a028629adb097bf4948e8e03e60c0f47ef9 (diff)
downloadpackage-stash-xs-1d6c978bb7d895ccd3ee8d9c1c2fad0d627af732.tar.gz
package-stash-xs-1d6c978bb7d895ccd3ee8d9c1c2fad0d627af732.zip
don't leak memory on hv_store fail
Diffstat (limited to 'Stash.xs')
-rw-r--r--Stash.xs10
1 files changed, 8 insertions, 2 deletions
diff --git a/Stash.xs b/Stash.xs
index 72ee898..d0a9a70 100644
--- a/Stash.xs
+++ b/Stash.xs
@@ -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: