aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2017-11-09 05:03:22 +0000
committerNIIBE Yutaka <[email protected]>2017-12-04 10:33:45 +0000
commit9441946e1824eb58249c58432ed1f554d0d8a102 (patch)
tree6323b874923def94cad21fe23c378043bdd78ee5
parentpo/da: Fix Danish confusion between "compressed" and "compromised" (diff)
downloadgnupg-9441946e1824eb58249c58432ed1f554d0d8a102.tar.gz
gnupg-9441946e1824eb58249c58432ed1f554d0d8a102.zip
g10: Fix regexp sanitization.
* 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 <[email protected]> Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--g10/trustdb.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/g10/trustdb.c b/g10/trustdb.c
index 1e3ef5f1a..13fa32142 100644
--- a/g10/trustdb.c
+++ b/g10/trustdb.c
@@ -1817,6 +1817,11 @@ 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)
{
@@ -1856,7 +1861,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;
@@ -1877,6 +1882,7 @@ sanitize_regexp(const char *old)
return new;
}
+#endif /*!DISABLE_REGEX*/
/* Used by validate_one_keyblock to confirm a regexp within a trust
signature. Returns 1 for match, and 0 for no match or regex