diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 3f95500a626e4c494ddacc6f22e5d25bc6995bcd..6f2647b17acef86dde924b0d6d7b266d4559912e 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -4670,16 +4670,24 @@ static int syscall_open(struct state *state, struct syscall_spec *syscall,
 
 	result = open(name, flags);
 
-	if (end_syscall(state, syscall, CHECK_FD, result, error))
+	if (end_syscall(state, syscall, CHECK_FD, result, error)) {
+		if (result >= 0) {
+			close(result);
+		}
 		return STATUS_ERR;
+	}
 
 	if (result >= 0) {
 		live_fd = result;
-		if (get_s32(syscall->result, &script_fd, error))
+		if (get_s32(syscall->result, &script_fd, error)) {
+			close(live_fd);
 			return STATUS_ERR;
+		}
 		if (!insert_new_socket(state, 0, 0,
-				       script_fd, live_fd, error))
+				       script_fd, live_fd, error)) {
+			close(live_fd);
 			return STATUS_ERR;
+		}
 	}
 
 	return STATUS_OK;