Fix some memory allocation problems
authorGlenn L McGrath <bug1@ihug.co.nz>
Mon, 15 Sep 2003 09:22:04 +0000 (09:22 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Mon, 15 Sep 2003 09:22:04 +0000 (09:22 -0000)
----------------------------------------------------------------------

editors/sed.c

index 2b01ec7ff2e71027679c4b5b8cca04d5066c7621..05eb744a40111c7ce88c51b3d07247abe97d7239 100644 (file)
@@ -237,7 +237,7 @@ static int parse_regex_delim(const char *cmdstr, char **match, char **replace)
  */
 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 @@ static char *add_cmd(char *cmdstr)
        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 @@ static void process_file(FILE * file)
                                        /* 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