diff --git a/src/m_argv.c b/src/m_argv.c
index 905ac6ab802d27c5a3d875427c729b25c0ebb1ea..5c5dc37cfb9cb70a958d1582b38ea8b5ee1ff191 100644
--- a/src/m_argv.c
+++ b/src/m_argv.c
@@ -25,6 +25,10 @@ INT32 myargc;
 */
 char **myargv;
 
+/** \brief did we alloc myargv ourselves?
+*/
+boolean myargmalloc = false;
+
 /**	\brief founded the parm
 */
 static INT32 found;
@@ -176,6 +180,7 @@ void M_FindResponseFile(void)
 				free(file);
 				I_Error("Not enough memory to read response file");
 			}
+			myargmalloc = true; // mark as having been allocated by us
 			memset(myargv, 0, sizeof (char *) * MAXARGVS);
 			myargv[0] = firstargv;
 
diff --git a/src/m_argv.h b/src/m_argv.h
index 46ef9a2cf5d81da5ddee474f004d17f6286d7f30..af346a2c16011168200d842dc27d47d61d4c2d78 100644
--- a/src/m_argv.h
+++ b/src/m_argv.h
@@ -19,6 +19,7 @@
 //
 extern INT32 myargc;
 extern char **myargv;
+extern boolean myargmalloc;
 
 // Returns the position of the given parameter in the arg list (0 if not found).
 INT32 M_CheckParm(const char *check);
diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c
index 869fd7d9877a4ae36eac09fd64a4a8cb849e0c18..2b35ce8b8a044c824b6f825a117d5ae1cf9703dc 100644
--- a/src/sdl/i_system.c
+++ b/src/sdl/i_system.c
@@ -2139,7 +2139,8 @@ void I_Quit(void)
 		printf("\r");
 		ShowEndTxt();
 	}
-	free(myargv); // Deallocate allocated memory
+	if (myargmalloc)
+		free(myargv); // Deallocate allocated memory
 death:
 	W_Shutdown();
 	exit(0);
diff --git a/src/sdl12/i_system.c b/src/sdl12/i_system.c
index 2be6b55f044abd14c30afa0f2cce4a63e8899c21..8729e5921d5b423945c47a58d2fb820a2f72d354 100644
--- a/src/sdl12/i_system.c
+++ b/src/sdl12/i_system.c
@@ -2301,7 +2301,8 @@ void I_Quit(void)
 		printf("\r");
 		ShowEndTxt();
 	}
-	free(myargv); // Deallocate allocated memory
+	if (myargmalloc)
+		free(myargv); // Deallocate allocated memory
 death:
 	W_Shutdown();
 #ifdef GP2X
diff --git a/src/win32/win_sys.c b/src/win32/win_sys.c
index 110eafb7a25d0faccfb34d32a05fae7e94870644..77a21f7f38fd6d4c525391be3beaaaf57781885b 100644
--- a/src/win32/win_sys.c
+++ b/src/win32/win_sys.c
@@ -771,7 +771,8 @@ void I_Quit(void)
 		ShowEndTxt(co);
 	}
 	fflush(stderr);
-	free(myargv); // Deallocate allocated memory
+	if (myargmalloc)
+		free(myargv); // Deallocate allocated memory
 	W_Shutdown();
 	exit(0);
 }