[git commit master] grep: fix a case when -o loops forever

Denys Vlasenko vda.linux at googlemail.com
Fri Dec 4 01:48:14 UTC 2009


commit: http://git.busybox.net/busybox/commit/?id=6dc0ace10943b9f8e004b63277dc1186594f0450
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 findutils/grep.c     |    8 +++++---
 testsuite/grep.tests |    5 +++++
 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
-- 
1.6.3.3



More information about the busybox-cvs mailing list