summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlaf Buddenhagen <antrik@gmx.net>2013-02-19 23:30:18 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2013-02-19 23:30:18 +0100
commit495615802f3671f1656d92a8712341a9b78d8dd1 (patch)
treede12b71e62444d0a3c00f8ad89741326cf88b619
parentc9a6a86c52bbc55fa0c44a3a62a84981cd0623e8 (diff)
Fix spurious deallocation
* server.c (WriteDestroyArg): Only dealloc out-of-line memory from request message if KERN_SUCCESS.
-rw-r--r--server.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/server.c b/server.c
index a49bb01..a041e61 100644
--- a/server.c
+++ b/server.c
@@ -761,16 +761,21 @@ WriteDestroyArg(FILE *file, register const argument_t *arg)
if (akCheck(arg->argKind, akbIndefinite)) {
/*
* Deallocate only if out-of-line.
+ *
+ * Also skip deallocation if error occured in processing the RPC.
+ * (Generic RPC handling code will clean up in this case)
*/
argument_t *count = arg->argCount;
ipc_type_t *btype = it->itElement;
int multiplier = btype->itTypeSize / btype->itNumber;
- fprintf(file, "\tif (!In%dP->%s%s.msgt_inline)\n",
+ fprintf(file, "\tif (OutP->%s == KERN_SUCCESS)\n",
+ arg->argRoutine->rtRetCode->argMsgField);
+ fprintf(file, "\t\tif (!In%dP->%s%s.msgt_inline)\n",
arg->argRequestPos,
arg->argTTName,
arg->argLongForm ? ".msgtl_header" : "");
- fprintf(file, "\t\t%smig_deallocate(* (vm_offset_t *) %s, ",
+ fprintf(file, "\t\t\t%smig_deallocate(* (vm_offset_t *) %s, ",
SubrPrefix, InArgMsgField(arg));
if (multiplier > 1)
fprintf(file, "%d * ", multiplier);