Thanks for reporting that. It's a bug in one of the optimizations I
recently added to work around the libpcre slownesses with UTF-8. It's
also a bug in our test cases, which should have caught the bug. I fixed
it with the attached patch.
>From bc66a23879afc54063708afce4f79d0928e444c0 Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Wed, 15 Oct 2014 11:49:49 -0700
Subject: [PATCH] grep: fix off-by-one bug in -P optimization
Reported by Norihiro Tanaka in: http://bugs.gnu.org/18738
* src/pcresearch.c (Pexecute): Fix off-by-one bug with
validation_boundary.
* tests/init.cfg (envvar_check_fail): Catch off-by-one bug.
---
src/pcresearch.c | 2 +-
tests/init.cfg | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/pcresearch.c b/src/pcresearch.c
index 6f016b6..1fd5bde 100644
--- a/src/pcresearch.c
+++ b/src/pcresearch.c
@@ -214,7 +214,7 @@ Pexecute (char const *buf, size_t size, size_t *match_size,
options |= PCRE_NO_UTF8_CHECK;
int valid_bytes = validated - p;
- if (valid_bytes < 0)
+ if (valid_bytes <= 0)
{
e = pcre_exec (cre, extra, p, search_bytes, 0,
options, sub, NSUB);
diff --git a/tests/init.cfg b/tests/init.cfg
index 3e9ab03..882feb1 100644
--- a/tests/init.cfg
+++ b/tests/init.cfg
@@ -47,7 +47,11 @@ require_timeout_()
require_pcre_()
{
- echo . | grep -P . 2>err || skip_ no PCRE support
+ echo . | grep -P . 2>err
+ echo . | grep -P . 2>err || {
+ test $? -eq 1 && fail_ PCRE available, but does not work.
+ skip_ no PCRE support
+ }
compare /dev/null err || fail_ PCRE available, but stderr not empty.
}
--
1.9.3