summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Krempa <pkrempa@redhat.com>2015-03-25 08:25:45 +0100
committerCole Robinson <crobinso@redhat.com>2015-04-27 19:51:18 -0400
commit363bc010be41d9c78c0079672bce7263be5cbe9b (patch)
tree06162a48fae5ae856cdaa518405ce4762e2678e0
parentb843bea30ae32c389a77149035ce3d134e1119b5 (diff)
downloadlibvirt-363bc010be41d9c78c0079672bce7263be5cbe9b.tar.gz
util: identity: Harden virIdentitySetCurrent()
Don't unref the old identity unless we set the new one correctly and unref the new one on failure to set it so that we don't leak any references or use invalid pointers. (cherry picked from commit ad886fa6c8ebc321a0386a75c187d315111cf1f3)
-rw-r--r--src/util/viridentity.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/util/viridentity.c b/src/util/viridentity.c
index 6f3baeeb11..9b8ba4ae24 100644
--- a/src/util/viridentity.c
+++ b/src/util/viridentity.c
@@ -111,15 +111,17 @@ int virIdentitySetCurrent(virIdentityPtr ident)
return -1;
old = virThreadLocalGet(&virIdentityCurrent);
- virObjectUnref(old);
if (virThreadLocalSet(&virIdentityCurrent,
virObjectRef(ident)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Unable to set thread local identity"));
+ virObjectUnref(ident);
return -1;
}
+ virObjectUnref(old);
+
return 0;
}