g10: Fix regexp sanitization.
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 9 Nov 2017 05:03:22 +0000 (14:03 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Mon, 4 Dec 2017 10:34:43 +0000 (19:34 +0900)
* g10/trustdb.c (sanitize_regexp): Only escape operators.

--

Backport from master commit:
ccf3ba92087e79abdeaa0208795829b431c6f201

To sanitize a regular expression, quoting by backslash should be only
done for defined characters.  POSIX defines 12 characters including
dot and backslash.

Quoting other characters is wrong, in two ways; It may build an
operator like: \b, \s, \w when using GNU library.  Case ignored match
doesn't work, because quoting lower letter means literally and no
much to upper letter.

GnuPG-bug-id: 2923
Co-authored-by: Damien Goutte-Gattat <dgouttegattat@incenp.org>
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
g10/trustdb.c

index c9c8891..bc90161 100644 (file)
@@ -1823,6 +1823,10 @@ clean_key(KBNODE keyblock,int noisy,int self_only,
 /* Returns a sanitized copy of the regexp (which might be "", but not
    NULL). */
 #ifndef DISABLE_REGEX
+/* Operator charactors except '.' and backslash.
+   See regex(7) on BSD.  */
+#define REGEXP_OPERATOR_CHARS "^[$()|*+?{"
+
 static char *
 sanitize_regexp(const char *old)
 {
@@ -1862,7 +1866,7 @@ sanitize_regexp(const char *old)
     {
       if(!escaped && old[start]=='\\')
        escaped=1;
-      else if(!escaped && old[start]!='.')
+      else if (!escaped && strchr (REGEXP_OPERATOR_CHARS, old[start]))
        new[idx++]='\\';
       else
        escaped=0;