From nobody Mon May 6 06:24:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1544543805489763.6827628822499; Tue, 11 Dec 2018 07:56:45 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3283E58E33; Tue, 11 Dec 2018 15:56:42 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 42505608F7; Tue, 11 Dec 2018 15:56:40 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id F1E2A3F602; Tue, 11 Dec 2018 15:56:37 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id wBBFuaJm012116 for ; Tue, 11 Dec 2018 10:56:36 -0500 Received: by smtp.corp.redhat.com (Postfix) id 6FB9B6090D; Tue, 11 Dec 2018 15:56:36 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-112-59.ams2.redhat.com [10.36.112.59]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1FC37608F6; Tue, 11 Dec 2018 15:56:34 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Tue, 11 Dec 2018 15:56:33 +0000 Message-Id: <20181211155633.19060-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH] remote: check & report OOM in make_nonnull_XXX methods X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 11 Dec 2018 15:56:43 +0000 (UTC) The make_nonnull_XXX methods can all fail due to OOM but this was being silently ignored and thus also not checked by callers. Make the methods propagate errors and use ATTRIBUTE_RETURN_CHECK to force callers to deal with it. Signed-off-by: Daniel P. Berrang=C3=A9 --- src/admin/admin_server_dispatch.c | 9 +- src/remote/remote_daemon_dispatch.c | 393 +++++++++++++++++++++------- src/rpc/gendispatch.pl | 19 +- 3 files changed, 315 insertions(+), 106 deletions(-) diff --git a/src/admin/admin_server_dispatch.c b/src/admin/admin_server_dis= patch.c index b78ff902c0..9fa2893fa3 100644 --- a/src/admin/admin_server_dispatch.c +++ b/src/admin/admin_server_dispatch.c @@ -115,11 +115,13 @@ get_nonnull_server(virNetDaemonPtr dmn, admin_nonnull= _server srv) return virNetDaemonGetServer(dmn, srv.name); } =20 -static void +static int ATTRIBUTE_RETURN_CHECK make_nonnull_server(admin_nonnull_server *srv_dst, virNetServerPtr srv_src) { - ignore_value(VIR_STRDUP_QUIET(srv_dst->name, virNetServerGetName(srv_s= rc))); + if (VIR_STRDUP(srv_dst->name, virNetServerGetName(srv_src)) < 0) + return -1; + return 0; } =20 static virNetServerClientPtr @@ -128,13 +130,14 @@ get_nonnull_client(virNetServerPtr srv, admin_nonnull= _client clnt) return virNetServerGetClient(srv, clnt.id); } =20 -static void +static int make_nonnull_client(admin_nonnull_client *clt_dst, virNetServerClientPtr clt_src) { clt_dst->id =3D virNetServerClientGetID(clt_src); clt_dst->timestamp =3D virNetServerClientGetTimestamp(clt_src); clt_dst->transport =3D virNetServerClientGetTransport(clt_src); + return 0; } =20 /* Functions */ diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon= _dispatch.c index e62ebfb596..73a9434700 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -93,16 +93,16 @@ static virNWFilterPtr get_nonnull_nwfilter(virConnectPt= r conn, remote_nonnull_nw static virNWFilterBindingPtr get_nonnull_nwfilter_binding(virConnectPtr co= nn, remote_nonnull_nwfilter_binding binding); static virDomainSnapshotPtr get_nonnull_domain_snapshot(virDomainPtr dom, = remote_nonnull_domain_snapshot snapshot); static virNodeDevicePtr get_nonnull_node_device(virConnectPtr conn, remote= _nonnull_node_device dev); -static void make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainP= tr dom_src); -static void make_nonnull_network(remote_nonnull_network *net_dst, virNetwo= rkPtr net_src); -static void make_nonnull_interface(remote_nonnull_interface *interface_dst= , virInterfacePtr interface_src); -static void make_nonnull_storage_pool(remote_nonnull_storage_pool *pool_ds= t, virStoragePoolPtr pool_src); -static void make_nonnull_storage_vol(remote_nonnull_storage_vol *vol_dst, = virStorageVolPtr vol_src); -static void make_nonnull_node_device(remote_nonnull_node_device *dev_dst, = virNodeDevicePtr dev_src); -static void make_nonnull_secret(remote_nonnull_secret *secret_dst, virSecr= etPtr secret_src); -static void make_nonnull_nwfilter(remote_nonnull_nwfilter *net_dst, virNWF= ilterPtr nwfilter_src); -static void make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding = *binding_dst, virNWFilterBindingPtr binding_src); -static void make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *s= napshot_dst, virDomainSnapshotPtr snapshot_src); +static int make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainPt= r dom_src) ATTRIBUTE_RETURN_CHECK; +static int make_nonnull_network(remote_nonnull_network *net_dst, virNetwor= kPtr net_src) ATTRIBUTE_RETURN_CHECK; +static int make_nonnull_interface(remote_nonnull_interface *interface_dst,= virInterfacePtr interface_src) ATTRIBUTE_RETURN_CHECK; +static int make_nonnull_storage_pool(remote_nonnull_storage_pool *pool_dst= , virStoragePoolPtr pool_src) ATTRIBUTE_RETURN_CHECK; +static int make_nonnull_storage_vol(remote_nonnull_storage_vol *vol_dst, v= irStorageVolPtr vol_src) ATTRIBUTE_RETURN_CHECK; +static int make_nonnull_node_device(remote_nonnull_node_device *dev_dst, v= irNodeDevicePtr dev_src) ATTRIBUTE_RETURN_CHECK; +static int make_nonnull_secret(remote_nonnull_secret *secret_dst, virSecre= tPtr secret_src) ATTRIBUTE_RETURN_CHECK; +static int make_nonnull_nwfilter(remote_nonnull_nwfilter *net_dst, virNWFi= lterPtr nwfilter_src) ATTRIBUTE_RETURN_CHECK; +static int make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding *= binding_dst, virNWFilterBindingPtr binding_src) ATTRIBUTE_RETURN_CHECK; +static int make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *sn= apshot_dst, virDomainSnapshotPtr snapshot_src) ATTRIBUTE_RETURN_CHECK; =20 static int remoteSerializeDomainDiskErrors(virDomainDiskErrorPtr errors, @@ -315,7 +315,8 @@ remoteRelayDomainEventLifecycle(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; data.event =3D event; data.detail =3D detail; =20 @@ -335,6 +336,11 @@ remoteRelayDomainEventLifecycle(virConnectPtr conn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_lifecycle_msg, + &data); + return -1; } =20 static int @@ -354,7 +360,8 @@ remoteRelayDomainEventReboot(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -370,6 +377,11 @@ remoteRelayDomainEventReboot(virConnectPtr conn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_reboot_msg, + &data); + return -1; } =20 =20 @@ -392,7 +404,8 @@ remoteRelayDomainEventRTCChange(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; data.offset =3D offset; =20 if (callback->legacy) { @@ -409,6 +422,11 @@ remoteRelayDomainEventRTCChange(virConnectPtr conn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_rtc_change_msg, + &data); + return -1; } =20 =20 @@ -430,7 +448,8 @@ remoteRelayDomainEventWatchdog(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; data.action =3D action; =20 if (callback->legacy) { @@ -447,6 +466,11 @@ remoteRelayDomainEventWatchdog(virConnectPtr conn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_watchdog_msg, + &data); + return -1; } =20 =20 @@ -474,7 +498,8 @@ remoteRelayDomainEventIOError(virConnectPtr conn, if (VIR_STRDUP(data.srcPath, srcPath) < 0 || VIR_STRDUP(data.devAlias, devAlias) < 0) goto error; - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; data.action =3D action; =20 if (callback->legacy) { @@ -492,8 +517,8 @@ remoteRelayDomainEventIOError(virConnectPtr conn, =20 return 0; error: - VIR_FREE(data.srcPath); - VIR_FREE(data.devAlias); + xdr_free((xdrproc_t)xdr_remote_domain_event_io_error_msg, + &data); return -1; } =20 @@ -526,7 +551,8 @@ remoteRelayDomainEventIOErrorReason(virConnectPtr conn, goto error; data.action =3D action; =20 - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -544,9 +570,8 @@ remoteRelayDomainEventIOErrorReason(virConnectPtr conn, return 0; =20 error: - VIR_FREE(data.srcPath); - VIR_FREE(data.devAlias); - VIR_FREE(data.reason); + xdr_free((xdrproc_t)xdr_remote_domain_event_io_error_reason_msg, + &data); return -1; } =20 @@ -600,7 +625,8 @@ remoteRelayDomainEventGraphics(virConnectPtr conn, VIR_STRDUP(data.subject.subject_val[i].name, subject->identiti= es[i].name) < 0) goto error; } - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -618,18 +644,8 @@ remoteRelayDomainEventGraphics(virConnectPtr conn, return 0; =20 error: - VIR_FREE(data.authScheme); - VIR_FREE(data.local.node); - VIR_FREE(data.local.service); - VIR_FREE(data.remote.node); - VIR_FREE(data.remote.service); - if (data.subject.subject_val !=3D NULL) { - for (i =3D 0; i < data.subject.subject_len; i++) { - VIR_FREE(data.subject.subject_val[i].type); - VIR_FREE(data.subject.subject_val[i].name); - } - VIR_FREE(data.subject.subject_val); - } + xdr_free((xdrproc_t)xdr_remote_domain_event_graphics_msg, + &data); return -1; } =20 @@ -657,7 +673,8 @@ remoteRelayDomainEventBlockJob(virConnectPtr conn, return -1; data.type =3D type; data.status =3D status; - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -673,6 +690,11 @@ remoteRelayDomainEventBlockJob(virConnectPtr conn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_block_job_msg, + &data); + return -1; } =20 =20 @@ -693,7 +715,8 @@ remoteRelayDomainEventControlError(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -709,6 +732,11 @@ remoteRelayDomainEventControlError(virConnectPtr conn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_control_error_msg, + &data); + return -1; } =20 =20 @@ -751,7 +779,8 @@ remoteRelayDomainEventDiskChange(virConnectPtr conn, goto error; data.reason =3D reason; =20 - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -769,8 +798,8 @@ remoteRelayDomainEventDiskChange(virConnectPtr conn, return 0; =20 error: - VIR_FREE(oldSrcPath_p); - VIR_FREE(newSrcPath_p); + xdr_free((xdrproc_t)xdr_remote_domain_event_disk_change_msg, + &data); return -1; } =20 @@ -799,7 +828,8 @@ remoteRelayDomainEventTrayChange(virConnectPtr conn, return -1; data.reason =3D reason; =20 - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -815,6 +845,11 @@ remoteRelayDomainEventTrayChange(virConnectPtr conn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_tray_change_msg, + &data); + return -1; } =20 static int @@ -835,7 +870,8 @@ remoteRelayDomainEventPMWakeup(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -851,6 +887,11 @@ remoteRelayDomainEventPMWakeup(virConnectPtr conn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_pmwakeup_msg, + &data); + return -1; } =20 static int @@ -871,7 +912,8 @@ remoteRelayDomainEventPMSuspend(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -887,6 +929,11 @@ remoteRelayDomainEventPMSuspend(virConnectPtr conn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_pmsuspend_msg, + &data); + return -1; } =20 static int @@ -907,7 +954,8 @@ remoteRelayDomainEventBalloonChange(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; data.actual =3D actual; =20 if (callback->legacy) { @@ -924,6 +972,11 @@ remoteRelayDomainEventBalloonChange(virConnectPtr conn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_balloon_change_msg, + &data); + return -1; } =20 =20 @@ -945,7 +998,8 @@ remoteRelayDomainEventPMSuspendDisk(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -961,6 +1015,11 @@ remoteRelayDomainEventPMSuspendDisk(virConnectPtr con= n, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_pmsuspend_disk_msg, + &data); + return -1; } =20 static int @@ -985,7 +1044,8 @@ remoteRelayDomainEventDeviceRemoved(virConnectPtr conn, if (VIR_STRDUP(data.devAlias, devAlias) < 0) return -1; =20 - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (callback->legacy) { remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -1003,6 +1063,11 @@ remoteRelayDomainEventDeviceRemoved(virConnectPtr co= nn, } =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_device_removed_msg, + &data); + return -1; } =20 =20 @@ -1031,13 +1096,19 @@ remoteRelayDomainEventBlockJob2(virConnectPtr conn, return -1; data.type =3D type; data.status =3D status; - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 remoteDispatchObjectEventSend(callback->client, remoteProgram, REMOTE_PROC_DOMAIN_EVENT_BLOCK_JOB_2, (xdrproc_t)xdr_remote_domain_event_block= _job_2_msg, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_block_job_2_msg, + &data); + return -1; } =20 =20 @@ -1061,7 +1132,8 @@ remoteRelayDomainEventTunable(virConnectPtr conn, /* build return data */ memset(&data, 0, sizeof(data)); data.callbackID =3D callback->callbackID; - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (virTypedParamsSerialize(params, nparams, (virTypedParameterRemotePtr *) &data.param= s.params_val, @@ -1077,6 +1149,11 @@ remoteRelayDomainEventTunable(virConnectPtr conn, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_callback_tunable_msg, + &data); + return -1; } =20 =20 @@ -1101,7 +1178,8 @@ remoteRelayDomainEventAgentLifecycle(virConnectPtr co= nn, /* build return data */ memset(&data, 0, sizeof(data)); data.callbackID =3D callback->callbackID; - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 data.state =3D state; data.reason =3D reason; @@ -1112,6 +1190,11 @@ remoteRelayDomainEventAgentLifecycle(virConnectPtr c= onn, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_callback_agent_lifecycle_m= sg, + &data); + return -1; } =20 =20 @@ -1137,7 +1220,8 @@ remoteRelayDomainEventDeviceAdded(virConnectPtr conn, if (VIR_STRDUP(data.devAlias, devAlias) < 0) return -1; =20 - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; data.callbackID =3D callback->callbackID; =20 remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -1146,6 +1230,11 @@ remoteRelayDomainEventDeviceAdded(virConnectPtr conn, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_callback_device_added_msg, + &data); + return -1; } =20 =20 @@ -1169,7 +1258,8 @@ remoteRelayDomainEventMigrationIteration(virConnectPt= r conn, /* build return data */ memset(&data, 0, sizeof(data)); data.callbackID =3D callback->callbackID; - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 data.iteration =3D iteration; =20 @@ -1179,6 +1269,11 @@ remoteRelayDomainEventMigrationIteration(virConnectP= tr conn, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_callback_migration_iterati= on_msg, + &data); + return -1; } =20 =20 @@ -1203,7 +1298,8 @@ remoteRelayDomainEventJobCompleted(virConnectPtr conn, /* build return data */ memset(&data, 0, sizeof(data)); data.callbackID =3D callback->callbackID; - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 if (virTypedParamsSerialize(params, nparams, (virTypedParameterRemotePtr *) &data.param= s.params_val, @@ -1218,6 +1314,11 @@ remoteRelayDomainEventJobCompleted(virConnectPtr con= n, (xdrproc_t)xdr_remote_domain_event_callb= ack_job_completed_msg, &data); return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_callback_job_completed_msg, + &data); + return -1; } =20 =20 @@ -1243,7 +1344,8 @@ remoteRelayDomainEventDeviceRemovalFailed(virConnectP= tr conn, if (VIR_STRDUP(data.devAlias, devAlias) < 0) return -1; =20 - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; data.callbackID =3D callback->callbackID; =20 remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -1252,6 +1354,11 @@ remoteRelayDomainEventDeviceRemovalFailed(virConnect= Ptr conn, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_callback_device_removal_fa= iled_msg, + &data); + return -1; } =20 =20 @@ -1287,7 +1394,8 @@ remoteRelayDomainEventMetadataChange(virConnectPtr co= nn, data.nsuri =3D nsurip; } =20 - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; data.callbackID =3D callback->callbackID; =20 remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -1296,6 +1404,11 @@ remoteRelayDomainEventMetadataChange(virConnectPtr c= onn, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_domain_event_callback_metadata_change_m= sg, + &data); + return -1; } =20 =20 @@ -1331,15 +1444,18 @@ remoteRelayDomainEventBlockThreshold(virConnectPtr = conn, } data.threshold =3D threshold; data.excess =3D excess; - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 remoteDispatchObjectEventSend(callback->client, remoteProgram, REMOTE_PROC_DOMAIN_EVENT_BLOCK_THRESHOLD, (xdrproc_t)xdr_remote_domain_event_block= _threshold_msg, &data); =20 return 0; + error: - VIR_FREE(data.dev); + xdr_free((xdrproc_t)xdr_remote_domain_event_block_threshold_msg, + &data); return -1; } =20 @@ -1393,7 +1509,8 @@ remoteRelayNetworkEventLifecycle(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_network(&data.net, net); + if (make_nonnull_network(&data.net, net) < 0) + goto error; data.callbackID =3D callback->callbackID; data.event =3D event; data.detail =3D detail; @@ -1403,6 +1520,11 @@ remoteRelayNetworkEventLifecycle(virConnectPtr conn, (xdrproc_t)xdr_remote_network_event_life= cycle_msg, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_network_event_lifecycle_msg, + &data); + return -1; } =20 static virConnectNetworkEventGenericCallback networkEventCallbacks[] =3D { @@ -1430,7 +1552,8 @@ remoteRelayStoragePoolEventLifecycle(virConnectPtr co= nn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_storage_pool(&data.pool, pool); + if (make_nonnull_storage_pool(&data.pool, pool) < 0) + goto error; data.callbackID =3D callback->callbackID; data.event =3D event; data.detail =3D detail; @@ -1441,6 +1564,11 @@ remoteRelayStoragePoolEventLifecycle(virConnectPtr c= onn, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_storage_pool_event_lifecycle_msg, + &data); + return -1; } =20 static int @@ -1460,7 +1588,8 @@ remoteRelayStoragePoolEventRefresh(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_storage_pool(&data.pool, pool); + if (make_nonnull_storage_pool(&data.pool, pool) < 0) + goto error; data.callbackID =3D callback->callbackID; =20 remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -1469,6 +1598,11 @@ remoteRelayStoragePoolEventRefresh(virConnectPtr con= n, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_storage_pool_event_refresh_msg, + &data); + return -1; } =20 static virConnectStoragePoolEventGenericCallback storageEventCallbacks[] = =3D { @@ -1497,7 +1631,8 @@ remoteRelayNodeDeviceEventLifecycle(virConnectPtr con= n, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_node_device(&data.dev, dev); + if (make_nonnull_node_device(&data.dev, dev) < 0) + goto error; data.callbackID =3D callback->callbackID; data.event =3D event; data.detail =3D detail; @@ -1508,6 +1643,11 @@ remoteRelayNodeDeviceEventLifecycle(virConnectPtr co= nn, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_node_device_event_lifecycle_msg, + &data); + return -1; } =20 static int @@ -1527,7 +1667,8 @@ remoteRelayNodeDeviceEventUpdate(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_node_device(&data.dev, dev); + if (make_nonnull_node_device(&data.dev, dev) < 0) + goto error; data.callbackID =3D callback->callbackID; =20 remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -1536,6 +1677,11 @@ remoteRelayNodeDeviceEventUpdate(virConnectPtr conn, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_node_device_event_update_msg, + &data); + return -1; } =20 static virConnectNodeDeviceEventGenericCallback nodeDeviceEventCallbacks[]= =3D { @@ -1564,7 +1710,8 @@ remoteRelaySecretEventLifecycle(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_secret(&data.secret, secret); + if (make_nonnull_secret(&data.secret, secret) < 0) + goto error; data.callbackID =3D callback->callbackID; data.event =3D event; data.detail =3D detail; @@ -1575,6 +1722,11 @@ remoteRelaySecretEventLifecycle(virConnectPtr conn, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_secret_event_lifecycle_msg, + &data); + return -1; } =20 static int @@ -1594,7 +1746,8 @@ remoteRelaySecretEventValueChanged(virConnectPtr conn, =20 /* build return data */ memset(&data, 0, sizeof(data)); - make_nonnull_secret(&data.secret, secret); + if (make_nonnull_secret(&data.secret, secret) < 0) + goto error; data.callbackID =3D callback->callbackID; =20 remoteDispatchObjectEventSend(callback->client, remoteProgram, @@ -1603,6 +1756,11 @@ remoteRelaySecretEventValueChanged(virConnectPtr con= n, &data); =20 return 0; + + error: + xdr_free((xdrproc_t)xdr_remote_secret_event_value_changed_msg, + &data); + return -1; } =20 static virConnectSecretEventGenericCallback secretEventCallbacks[] =3D { @@ -1645,7 +1803,8 @@ remoteRelayDomainQemuMonitorEvent(virConnectPtr conn, VIR_STRDUP(*details_p, details) < 0)) goto error; data.details =3D details_p; - make_nonnull_domain(&data.dom, dom); + if (make_nonnull_domain(&data.dom, dom) < 0) + goto error; =20 remoteDispatchObjectEventSend(callback->client, qemuProgram, QEMU_PROC_DOMAIN_MONITOR_EVENT, @@ -1654,8 +1813,9 @@ remoteRelayDomainQemuMonitorEvent(virConnectPtr conn, return; =20 error: - VIR_FREE(data.event); - VIR_FREE(details_p); + xdr_free((xdrproc_t)xdr_qemu_domain_monitor_event_msg, + &data); + return; } =20 static @@ -4649,7 +4809,8 @@ remoteDispatchDomainMigrateFinish3(virNetServerPtr se= rver ATTRIBUTE_UNUSED, args->cancelled))) goto cleanup; =20 - make_nonnull_domain(&ret->dom, dom); + if (make_nonnull_domain(&ret->dom, dom) < 0) + goto cleanup; =20 /* remoteDispatchClientRequest will free cookie */ @@ -5585,7 +5746,8 @@ remoteDispatchDomainMigrateFinish3Params(virNetServer= Ptr server ATTRIBUTE_UNUSED if (!dom) goto cleanup; =20 - make_nonnull_domain(&ret->dom, dom); + if (make_nonnull_domain(&ret->dom, dom) < 0) + goto cleanup; =20 ret->cookie_out.cookie_out_len =3D cookieoutlen; ret->cookie_out.cookie_out_val =3D cookieout; @@ -5740,7 +5902,9 @@ remoteDispatchDomainCreateXMLWithFiles(virNetServerPt= r server ATTRIBUTE_UNUSED, args->flags)) =3D=3D NULL) goto cleanup; =20 - make_nonnull_domain(&ret->dom, dom); + if (make_nonnull_domain(&ret->dom, dom) < 0) + goto cleanup; + rv =3D 0; =20 cleanup: @@ -5790,7 +5954,9 @@ static int remoteDispatchDomainCreateWithFiles(virNet= ServerPtr server ATTRIBUTE_ args->flags) < 0) goto cleanup; =20 - make_nonnull_domain(&ret->dom, dom); + if (make_nonnull_domain(&ret->dom, dom) < 0) + goto cleanup; + rv =3D 0; =20 cleanup: @@ -6686,7 +6852,8 @@ remoteDispatchConnectGetAllDomainStats(virNetServerPt= r server ATTRIBUTE_UNUSED, for (i =3D 0; i < nrecords; i++) { remote_domain_stats_record *dst =3D ret->retStats.retStats_val= + i; =20 - make_nonnull_domain(&dst->dom, retStats[i]->dom); + if (make_nonnull_domain(&dst->dom, retStats[i]->dom) < 0) + goto cleanup; =20 if (virTypedParamsSerialize(retStats[i]->params, retStats[i]->nparams, @@ -7106,77 +7273,113 @@ get_nonnull_node_device(virConnectPtr conn, remote= _nonnull_node_device dev) } =20 /* Make remote_nonnull_domain and remote_nonnull_network. */ -static void +static int make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainPtr dom_src) { dom_dst->id =3D dom_src->id; - ignore_value(VIR_STRDUP_QUIET(dom_dst->name, dom_src->name)); + if (VIR_STRDUP(dom_dst->name, dom_src->name) < 0) + return -1; memcpy(dom_dst->uuid, dom_src->uuid, VIR_UUID_BUFLEN); + return 0; } =20 -static void +static int make_nonnull_network(remote_nonnull_network *net_dst, virNetworkPtr net_sr= c) { - ignore_value(VIR_STRDUP_QUIET(net_dst->name, net_src->name)); + if (VIR_STRDUP(net_dst->name, net_src->name) < 0) + return -1; memcpy(net_dst->uuid, net_src->uuid, VIR_UUID_BUFLEN); + return 0; } =20 -static void +static int make_nonnull_interface(remote_nonnull_interface *interface_dst, virInterfacePtr interface_src) { - ignore_value(VIR_STRDUP_QUIET(interface_dst->name, interface_src->name= )); - ignore_value(VIR_STRDUP_QUIET(interface_dst->mac, interface_src->mac)); + if (VIR_STRDUP(interface_dst->name, interface_src->name) < 0) + return -1; + if (VIR_STRDUP(interface_dst->mac, interface_src->mac) < 0) { + VIR_FREE(interface_dst->name); + return -1; + } + return 0; } =20 -static void +static int make_nonnull_storage_pool(remote_nonnull_storage_pool *pool_dst, virStorag= ePoolPtr pool_src) { - ignore_value(VIR_STRDUP_QUIET(pool_dst->name, pool_src->name)); + if (VIR_STRDUP(pool_dst->name, pool_src->name) < 0) + return -1; memcpy(pool_dst->uuid, pool_src->uuid, VIR_UUID_BUFLEN); + return 0; } =20 -static void +static int make_nonnull_storage_vol(remote_nonnull_storage_vol *vol_dst, virStorageVo= lPtr vol_src) { - ignore_value(VIR_STRDUP_QUIET(vol_dst->pool, vol_src->pool)); - ignore_value(VIR_STRDUP_QUIET(vol_dst->name, vol_src->name)); - ignore_value(VIR_STRDUP_QUIET(vol_dst->key, vol_src->key)); + if (VIR_STRDUP(vol_dst->pool, vol_src->pool) < 0) + return -1; + if (VIR_STRDUP(vol_dst->name, vol_src->name) < 0) { + VIR_FREE(vol_dst->pool); + return -1; + } + if (VIR_STRDUP(vol_dst->key, vol_src->key) < 0) { + VIR_FREE(vol_dst->pool); + VIR_FREE(vol_dst->name); + return -1; + } + return 0; } =20 -static void +static int make_nonnull_node_device(remote_nonnull_node_device *dev_dst, virNodeDevic= ePtr dev_src) { - ignore_value(VIR_STRDUP_QUIET(dev_dst->name, dev_src->name)); + if (VIR_STRDUP(dev_dst->name, dev_src->name) < 0) + return -1; + return 0; } =20 -static void +static int make_nonnull_secret(remote_nonnull_secret *secret_dst, virSecretPtr secret= _src) { memcpy(secret_dst->uuid, secret_src->uuid, VIR_UUID_BUFLEN); secret_dst->usageType =3D secret_src->usageType; - ignore_value(VIR_STRDUP_QUIET(secret_dst->usageID, secret_src->usageID= )); + if (VIR_STRDUP(secret_dst->usageID, secret_src->usageID) < 0) + return -1; + return 0; } =20 -static void +static int make_nonnull_nwfilter(remote_nonnull_nwfilter *nwfilter_dst, virNWFilterPt= r nwfilter_src) { - ignore_value(VIR_STRDUP_QUIET(nwfilter_dst->name, nwfilter_src->name)); + if (VIR_STRDUP(nwfilter_dst->name, nwfilter_src->name) < 0) + return -1; memcpy(nwfilter_dst->uuid, nwfilter_src->uuid, VIR_UUID_BUFLEN); + return 0; } =20 -static void +static int make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding *binding_dst= , virNWFilterBindingPtr binding_src) { - ignore_value(VIR_STRDUP_QUIET(binding_dst->portdev, binding_src->portd= ev)); - ignore_value(VIR_STRDUP_QUIET(binding_dst->filtername, binding_src->fi= ltername)); + if (VIR_STRDUP(binding_dst->portdev, binding_src->portdev) < 0) + return -1; + if (VIR_STRDUP(binding_dst->filtername, binding_src->filtername) < 0) { + VIR_FREE(binding_dst->portdev); + return -1; + } + return 0; } =20 -static void +static int make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst,= virDomainSnapshotPtr snapshot_src) { - ignore_value(VIR_STRDUP_QUIET(snapshot_dst->name, snapshot_src->name)); - make_nonnull_domain(&snapshot_dst->dom, snapshot_src->domain); + if (VIR_STRDUP(snapshot_dst->name, snapshot_src->name) < 0) + return -1; + if (make_nonnull_domain(&snapshot_dst->dom, snapshot_src->domain) < 0)= { + VIR_FREE(snapshot_dst->name); + return -1; + } + return 0; } =20 static int diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl index a8b9f5aeca..ce4db5d7b7 100755 --- a/src/rpc/gendispatch.pl +++ b/src/rpc/gendispatch.pl @@ -786,12 +786,12 @@ elsif ($mode eq "server") { if ($call->{ProcName} eq "DomainCreateWithFlags") { # SPECIAL: virDomainCreateWithFlags updates the gi= ven # domain object instead of returning a ne= w one - push(@ret_list, "make_nonnull_$1(&ret->$2, $2);"); + push(@ret_list, "if (make_nonnull_$1(&ret->$2, $2)= < 0)\n goto cleanup;\n"); $single_ret_var =3D undef; $single_ret_by_ref =3D 1; } else { push(@vars_list, "vir${type_name}Ptr $2 =3D NULL"); - push(@ret_list, "make_nonnull_$1(&ret->$2, $2);"); + push(@ret_list, "if (make_nonnull_$1(&ret->$2, $2)= < 0)\n goto cleanup;\n"); push(@free_list, " virObjectUnref($2);"); $single_ret_var =3D $2; @@ -907,11 +907,11 @@ elsif ($mode eq "server") { =20 if ($1 eq "client") { push(@vars_list, "virNetServer${type_name}Ptr $2 = =3D NULL"); - push(@ret_list, "make_nonnull_$1(&ret->$2, $2);"); - push(@ret_list, "make_nonnull_server(&ret->$2.srv,= srv);"); + push(@ret_list, "if (make_nonnull_$1(&ret->$2, $2)= < 0)\n goto cleanup;\n"); + push(@ret_list, "if (make_nonnull_server(&ret->$2.= srv, srv) < 0)\n goto cleanup;\n"); } else { push(@vars_list, "virNet${type_name}Ptr $2 =3D NUL= L"); - push(@ret_list, "make_nonnull_$1(&ret->$2, $2);"); + push(@ret_list, "if (make_nonnull_$1(&ret->$2, $2)= < 0)\n goto cleanup;\n"); } =20 push(@free_list, @@ -1175,12 +1175,15 @@ elsif ($mode eq "server") { print " ret->$single_ret_list_name.${single_ret_list_na= me}_len =3D nresults;\n"; if ($modern_ret_is_nested) { print " for (i =3D 0; i < nresults; i++) {\n"; - print " make_nonnull_$modern_ret_struct_name(re= t->$single_ret_list_name.${single_ret_list_name}_val + i, result[i]);\n"; - print " make_nonnull_$modern_ret_nested_struct_= name(&ret->$single_ret_list_name.${single_ret_list_name}_val[i].srv, srv);\= n"; + print " if (make_nonnull_$modern_ret_struct_nam= e(ret->$single_ret_list_name.${single_ret_list_name}_val + i, result[i]) < = 0)\n"; + print " goto cleanup;\n"; + print " if (make_nonnull_$modern_ret_nested_str= uct_name(&ret->$single_ret_list_name.${single_ret_list_name}_val[i].srv, sr= v) < 0)\n"; + print " goto cleanup;\n"; print " }\n"; } else { print " for (i =3D 0; i < nresults; i++)\n"; - print " make_nonnull_$modern_ret_struct_name(re= t->$single_ret_list_name.${single_ret_list_name}_val + i, result[i]);\n"; + print " if (make_nonnull_$modern_ret_struct_nam= e(ret->$single_ret_list_name.${single_ret_list_name}_val + i, result[i]) < = 0)\n"; + print " goto cleanup;\n"; } print " } else {\n"; print " ret->$single_ret_list_name.${single_ret_list_na= me}_len =3D 0;\n"; --=20 2.19.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list