Explorar o código

Fix for segfault in lib/utils_cmd.c

A free was being done on a modified pointer
Signed-off-by:John C. Frickson <jfrickson@nagios.com>
John C. Frickson %!s(int64=10) %!d(string=hai) anos
pai
achega
bee00616cb
Modificáronse 1 ficheiros con 6 adicións e 5 borrados
  1. 6 5
      lib/utils_cmd.c

+ 6 - 5
lib/utils_cmd.c

@@ -297,7 +297,7 @@ cmd_run (const char *cmdstring, output * out, output * err, int flags)
 	int i = 0, argc, rst;
 	int i = 0, argc, rst;
 	size_t cmdlen;
 	size_t cmdlen;
 	char **argv = NULL;
 	char **argv = NULL;
-	char *cmd = NULL;
+	char *cmd = NULL, *svcmd;
 	char *str = NULL;
 	char *str = NULL;
 
 
 	if (cmdstring == NULL)
 	if (cmdstring == NULL)
@@ -314,6 +314,7 @@ cmd_run (const char *cmdstring, output * out, output * err, int flags)
 	cmdlen = strlen (cmdstring);
 	cmdlen = strlen (cmdstring);
 	if ((cmd = malloc (cmdlen + 1)) == NULL)
 	if ((cmd = malloc (cmdlen + 1)) == NULL)
 		return -1;
 		return -1;
+    svcmd = cmd;
 	memcpy (cmd, cmdstring, cmdlen);
 	memcpy (cmd, cmdstring, cmdlen);
 	cmd[cmdlen] = '\0';
 	cmd[cmdlen] = '\0';
 
 
@@ -348,7 +349,7 @@ cmd_run (const char *cmdstring, output * out, output * err, int flags)
 		if (strstr (str, "'") == str) {	/* handle SIMPLE quoted strings */
 		if (strstr (str, "'") == str) {	/* handle SIMPLE quoted strings */
 			str++;
 			str++;
 			if (!strstr (str, "'")) { /* balanced? */
 			if (!strstr (str, "'")) { /* balanced? */
-				free(cmd);
+				free(svcmd);
 				free(argv);
 				free(argv);
 				return -1;
 				return -1;
 			}
 			}
@@ -361,13 +362,13 @@ cmd_run (const char *cmdstring, output * out, output * err, int flags)
 				str[strcspn (str, " \t\r\n")] = 0;
 				str[strcspn (str, " \t\r\n")] = 0;
 			}
 			}
 			else {
 			else {
-				free(cmd);
+				free(svcmd);
 				cmd = NULL;
 				cmd = NULL;
 			}
 			}
 		}
 		}
 
 
 		if (cmd && strlen (cmd) == strspn (cmd, " \t\r\n")) {
 		if (cmd && strlen (cmd) == strspn (cmd, " \t\r\n")) {
-			free(cmd);
+			free(svcmd);
 			cmd = NULL;
 			cmd = NULL;
 		}
 		}
 
 
@@ -375,7 +376,7 @@ cmd_run (const char *cmdstring, output * out, output * err, int flags)
 	}
 	}
 
 
 	rst = cmd_run_array (argv, out, err, flags);
 	rst = cmd_run_array (argv, out, err, flags);
-	free(cmd);
+	free(svcmd);
 	free(argv);
 	free(argv);
 	return rst;
 	return rst;
 }
 }