X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=generator%2Fgenerator_daemon.ml;h=753771694779ab41cf54811c7c8bb7f158652a07;hb=c55bad93fbde03a3daa6058913f02098c45e55f5;hp=f5c1fa3e79ba0c02b96a0f50fe10e648b0c2033a;hpb=f4d996fd26762053d68f46de5790aae893f03d38;p=libguestfs.git diff --git a/generator/generator_daemon.ml b/generator/generator_daemon.ml index f5c1fa3..7537716 100644 --- a/generator/generator_daemon.ml +++ b/generator/generator_daemon.ml @@ -122,7 +122,11 @@ and generate_daemon_actions () = let is_filein = List.exists (function FileIn _ -> true | _ -> false) args in - (* Reject unknown optional arguments. *) + (* Reject unknown optional arguments. + * Note this code is included even for calls with no optional + * args because the caller must not pass optargs_bitmask != 0 + * in that case. + *) if optargs <> [] then ( let len = List.length optargs in let mask = Int64.lognot (Int64.pred (Int64.shift_left 1L len)) in @@ -132,8 +136,15 @@ and generate_daemon_actions () = pr " reply_with_error (\"unknown option in optional arguments bitmask (this can happen if a program is compiled against a newer version of libguestfs, then run against an older version of the daemon)\");\n"; pr " goto done;\n"; pr " }\n"; - pr "\n" + ) else ( + pr " if (optargs_bitmask != 0) {\n"; + if is_filein then + pr " cancel_receive ();\n"; + pr " reply_with_error (\"header optargs_bitmask field must be passed as 0 for calls that don't take optional arguments\");\n"; + pr " goto done;\n"; + pr " }\n"; ); + pr "\n"; (* Decode arguments. *) if args <> [] || optargs <> [] then ( @@ -278,6 +289,7 @@ and generate_daemon_actions () = | RStruct (n, _) -> pr " struct guestfs_%s_ret ret;\n" name; pr " ret.%s = *r;\n" n; + pr " free (r);\n"; pr " reply ((xdrproc_t) xdr_guestfs_%s_ret, (char *) &ret);\n" name; pr " xdr_free ((xdrproc_t) xdr_guestfs_%s_ret, (char *) &ret);\n" @@ -285,6 +297,7 @@ and generate_daemon_actions () = | RStructList (n, _) -> pr " struct guestfs_%s_ret ret;\n" name; pr " ret.%s = *r;\n" n; + pr " free (r);\n"; pr " reply ((xdrproc_t) xdr_guestfs_%s_ret, (char *) &ret);\n" name; pr " xdr_free ((xdrproc_t) xdr_guestfs_%s_ret, (char *) &ret);\n"