diff options
author | Daniel P. Berrangé <berrange@redhat.com> | 2018-12-10 18:48:47 +0000 |
---|---|---|
committer | Daniel P. Berrangé <berrange@redhat.com> | 2018-12-13 16:57:32 +0000 |
commit | dc54b3ecc9933c8bdcc4f0aa0fa81d170fcf3e54 (patch) | |
tree | 2c96a3a3db0fca43aa0006fcb912710210617c75 /src/rpc/gendispatch.pl | |
parent | 600462834f4ec1955a9a48a1b6b4a390b9c31553 (diff) | |
download | libvirt-dc54b3ecc9933c8bdcc4f0aa0fa81d170fcf3e54.tar.gz |
remote: check & report OOM in make_nonnull_XXX methods
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@redhat.com>
Diffstat (limited to 'src/rpc/gendispatch.pl')
-rwxr-xr-x | src/rpc/gendispatch.pl | 19 |
1 files changed, 11 insertions, 8 deletions
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 given # domain object instead of returning a new 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 = undef; $single_ret_by_ref = 1; } else { push(@vars_list, "vir${type_name}Ptr $2 = 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 = $2; @@ -907,11 +907,11 @@ elsif ($mode eq "server") { if ($1 eq "client") { push(@vars_list, "virNetServer${type_name}Ptr $2 = 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 = 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, @@ -1175,12 +1175,15 @@ elsif ($mode eq "server") { print " ret->$single_ret_list_name.${single_ret_list_name}_len = nresults;\n"; if ($modern_ret_is_nested) { print " for (i = 0; i < nresults; i++) {\n"; - print " make_nonnull_$modern_ret_struct_name(ret->$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_name(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_struct_name(&ret->$single_ret_list_name.${single_ret_list_name}_val[i].srv, srv) < 0)\n"; + print " goto cleanup;\n"; print " }\n"; } else { print " for (i = 0; i < nresults; i++)\n"; - print " make_nonnull_$modern_ret_struct_name(ret->$single_ret_list_name.${single_ret_list_name}_val + i, result[i]);\n"; + print " if (make_nonnull_$modern_ret_struct_name(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_name}_len = 0;\n"; |