about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSzabolcs Nagy <nsz@port70.net>2016-02-29 16:36:25 +0000
committerRich Felker <dalias@aerifal.cx>2016-03-02 00:47:22 -0500
commit29b13575376509bb21539711f30c1deaf0823033 (patch)
treea562ad6c465f6f33d0cb534d6a80a5e85bd681b3
parent39ea71fb8afddda879a1999f2a203dfdaf57a639 (diff)
downloadmusl-29b13575376509bb21539711f30c1deaf0823033.tar.gz
musl-29b13575376509bb21539711f30c1deaf0823033.tar.xz
musl-29b13575376509bb21539711f30c1deaf0823033.zip
fix ^* at the start of a complete BRE
This is a workaround to treat * as literal * at the start of a BRE.

Ideally ^ would be treated as an anchor at the start of any BRE
subexpression and similarly $ would be an anchor at the end of any
subexpression.  This is not required by the standard and hard to do
with the current code, but it's the existing practice.  If it is
changed, * should be treated as literal after such anchor as well.
-rw-r--r--src/regex/regcomp.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/regex/regcomp.c b/src/regex/regcomp.c
index 7a2864cd..5fad98b3 100644
--- a/src/regex/regcomp.c
+++ b/src/regex/regcomp.c
@@ -994,6 +994,10 @@ static reg_errcode_t tre_parse(tre_parse_ctx_t *ctx)
 			if (*s=='\\')
 				s++;
 
+			/* handle ^* at the start of a complete BRE. */
+			if (!ere && s==ctx->re+1 && s[-1]=='^')
+				break;
+
 			/* extension: multiple consecutive *+?{,} is unspecified,
 			   but (a+)+ has to be supported so accepting a++ makes
 			   sense, note however that the RE_DUP_MAX limit can be