[libvirt] [PATCH] remote: check & report OOM in make_nonnull_XXX methods
Michal Privoznik
mprivozn at redhat.com
Thu Dec 13 14:39:29 UTC 2018
On 12/11/18 4:56 PM, Daniel P. Berrangé wrote:
> 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é <berrange at redhat.com>
> ---
> 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_dispatch.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);
> }
>
> -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_src)));
> + if (VIR_STRDUP(srv_dst->name, virNetServerGetName(srv_src)) < 0)
> + return -1;
> + return 0;
> }
>
> static virNetServerClientPtr
> @@ -128,13 +130,14 @@ get_nonnull_client(virNetServerPtr srv, admin_nonnull_client clnt)
> return virNetServerGetClient(srv, clnt.id);
> }
>
> -static void
> +static int
> make_nonnull_client(admin_nonnull_client *clt_dst,
> virNetServerClientPtr clt_src)
> {
> clt_dst->id = virNetServerClientGetID(clt_src);
> clt_dst->timestamp = virNetServerClientGetTimestamp(clt_src);
> clt_dst->transport = virNetServerClientGetTransport(clt_src);
> + return 0;
> }
>
> /* 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(virConnectPtr conn, remote_nonnull_nw
> static virNWFilterBindingPtr get_nonnull_nwfilter_binding(virConnectPtr conn, 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, virDomainPtr dom_src);
> -static void make_nonnull_network(remote_nonnull_network *net_dst, virNetworkPtr 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_dst, 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, virSecretPtr secret_src);
> -static void make_nonnull_nwfilter(remote_nonnull_nwfilter *net_dst, virNWFilterPtr 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 *snapshot_dst, virDomainSnapshotPtr snapshot_src);
> +static int make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainPtr dom_src) ATTRIBUTE_RETURN_CHECK;
> +static int make_nonnull_network(remote_nonnull_network *net_dst, virNetworkPtr 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, virStorageVolPtr vol_src) ATTRIBUTE_RETURN_CHECK;
> +static int make_nonnull_node_device(remote_nonnull_node_device *dev_dst, virNodeDevicePtr dev_src) ATTRIBUTE_RETURN_CHECK;
> +static int make_nonnull_secret(remote_nonnull_secret *secret_dst, virSecretPtr secret_src) ATTRIBUTE_RETURN_CHECK;
> +static int make_nonnull_nwfilter(remote_nonnull_nwfilter *net_dst, virNWFilterPtr 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 *snapshot_dst, virDomainSnapshotPtr snapshot_src) ATTRIBUTE_RETURN_CHECK;
>
> static int
> remoteSerializeDomainDiskErrors(virDomainDiskErrorPtr errors,
> @@ -315,7 +315,8 @@ remoteRelayDomainEventLifecycle(virConnectPtr conn,
>
> /* 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 = event;
> data.detail = detail;
>
> @@ -335,6 +336,11 @@ remoteRelayDomainEventLifecycle(virConnectPtr conn,
> }
>
> return 0;
> +
> + error:
> + xdr_free((xdrproc_t)xdr_remote_domain_event_lifecycle_msg,
> + &data);
> + return -1;
Strictly speaking, this is not needed. But I see the rationale behind.
ACK
Michal
More information about the libvir-list
mailing list