summaryrefslogtreecommitdiff
path: root/src/rpc/gendispatch.pl
diff options
context:
space:
mode:
authorDaniel P. Berrangé <berrange@redhat.com>2018-12-10 18:48:47 +0000
committerDaniel P. Berrangé <berrange@redhat.com>2018-12-13 16:57:32 +0000
commitdc54b3ecc9933c8bdcc4f0aa0fa81d170fcf3e54 (patch)
tree2c96a3a3db0fca43aa0006fcb912710210617c75 /src/rpc/gendispatch.pl
parent600462834f4ec1955a9a48a1b6b4a390b9c31553 (diff)
downloadlibvirt-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-xsrc/rpc/gendispatch.pl19
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";