From c06f568ddaaa65a05080234ec205593e2424dc45 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Wed, 4 Feb 2004 10:57:46 +0000 Subject: Rob Landley writes: While building glibc with busybox as part of the development environment, I found a bug in glibc's regexec can throw sed into an endless loop. This fixes it. Should I put an #ifdef around it or something? (Note, this patch also contains the "this is not gnu sed 4.0" hack I posted earlier, which is also needed to build glibc...) --- editors/sed.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'editors') diff --git a/editors/sed.c b/editors/sed.c index a0d0cf74b..5832e99a9 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -618,6 +618,15 @@ static int do_subst_command(sed_cmd_t * sed_cmd, char **line) do { int i; + /* Work around bug in glibc regexec, demonstrated by: + echo " a.b" | busybox sed 's [^ .]* x g' + The match_count check is so not to break + echo "hi" | busybox sed 's/^/!/g' */ + if(!regmatch[0].rm_so && !regmatch[0].rm_eo && match_count) { + pipe_putc(*(oldline++)); + continue; + } + match_count++; /* If we aren't interested in this match, output old line to @@ -1073,6 +1082,14 @@ extern int sed_main(int argc, char **argv) bb_perror_msg_and_die("atexit"); #endif +#define LIE_TO_AUTOCONF +#ifdef LIE_TO_AUTOCONF + if(argc==2 && !strcmp(argv[1],"--version")) { + printf("This is not GNU sed version 4.0\n"); + exit(0); + } +#endif + /* do normal option parsing */ while ((opt = getopt(argc, argv, "ne:f:")) > 0) { switch (opt) { -- cgit v1.2.3