diff --git a/gtests/net/packetdrill/wire_server.c b/gtests/net/packetdrill/wire_server.c
index 25e3d372577ed6149a7e6be9ce586761dd67d8b3..6e722dc791e8b5e00544c639b224f2722e7fd69e 100644
--- a/gtests/net/packetdrill/wire_server.c
+++ b/gtests/net/packetdrill/wire_server.c
@@ -290,6 +290,7 @@ static int wire_server_send_packets_done(struct wire_server *wire_server,
 					 const char *error)
 {
 	struct wire_packets_done done;
+	int status;
 	int error_len = strlen(error) + 1;	/* +1 for '\0' */
 	int buf_len = sizeof(done) + error_len;
 	char *buf = malloc(buf_len);
@@ -303,10 +304,13 @@ static int wire_server_send_packets_done(struct wire_server *wire_server,
 			    WIRE_PACKETS_DONE,
 			    buf, buf_len)) {
 		fprintf(stderr, "error sending WIRE_PACKETS_DONE\n");
-		return STATUS_ERR;
+		status = STATUS_ERR;
+	} else {
+		status = STATUS_OK;
 	}
 
-	return STATUS_OK;
+	free(buf);
+	return status;
 }
 
 /* Coordinate with the wire client. See wire_client_next_event(). */