aboutsummaryrefslogtreecommitdiff
path: root/toys/posix
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2021-01-23 03:00:35 -0600
committerRob Landley <rob@landley.net>2021-01-23 03:00:35 -0600
commit76d3160cfabe15568f006ad530c105b9ad6fdcdd (patch)
treec46cab49a8a66554d32da80fbd4a2c3d46f9fb2a /toys/posix
parent054d82ff46e236a7238c73d3dadfe446a6de4ff3 (diff)
downloadtoybox-76d3160cfabe15568f006ad530c105b9ad6fdcdd.tar.gz
Fix grep bug where -f /dev/null added "" regex matching everything,
and address TODO where -z was still splitting patterns on \n
Diffstat (limited to 'toys/posix')
-rw-r--r--toys/posix/grep.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/toys/posix/grep.c b/toys/posix/grep.c
index fce8d564..2ddb6b93 100644
--- a/toys/posix/grep.c
+++ b/toys/posix/grep.c
@@ -372,13 +372,24 @@ static void parse_regex(void)
// exit to free. Not supporting nofork for this command any time soon.)
al = TT.f ? TT.f : TT.e;
while (al) {
- if (TT.f) s = ss = xreadfile(al->arg, 0, 0);
- else s = ss = al->arg;
+ if (TT.f) {
+ if (!*(s = ss = xreadfile(al->arg, 0, 0))) {
+ free(ss);
+ s = 0;
+ }
+ } else s = ss = al->arg;
+
+ // Advance, when we run out of -f switch to -e.
+ al = al->next;
+ if (!al && TT.f) {
+ TT.f = 0;
+ al = TT.e;
+ }
+ if (!s) continue;
// Split lines at \n, add individual lines to new list.
do {
-// TODO: NUL terminated input shouldn't split -e at \n
- ss = strchr(s, '\n');
+ ss = FLAG(z) ? 0 : strchr(s, '\n');
if (ss) *(ss++) = 0;
new = xmalloc(sizeof(struct arg_list));
new->next = list;
@@ -386,13 +397,6 @@ static void parse_regex(void)
list = new;
s = ss;
} while (ss && *s);
-
- // Advance, when we run out of -f switch to -e.
- al = al->next;
- if (!al && TT.f) {
- TT.f = 0;
- al = TT.e;
- }
}
TT.e = list;