Any "goto out_of_memory" taken between the vars = qparam_query_parse (query)
allocation and the free_qparam_set call would result in a leak.
Here's the fix:
From a3a21142e40962c960eae882ac9edcc3bd17cb8b Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Thu, 11 Feb 2010 12:51:31 +0100
Subject: [PATCH] remote_driver.c: avoid leak on OOM error path
* src/remote/remote_driver.c (doRemoteOpen): Don't leak a qparam_set
buffer upon OOM error.
---
src/remote/remote_driver.c | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index e17db3d..cc543fc 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -2,7 +2,7 @@
* remote_internal.c: driver to provide access to libvirtd running
* on a remote machine
*
- * Copyright (C) 2007-2009 Red Hat, Inc.
+ * Copyright (C) 2007-2010 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -370,6 +370,7 @@ doRemoteOpen (virConnectPtr conn,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
int flags)
{
+ struct qparam_set *vars = NULL;
int wakeupFD[2] = { -1, -1 };
char *transport_str = NULL;
enum {
@@ -458,7 +459,6 @@ doRemoteOpen (virConnectPtr conn,
* feasibly it might contain variables needed by the real driver,
* although that won't be the case for now).
*/
- struct qparam_set *vars;
struct qparam *var;
int i;
char *query;
@@ -551,6 +551,7 @@ doRemoteOpen (virConnectPtr conn,
}
free_qparam_set (vars);
+ vars = NULL;
} else {
/* Probe URI server side */
name = strdup("");
@@ -933,6 +934,8 @@ doRemoteOpen (virConnectPtr conn,
out_of_memory:
virReportOOMError();
+ if (vars)
+ free_qparam_set (vars);
failed:
/* Close the socket if we failed. */
--
1.7.0.rc2.170.gbc565