[BusyBox-cvs] busybox/editors sed.c,1.145,1.146

Glenn McGrath bug1 at busybox.net
Mon Sep 15 09:22:08 UTC 2003


Update of /var/cvs/busybox/editors
In directory winder:/tmp/cvs-serv11953/editors

Modified Files:
	sed.c 
Log Message:
Fix some memory allocation problems
----------------------------------------------------------------------


Index: sed.c
===================================================================
RCS file: /var/cvs/busybox/editors/sed.c,v
retrieving revision 1.145
retrieving revision 1.146
diff -u -d -r1.145 -r1.146
--- sed.c	15 Sep 2003 06:28:40 -0000	1.145
+++ sed.c	15 Sep 2003 09:22:04 -0000	1.146
@@ -237,7 +237,7 @@
  */
 static int get_address(char *my_str, int *linenum, regex_t ** regex)
 {
-	char *pos=my_str;
+	char *pos = my_str;
 
 	if (isdigit(*my_str)) {
 		*linenum = strtol(my_str, &pos, 10);
@@ -588,27 +588,33 @@
 	return (cmdstr);
 }
 
-static void add_cmd_str(char *cmdstr)
+static void add_cmd_str(const char *cmdstr)
 {
-#ifdef CONFIG_FEATURE_SED_EMBEDED_NEWLINE
-	char *cmdstr_ptr = cmdstr;
+	char *cmdstr_expanded = strdup(cmdstr);
+	char *cmdstr_ptr;
 
+#ifdef CONFIG_FEATURE_SED_EMBEDED_NEWLINE
+	cmdstr_ptr = cmdstr_expanded;
 	/* HACK: convert "\n" to match tranlated '\n' string */
 	while ((cmdstr_ptr = strstr(cmdstr_ptr, "\\n")) != NULL) {
-		cmdstr = xrealloc(cmdstr, strlen(cmdstr) + 2);
-		cmdstr_ptr = strstr(cmdstr, "\\n");
+		int length = strlen(cmdstr) + 2;
+		cmdstr_expanded = realloc(cmdstr_expanded, length);
+		cmdstr_ptr = strstr(cmdstr_expanded, "\\n");
 		memmove(cmdstr_ptr + 1, cmdstr_ptr, strlen(cmdstr_ptr) + 1);
 		cmdstr_ptr[0] = '\\';
 		cmdstr_ptr += 3;
 	}
 #endif
+	cmdstr_ptr = cmdstr_expanded;
 	do {
-		cmdstr = add_cmd(cmdstr);
-	} while (cmdstr && strlen(cmdstr));
+		cmdstr_ptr = add_cmd(cmdstr_ptr);
+	} while (cmdstr_ptr && strlen(cmdstr_ptr));
+
+	free(cmdstr_expanded);
 }
 
 
-static void load_cmd_file(char *filename)
+static void load_cmd_file(const char *filename)
 {
 	FILE *cmdfile;
 	char *line;
@@ -894,18 +900,15 @@
 					/* HACK: escape newlines twice so regex can match them */
 				{
 					int offset = 0;
-
-					while (strchr(pattern_space + offset, '\n') != NULL) {
-						char *tmp;
-
-						pattern_space =
-							xrealloc(pattern_space,
-							strlen(pattern_space) + 2);
-						tmp = strchr(pattern_space + offset, '\n');
+					char *tmp = strchr(pattern_space + offset, '\n');
+					while ((tmp = strchr(pattern_space + offset, '\n')) != NULL) {
+						offset = tmp - pattern_space;
+						pattern_space =	xrealloc(pattern_space,	strlen(pattern_space) + 2);
+						tmp = pattern_space + offset;
 						memmove(tmp + 1, tmp, strlen(tmp) + 1);
 						tmp[0] = '\\';
 						tmp[1] = 'n';
-						offset = tmp - pattern_space + 2;
+						offset += 2;
 					}
 				}
 #endif




More information about the busybox-cvs mailing list