[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