[libvirt] [PATCH] Fix more OOM handling bugs

Daniel Veillard veillard at redhat.com
Fri Sep 4 15:06:40 UTC 2009


On Thu, Sep 03, 2009 at 05:39:53PM +0100, Daniel P. Berrange wrote:
> * src/qemu_conf.c: Fix leak of values upon OOM
> * src/xend_internal.c: Fix missing check for OOM failure
> * tests/qemuargv2xmltest.c, tests/qemuxml2argvtest.c: Free
>   stateDir upon exit to avoid leak
> ---
>  src/qemu_conf.c          |   21 ++++++++++++++++++---
>  src/xend_internal.c      |    6 ++++++
>  tests/qemuargv2xmltest.c |    1 +
>  tests/qemuxml2argvtest.c |    1 +
>  4 files changed, 26 insertions(+), 3 deletions(-)
> 
> diff --git a/src/qemu_conf.c b/src/qemu_conf.c
> index 22f5edd..ad41104 100644
> --- a/src/qemu_conf.c
> +++ b/src/qemu_conf.c
> @@ -1722,6 +1722,8 @@ int qemudBuildCommandLine(virConnectPtr conn,
>                  continue;
>              }
>  
> +            ADD_ARG_SPACE;
> +
>              if (idx < 0) {
>                  qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
>                                   _("unsupported disk type '%s'"), disk->dst);
> @@ -1773,7 +1775,10 @@ int qemudBuildCommandLine(virConnectPtr conn,
>  
>              optstr = virBufferContentAndReset(&opt);
>  
> -            ADD_ARG_LIT("-drive");
> +            if ((qargv[qargc++] = strdup("-drive")) == NULL) {
> +                VIR_FREE(optstr);
> +                goto no_memory;
> +            }
>              ADD_ARG(optstr);
>          }
>      } else {
> @@ -1829,6 +1834,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
>  
>              net->vlan = i;
>  
> +            ADD_ARG_SPACE;
>              if ((qemuCmdFlags & QEMUD_CMD_FLAG_NET_NAME) &&
>                  qemuAssignNetNames(def, net) < 0)
>                  goto no_memory;
> @@ -1836,9 +1842,14 @@ int qemudBuildCommandLine(virConnectPtr conn,
>              if (qemuBuildNicStr(conn, net, NULL, ',', net->vlan, &nic) < 0)
>                  goto error;
>  
> -            ADD_ARG_LIT("-net");
> +            if ((qargv[qargc++] = strdup("-net")) == NULL) {
> +                VIR_FREE(nic);
> +                goto no_memory;
> +            }
>              ADD_ARG(nic);
>  
> +
> +            ADD_ARG_SPACE;
>              if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK ||
>                  net->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
>                  int tapfd = qemudNetworkIfaceConnect(conn, driver, net, qemuCmdFlags);
> @@ -1862,7 +1873,10 @@ int qemudBuildCommandLine(virConnectPtr conn,
>                  goto error;
>              }
>  
> -            ADD_ARG_LIT("-net");
> +            if ((qargv[qargc++] = strdup("-net")) == NULL) {
> +                VIR_FREE(host);
> +                goto no_memory;
> +            }
>              ADD_ARG(host);
>  
>              VIR_FREE(tapfd_name);
> @@ -2230,6 +2244,7 @@ static int qemuStringToArgvEnv(const char *args,
>              goto no_memory;
>          for (i = 0 ; i < envend ; i++) {
>              progenv[i] = arglist[i];
> +            arglist[i] = NULL;
>          }
>          progenv[i] = NULL;
>      }
> diff --git a/src/xend_internal.c b/src/xend_internal.c
> index 99847b0..20ddb89 100644
> --- a/src/xend_internal.c
> +++ b/src/xend_internal.c
> @@ -5212,6 +5212,9 @@ xenDaemonFormatSxprChr(virConnectPtr conn,
>          break;
>      }
>  
> +    if (virBufferError(buf))
> +        return -1;
> +
>      return 0;
>  }
>  
> @@ -5535,6 +5538,9 @@ xenDaemonFormatSxprSound(virConnectPtr conn,
>          virBufferVSprintf(buf, "%s%s", i ? "," : "", str);
>      }
>  
> +    if (virBufferError(buf))
> +        return -1;
> +
>      return 0;
>  }
>  
> diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
> index 7861520..4a92280 100644
> --- a/tests/qemuargv2xmltest.c
> +++ b/tests/qemuargv2xmltest.c
> @@ -223,6 +223,7 @@ mymain(int argc, char **argv)
>      DO_TEST_FULL("restore-v2", QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC, "exec:cat");
>      DO_TEST_FULL("migrate", QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP, "tcp:10.0.0.1:5000");
>  
> +    free(driver.stateDir);
>      virCapabilitiesFree(driver.caps);
>  
>      return(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index 6f25e7d..2f91288 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -270,6 +270,7 @@ mymain(int argc, char **argv)
>      DO_TEST_FULL("restore-v2", QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC, "exec:cat");
>      DO_TEST_FULL("migrate", QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP, "tcp:10.0.0.1:5000");
>  
> +    free(driver.stateDir);
>      virCapabilitiesFree(driver.caps);
>  
>      return(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);

  ACK,

  but if ADD_ARG_LIT can't be made safe w.r.t OOM, maybe the macro
definition should be removed too.

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list