diff --git a/gtests/net/packetdrill/code.c b/gtests/net/packetdrill/code.c
index 085683a0dfa6fb734c9d912ef18afa74ab1c5c9e..3f4dd74ef00e74392c12b67efa618a44d9b5044b 100644
--- a/gtests/net/packetdrill/code.c
+++ b/gtests/net/packetdrill/code.c
@@ -618,6 +618,7 @@ void run_code_event(struct state *state, struct event *event,
 	return;
 
 error_out:
+	state_free(state);
 	die("%s:%d: runtime error in code: %s\n",
 	    state->config->script_path, event->line_number, error);
 	free(error);
diff --git a/gtests/net/packetdrill/run.c b/gtests/net/packetdrill/run.c
index bb962e13c18be4018005e442924a6a39bcd3089b..d6ff4af6afc0669d84cb8ffcb6c166fbcd77255f 100644
--- a/gtests/net/packetdrill/run.c
+++ b/gtests/net/packetdrill/run.c
@@ -401,6 +401,7 @@ static void run_local_packet_event(struct state *state, struct event *event,
 		fprintf(stderr, "%s", error);
 		free(error);
 	} else if (result == STATUS_ERR) {
+		state_free(state);
 		die("%s", error);
 	}
 }
@@ -588,6 +589,7 @@ void run_script(struct config *config, struct script *script)
 		wire_client_next_event(state->wire_client, NULL);
 
 	if (code_execute(state->code, &error)) {
+		state_free(state);
 		die("%s: error executing code: %s\n",
 		    state->config->script_path, error);
 		free(error);
diff --git a/gtests/net/packetdrill/run_command.c b/gtests/net/packetdrill/run_command.c
index a55e596d218d08ad0063db7bf5ea6d9b2c19c53e..85c302b5e6f464c00be740f251834efb94719718 100644
--- a/gtests/net/packetdrill/run_command.c
+++ b/gtests/net/packetdrill/run_command.c
@@ -48,6 +48,7 @@ void run_command_event(
 	return;
 
 error_out:
+	state_free(state);
 	die("%s:%d: error executing `%s` command: %s\n",
 	    state->config->script_path, event->line_number,
 	    command->command_line, error);
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 1a606a41893573264ad912a826ad96f47f5249c9..5f0fadb5aaff2a60dc6c10e99b81b3b041b9219a 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -1958,6 +1958,7 @@ static void invoke_system_call(
 	return;
 
 error_out:
+	state_free(state);
 	die("%s:%d: runtime error in %s call: %s\n",
 	    state->config->script_path, event->line_number,
 	    syscall->name, error);
@@ -2058,6 +2059,7 @@ static void enqueue_system_call(
 	return;
 
 error_out:
+	state_free(state);
 	die("%s:%d: runtime error in %s call: %s\n",
 	    state->config->script_path, event->line_number,
 	    syscall->name, error);