diff: fix infinite loop with --color-moved --ignore-space-change
[gitweb.git] / sub-process.c
index 536b60ccedd7828af15d2a1ab5ff721e31ad3f92..a3cfab1a9d1feb1fea3fbc9bb9dbe04a89b9c874 100644 (file)
@@ -5,9 +5,10 @@
 #include "sigchain.h"
 #include "pkt-line.h"
 
-int cmd2process_cmp(const struct subprocess_entry *e1,
-                          const struct subprocess_entry *e2,
-                          const void *unused)
+int cmd2process_cmp(const void *unused_cmp_data,
+                   const struct subprocess_entry *e1,
+                   const struct subprocess_entry *e2,
+                   const void *unused_keydata)
 {
        return strcmp(e1->cmd, e2->cmd);
 }
@@ -21,13 +22,15 @@ struct subprocess_entry *subprocess_find_entry(struct hashmap *hashmap, const ch
        return hashmap_get(hashmap, &key, NULL);
 }
 
-void subprocess_read_status(int fd, struct strbuf *status)
+int subprocess_read_status(int fd, struct strbuf *status)
 {
        struct strbuf **pair;
        char *line;
+       int len;
+
        for (;;) {
-               line = packet_read_line(fd, NULL);
-               if (!line)
+               len = packet_read_line_gently(fd, NULL, &line);
+               if ((len < 0) || !line)
                        break;
                pair = strbuf_split_str(line, '=', 2);
                if (pair[0] && pair[0]->len && pair[1]) {
@@ -39,6 +42,8 @@ void subprocess_read_status(int fd, struct strbuf *status)
                }
                strbuf_list_free(pair);
        }
+
+       return (len < 0) ? len : 0;
 }
 
 void subprocess_stop(struct hashmap *hashmap, struct subprocess_entry *entry)