From 71a1c0a8523030fee6c57f5623c6d21a3baa049d Mon Sep 17 00:00:00 2001
From: Aomx <julian.cordes@gmail.com>
Date: Tue, 29 Sep 2015 16:58:43 +0200
Subject: [PATCH] prevented potential core dump by duplicating script_path for
 printing.

---
 gtests/net/packetdrill/code.c            |  6 ++++--
 gtests/net/packetdrill/run.c             |  4 +++-
 gtests/net/packetdrill/run_command.c     |  5 ++++-
 gtests/net/packetdrill/run_system_call.c | 12 ++++++++----
 4 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/gtests/net/packetdrill/code.c b/gtests/net/packetdrill/code.c
index 3f4dd74e..e0b89e91 100644
--- a/gtests/net/packetdrill/code.c
+++ b/gtests/net/packetdrill/code.c
@@ -573,7 +573,7 @@ void run_code_event(struct state *state, struct event *event,
 {
 	DEBUGP("%d: run code event\n", event->line_number);
 
-	char *error = NULL;
+	char *error = NULL, *script_path = NULL;
 
 	/* Wait for the right time before firing off this event. */
 	wait_for_event(state);
@@ -618,8 +618,10 @@ void run_code_event(struct state *state, struct event *event,
 	return;
 
 error_out:
+	script_path = strdup(state->config->script_path);
 	state_free(state);
 	die("%s:%d: runtime error in code: %s\n",
-	    state->config->script_path, event->line_number, error);
+	    script_path, event->line_number, error);
+	free(script_path);
 	free(error);
 }
diff --git a/gtests/net/packetdrill/run.c b/gtests/net/packetdrill/run.c
index 7baa7e2d..8a40af7b 100644
--- a/gtests/net/packetdrill/run.c
+++ b/gtests/net/packetdrill/run.c
@@ -591,9 +591,11 @@ void run_script(struct config *config, struct script *script)
 		wire_client_next_event(state->wire_client, NULL);
 
 	if (code_execute(state->code, &error)) {
+		char *script_path = strdup(state->config->script_path);
 		state_free(state);
 		die("%s: error executing code: %s\n",
-		    state->config->script_path, error);
+		    script_path, error);
+		free(script_path);
 		free(error);
 	}
 
diff --git a/gtests/net/packetdrill/run_command.c b/gtests/net/packetdrill/run_command.c
index 85c302b5..7fbaa973 100644
--- a/gtests/net/packetdrill/run_command.c
+++ b/gtests/net/packetdrill/run_command.c
@@ -36,6 +36,7 @@
 void run_command_event(
 	struct state *state, struct event *event, struct command_spec *command)
 {
+	char *script_path = NULL;
 	DEBUGP("%d: command: `%s`\n", event->line_number,
 	       command->command_line);
 
@@ -48,9 +49,11 @@ void run_command_event(
 	return;
 
 error_out:
+	script_path = strdup(state->config->script_path);
 	state_free(state);
 	die("%s:%d: error executing `%s` command: %s\n",
-	    state->config->script_path, event->line_number,
+	    script_path, event->line_number,
 	    command->command_line, error);
+	free(script_path);
 	free(error);
 }
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 5f0fadb5..85cb8a15 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -1924,7 +1924,7 @@ static void invoke_system_call(
 {
 	DEBUGP("%d: invoke call: %s\n", event->line_number, syscall->name);
 
-	char *error = NULL;
+	char *error = NULL, *script_path = NULL;
 	const char *name = syscall->name;
 	struct expression_list *args = NULL;
 	int i = 0;
@@ -1958,10 +1958,12 @@ static void invoke_system_call(
 	return;
 
 error_out:
+	script_path = strdup(state->config->script_path);
 	state_free(state);
 	die("%s:%d: runtime error in %s call: %s\n",
-	    state->config->script_path, event->line_number,
+	    script_path, event->line_number,
 	    syscall->name, error);
+	free(script_path);
 	free(error);
 }
 
@@ -2008,7 +2010,7 @@ static int yield(void)
 static void enqueue_system_call(
 	struct state *state, struct event *event, struct syscall_spec *syscall)
 {
-	char *error = NULL;
+	char *error = NULL, *script_path = NULL;
 	bool done = false;
 
 	/* Wait if there are back-to-back blocking system calls. */
@@ -2059,10 +2061,12 @@ static void enqueue_system_call(
 	return;
 
 error_out:
+	script_path = strdup(state->config->script_path);
 	state_free(state);
 	die("%s:%d: runtime error in %s call: %s\n",
-	    state->config->script_path, event->line_number,
+	    script_path, event->line_number,
 	    syscall->name, error);
+	free(script_path);
 	free(error);
 }
 
-- 
GitLab