[libvirt] [PATCH v2] Merge all returns paths from dispatcher into single path

Eric Blake eblake at redhat.com
Fri Apr 15 16:27:35 UTC 2011


On 04/14/2011 07:28 AM, Daniel P. Berrange wrote:
> The dispatcher functions have numerous places where they
> return to the caller. This leads to duplicated cleanup
> code, often resulting in memory leaks. It makes it harder
> to ensure that errors are dispatched before freeing objects,
> which may overwrite the original error.
> 

Rather than review your entire patch again, I just reviewed this interdiff.

You really did get rid of all remoteDispatchOOMError callers; I'd be
fine if you squashed in deleting the declaration from
daemon/dispatch.[ch] as part of this patch, or as a followup.

> diff --git c/daemon/remote.c w/daemon/remote.c
> index 8f4d6a6..a25c095 100644
> --- c/daemon/remote.c
> +++ w/daemon/remote.c
> @@ -912,7 +912,7 @@ remoteDispatchDomainGetSchedulerParameters(struct qemud_server *server ATTRIBUTE
>                                             remote_domain_get_scheduler_parameters_ret *ret)
>  {
>      virDomainPtr dom = NULL;
> -    virSchedParameterPtr params;
> +    virSchedParameterPtr params = NULL;
>      int i, r, nparams;
>      int rv = -1;
> 
> @@ -927,10 +927,8 @@ remoteDispatchDomainGetSchedulerParameters(struct qemud_server *server ATTRIBUTE
>          virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large"));
>          goto cleanup;
>      }
> -    if (VIR_ALLOC_N(params, nparams) < 0) {
> -        virReportOOMError();
> -        goto cleanup;
> -    }
> +    if (VIR_ALLOC_N(params, nparams) < 0)
> +        goto no_memory;
> 
>      dom = get_nonnull_domain(conn, args->dom);
>      if (dom == NULL) {
> @@ -1002,7 +1000,7 @@ remoteDispatchDomainSetSchedulerParameters(struct qemud_server *server ATTRIBUTE
>  {
>      virDomainPtr dom = NULL;
>      int i, r, nparams;
> -    virSchedParameterPtr params;
> +    virSchedParameterPtr params = NULL;
>      int rv = -1;
> 
>      if (!conn) {
> @@ -1960,7 +1958,7 @@ remoteDispatchDomainGetSecurityLabel(struct qemud_server *server ATTRIBUTE_UNUSE
>                                       remote_domain_get_security_label_ret *ret)
>  {
>      virDomainPtr dom = NULL;
> -    virSecurityLabelPtr seclabel;
> +    virSecurityLabelPtr seclabel = NULL;
>      int rv = -1;
> 
>      if (!conn) {
> @@ -3041,7 +3039,7 @@ remoteDispatchDomainSetMemoryParameters(struct qemud_server *server
>  {
>      virDomainPtr dom = NULL;
>      int i, r, nparams;
> -    virMemoryParameterPtr params;
> +    virMemoryParameterPtr params = NULL;
>      unsigned int flags;
>      int rv = -1;
> 
> @@ -3142,7 +3140,7 @@ remoteDispatchDomainGetMemoryParameters(struct qemud_server *server
>                                          * ret)
>  {
>      virDomainPtr dom = NULL;
> -    virMemoryParameterPtr params;
> +    virMemoryParameterPtr params = NULL;
>      int i, r, nparams;
>      unsigned int flags;
>      int rv = -1;
> @@ -3233,8 +3231,6 @@ remoteDispatchDomainGetMemoryParameters(struct qemud_server *server
>  success:
>      rv = 0;
> 
> -no_memory:
> -    virReportOOMError();
>  cleanup:
>      if (rv < 0) {
>          remoteDispatchError(rerr);
> @@ -3246,6 +3242,10 @@ cleanup:
>          virDomainFree(dom);
>      VIR_FREE(params);
>      return rv;
> +
> +no_memory:
> +    virReportOOMError();
> +    goto cleanup;
>  }

Good, this addresses my review comments.

> 
>  static int
> @@ -3262,7 +3262,7 @@ remoteDispatchDomainSetBlkioParameters(struct qemud_server *server
>  {
>      virDomainPtr dom = NULL;
>      int i, r, nparams;
> -    virBlkioParameterPtr params;
> +    virBlkioParameterPtr params = NULL;
>      unsigned int flags;
>      int rv = -1;
> 
> @@ -3363,7 +3363,7 @@ remoteDispatchDomainGetBlkioParameters(struct qemud_server *server
>                                          * ret)
>  {
>      virDomainPtr dom = NULL;
> -    virBlkioParameterPtr params;
> +    virBlkioParameterPtr params = NULL;
>      int i, r, nparams;
>      unsigned int flags;
>      int rv = -1;
> @@ -4846,9 +4846,8 @@ remoteDispatchAuthSaslInit(struct qemud_server *server,
>                      virStrerror(errno, ebuf, sizeof ebuf));
>          goto error;
>      }
> -    if ((localAddr = virSocketFormatAddrFull(&sa, true, ";")) == NULL) {
> +    if ((localAddr = virSocketFormatAddrFull(&sa, true, ";")) == NULL)
>          goto error;
> -    }

Looks like the cleanups from one of your followup patches leaked in here
when you reverted your sasl changes, but no real harm leaving this hunk in.

> 
>      /* Get remote address in form  IPADDR:PORT */
>      sa.len = sizeof(sa.data.stor);
> @@ -4964,7 +4963,7 @@ authfail:
>  error:
>      PROBE(CLIENT_AUTH_FAIL, "fd=%d, auth=%d", client->fd, REMOTE_AUTH_SASL);
>      virMutexUnlock(&client->lock);
> -    goto error;
> +    return -1;
>  }
> 
> 
> @@ -5126,6 +5125,7 @@ remoteDispatchAuthSaslStart(struct qemud_server *server,
>      if (serverout) {
>          if (VIR_ALLOC_N(ret->data.data_val, serveroutlen) < 0) {
>              virReportOOMError();
> +            remoteDispatchError(rerr);
>              goto error;
>          }
>          memcpy(ret->data.data_val, serverout, serveroutlen);
> @@ -5227,6 +5227,7 @@ remoteDispatchAuthSaslStep(struct qemud_server *server,
>      if (serverout) {
>          if (VIR_ALLOC_N(ret->data.data_val, serveroutlen) < 0) {
>              virReportOOMError();
> +            remoteDispatchError(rerr);
>              goto error;
>          }
>          memcpy(ret->data.data_val, serverout, serveroutlen);
> @@ -5403,7 +5404,7 @@ remoteDispatchAuthPolkit(struct qemud_server *server,
>      client->auth = REMOTE_AUTH_NONE;
> 
>      virMutexUnlock(&client->lock);
> -    rv = 0;
> +    return 0;
> 
>  authfail:
>      PROBE(CLIENT_AUTH_FAIL, "fd=%d, auth=%d", client->fd, REMOTE_AUTH_POLKIT);
> @@ -5535,7 +5536,7 @@ remoteDispatchAuthPolkit(struct qemud_server *server,
>      client->auth = REMOTE_AUTH_NONE;
> 
>      virMutexUnlock(&client->lock);
> -    rv = 0;
> +    return 0;

Looks like you correctly reverted any changes to sasl code, as planned.

> 
>  authfail:
>      PROBE(CLIENT_AUTH_FAIL, "fd=%d, auth=%d", client->fd, REMOTE_AUTH_POLKIT);
> @@ -6964,7 +6965,7 @@ remoteDispatchNodeDeviceGetParent(struct qemud_server *server ATTRIBUTE_UNUSED,
>                                    remote_node_device_get_parent_ret *ret)
>  {
>      virNodeDevicePtr dev = NULL;
> -    const char *parent;
> +    const char *parent = NULL;
>      int rv = -1;
> 
>      if (!conn) {
> @@ -6988,8 +6989,8 @@ remoteDispatchNodeDeviceGetParent(struct qemud_server *server ATTRIBUTE_UNUSED,
>              virReportOOMError();
>              goto cleanup;
>          }
> -        *parent_p = strdup(parent);
> -        if (*parent_p == NULL) {
> +        if (!(*parent_p = strdup(parent))) {
> +            VIR_FREE(parent_p);
>              virReportOOMError();
>              goto cleanup;
>          }

For all my waffling reviews, I think you got this one right now.

> @@ -8413,7 +8414,7 @@ remoteDispatchDomainSnapshotCreateXml(struct qemud_server *server ATTRIBUTE_UNUS
>                                        remote_domain_snapshot_create_xml_args *args,
>                                        remote_domain_snapshot_create_xml_ret *ret)
>  {
> -    virDomainSnapshotPtr snapshot;
> +    virDomainSnapshotPtr snapshot = NULL;
>      virDomainPtr domain = NULL;
>      int rv = -1;
> 
> @@ -8589,7 +8590,7 @@ remoteDispatchDomainSnapshotLookupByName(struct qemud_server *server ATTRIBUTE_U
>                                           remote_domain_snapshot_lookup_by_name_args *args,
>                                           remote_domain_snapshot_lookup_by_name_ret *ret)
>  {
> -    virDomainSnapshotPtr snapshot;
> +    virDomainSnapshotPtr snapshot = NULL;
>      virDomainPtr domain = NULL;
>      int rv = -1;
> 
> @@ -8671,7 +8672,7 @@ remoteDispatchDomainSnapshotCurrent(struct qemud_server *server ATTRIBUTE_UNUSED
>                                      remote_domain_snapshot_current_args *args,
>                                      remote_domain_snapshot_current_ret *ret)
>  {
> -    virDomainSnapshotPtr snapshot;
> +    virDomainSnapshotPtr snapshot = NULL;
>      virDomainPtr domain = NULL;
>      int rv = -1;
> 

ACK - you addressed all my findings from v1.

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110415/cb77d1f3/attachment-0001.sig>


More information about the libvir-list mailing list