diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-03 17:27:36 +0300 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-03 17:27:36 +0300 |
commit | 230997bd61eec4096e6ae70850e965b63c8886cf (patch) | |
tree | c1dd800a7c22afe8de1efcca6aeac53263bdf0c5 /coreutils | |
parent | 6852effbc22fa3e7fda34eff7bc245bd211e1287 (diff) |
expr: a bit more robust handling of regexps with groups (closes bug 87)
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/expr.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/coreutils/expr.c b/coreutils/expr.c index d659b670b..54c2ee165 100644 --- a/coreutils/expr.c +++ b/coreutils/expr.c @@ -223,13 +223,13 @@ static VALUE *docolon(VALUE *sv, VALUE *pv) tostring(pv); if (pv->u.s[0] == '^') { - bb_error_msg("\ -warning: unportable BRE: `%s': using `^' as the first character\n\ -of a basic regular expression is not portable; it is being ignored", pv->u.s); + bb_error_msg( +"warning: '%s': using '^' as the first character\n" +"of a basic regular expression is not portable; it is ignored", pv->u.s); } memset(&re_buffer, 0, sizeof(re_buffer)); - memset(re_regs, 0, sizeof(*re_regs)); + memset(re_regs, 0, sizeof(re_regs)); xregcomp(&re_buffer, pv->u.s, 0); /* expr uses an anchored pattern match, so check that there was a @@ -238,7 +238,7 @@ of a basic regular expression is not portable; it is being ignored", pv->u.s); && re_regs[0].rm_so == 0 ) { /* Were \(...\) used? */ - if (re_buffer.re_nsub > 0) { + if (re_buffer.re_nsub > 0 && re_regs[1].rm_so >= 0) { sv->u.s[re_regs[1].rm_eo] = '\0'; v = str_value(sv->u.s + re_regs[1].rm_so); } else { @@ -251,7 +251,7 @@ of a basic regular expression is not portable; it is being ignored", pv->u.s); else v = int_value(0); } -//FIXME: sounds like here is a bit missing: regfree(&re_buffer); + regfree(&re_buffer); return v; } |