Index: kernel/generic/src/ipc/ops/dataread.c
===================================================================
--- kernel/generic/src/ipc/ops/dataread.c	(revision b1e6269e0d19f6fc32213d11e1344dccf38f6bf7)
+++ kernel/generic/src/ipc/ops/dataread.c	(revision e5a42504f366c20076dc505b2d70d174dfdbaf19)
@@ -66,4 +66,5 @@
 		size_t max_size = IPC_GET_ARG2(*olddata);
 		size_t size = IPC_GET_ARG2(answer->data);
+
 		if (size && size <= max_size) {
 			/*
@@ -78,6 +79,8 @@
 			if (rc) {
 				IPC_SET_RETVAL(answer->data, rc);
-				free(answer->buffer);
-				answer->buffer = NULL;
+				/*
+				 * answer->buffer will be cleaned up in
+				 * ipc_call_free().
+				 */
 			}
 		} else if (!size) {
Index: kernel/generic/src/ipc/ops/datawrite.c
===================================================================
--- kernel/generic/src/ipc/ops/datawrite.c	(revision b1e6269e0d19f6fc32213d11e1344dccf38f6bf7)
+++ kernel/generic/src/ipc/ops/datawrite.c	(revision e5a42504f366c20076dc505b2d70d174dfdbaf19)
@@ -58,5 +58,8 @@
 	int rc = copy_from_uspace(call->buffer, (void *) src, size);
 	if (rc != 0) {
-		free(call->buffer);
+		/*
+		 * call->buffer will be cleaned up in ipc_call_free() at the
+		 * latest.
+		 */
 		return rc;
 	}
