summaryrefslogtreecommitdiff
path: root/coreutils/expr.c
diff options
context:
space:
mode:
authorDenis Vlasenko2009-03-03 14:27:36 +0000
committerDenis Vlasenko2009-03-03 14:27:36 +0000
commit230997bd61eec4096e6ae70850e965b63c8886cf (patch)
treec1dd800a7c22afe8de1efcca6aeac53263bdf0c5 /coreutils/expr.c
parent6852effbc22fa3e7fda34eff7bc245bd211e1287 (diff)
downloadbusybox-230997bd61eec4096e6ae70850e965b63c8886cf.zip
busybox-230997bd61eec4096e6ae70850e965b63c8886cf.tar.gz
expr: a bit more robust handling of regexps with groups (closes bug 87)
Diffstat (limited to 'coreutils/expr.c')
-rw-r--r--coreutils/expr.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/coreutils/expr.c b/coreutils/expr.c
index d659b67..54c2ee1 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;
}