grep: fix a case when -o loops forever
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 4 Dec 2009 01:48:14 +0000 (02:48 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 4 Dec 2009 01:48:14 +0000 (02:48 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
findutils/grep.c
testsuite/grep.tests

index 776a629..9dc2f19 100644 (file)
@@ -229,8 +229,8 @@ static int grep_file(FILE *file)
        char *line = NULL;
        ssize_t line_len;
        size_t line_alloc_len;
-#define rm_so start[0]
-#define rm_eo end[0]
+# define rm_so start[0]
+# define rm_eo end[0]
 #endif
 #if ENABLE_FEATURE_GREP_CONTEXT
        int print_n_lines_after = 0;
@@ -238,7 +238,7 @@ static int grep_file(FILE *file)
        int idx = 0; /* used for iteration through the circular buffer */
 #else
        enum { print_n_lines_after = 0 };
-#endif /* ENABLE_FEATURE_GREP_CONTEXT */
+#endif
 
        while (
 #if !ENABLE_EXTRA_COMPAT
@@ -377,6 +377,8 @@ static int grep_file(FILE *file)
                                                print_line(line + gl->matched_range.rm_so,
                                                                end - gl->matched_range.rm_so,
                                                                linenum, ':');
+                                               if (old == '\0')
+                                                       break;
                                                line[end] = old;
 #if !ENABLE_EXTRA_COMPAT
                                                if (regexec(&gl->compiled_regex, line + end,
index 6e14f91..64df19c 100755 (executable)
@@ -90,4 +90,9 @@ testing "grep -E -o prints all matches" \
        "00:19:3E:00:AA:5E\n00:1D:60:3D:3A:FB\n00:22:43:49:FB:AA\n" \
        "" "00:19:3E:00:AA:5E 00:1D:60:3D:3A:FB 00:22:43:49:FB:AA\n"
 
+testing "grep -o does not loop forever" \
+       'grep -o "[^/]*$"' \
+       "test\n" \
+       "" "/var/test\n"
+
 exit $FAILCOUNT