summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2009-12-04 02:48:14 +0100
committerDenys Vlasenko2009-12-04 02:48:14 +0100
commit6dc0ace10943b9f8e004b63277dc1186594f0450 (patch)
treefbfea896312234df57f330e16629c246a660aea0
parent6a110c969f357d5ab3503660c6404a1ee9d916eb (diff)
downloadbusybox-6dc0ace10943b9f8e004b63277dc1186594f0450.zip
busybox-6dc0ace10943b9f8e004b63277dc1186594f0450.tar.gz
grep: fix a case when -o loops forever
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--findutils/grep.c8
-rwxr-xr-xtestsuite/grep.tests5
2 files changed, 10 insertions, 3 deletions
diff --git a/findutils/grep.c b/findutils/grep.c
index 776a629..9dc2f19 100644
--- a/findutils/grep.c
+++ b/findutils/grep.c
@@ -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,
diff --git a/testsuite/grep.tests b/testsuite/grep.tests
index 6e14f91..64df19c 100755
--- a/testsuite/grep.tests
+++ b/testsuite/grep.tests
@@ -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