diff --git a/gtests/net/packetdrill/tcp_options.c b/gtests/net/packetdrill/tcp_options.c
index 2998c312eb8d980e801fcfe05829c20ddd101a81..b7def9db87fe3d6c61c6df56c5363bf4033da1ac 100644
--- a/gtests/net/packetdrill/tcp_options.c
+++ b/gtests/net/packetdrill/tcp_options.c
@@ -49,6 +49,7 @@ int tcp_options_append(struct tcp_options *options,
 	memcpy(options->data + options->length, option, option->length);
 	options->length += option->length;
 	assert(options->length <= sizeof(options->data));
+	free(option);
 	return STATUS_OK;
 }
 
diff --git a/gtests/net/packetdrill/tcp_packet.c b/gtests/net/packetdrill/tcp_packet.c
index 1292b5975505325fe58558962877628a4354e509..fc32605c9411cd2e9593f403f644a48b2486cc3a 100644
--- a/gtests/net/packetdrill/tcp_packet.c
+++ b/gtests/net/packetdrill/tcp_packet.c
@@ -58,7 +58,7 @@ struct packet *new_tcp_packet(int address_family,
 			       u16 tcp_payload_bytes,
 			       u32 ack_sequence,
 			       s32 window,
-			       const struct tcp_options *tcp_options,
+			       struct tcp_options *tcp_options,
 			       bool ignore_ts_val,
 			       bool abs_ts_ecr,
 			       bool abs_seq,
@@ -182,6 +182,7 @@ struct packet *new_tcp_packet(int address_family,
 		/* Copy TCP options into packet */
 		memcpy(tcp_option_start, tcp_options->data,
 		       tcp_options->length);
+		free(tcp_options);
 	}
 
 	if (ignore_ts_val) {
diff --git a/gtests/net/packetdrill/tcp_packet.h b/gtests/net/packetdrill/tcp_packet.h
index 1a9115cd5750c453d1927725fbd10ea07394e70c..4a2947a75fbddfcb7c31bb08dcb49d1da5e973ca 100644
--- a/gtests/net/packetdrill/tcp_packet.h
+++ b/gtests/net/packetdrill/tcp_packet.h
@@ -43,7 +43,7 @@ extern struct packet *new_tcp_packet(int address_family,
 				     u16 tcp_payload_bytes,
 				     u32 ack_sequence,
 				     s32 window,
-				     const struct tcp_options *tcp_options,
+				     struct tcp_options *tcp_options,
 				     bool ignore_ts_val,
 				     bool abs_ts_ecr,
 				     bool abs_seq,