diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 5e298013eb32d1798b19f4cc02b08f546098aa9e..0462434378419ecf09f3e23350931b278b0662bc 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -3456,6 +3456,7 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 	live_result = getsockopt(live_fd, level, optname, live_optval, &live_optlen);
 
 	if (end_syscall(state, syscall, CHECK_EXACT, live_result, error)) {
+		free(live_optval);
 		return STATUS_ERR;
 	}
 
@@ -3466,6 +3467,11 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		return STATUS_ERR;
 	}
 
+	if (live_result != 0) {
+		free(live_optval);
+		return STATUS_OK;
+	}
+
 	switch (val_expression->type) {
 	case EXPR_LINGER:
 		result = check_linger(val_expression->value.linger, live_optval, error);