730 lines
26 KiB
Plaintext
730 lines
26 KiB
Plaintext
|
From 259f3c69bfffe5ccc999675f9edda5c99afc79a0 Mon Sep 17 00:00:00 2001
|
||
|
From: ellie timoney <ellie@fastmail.com>
|
||
|
Date: Wed, 8 Nov 2023 14:23:10 +1100
|
||
|
Subject: [PATCH 1/5] various: add pcre2 support
|
||
|
|
||
|
without removing pcre1 support
|
||
|
|
||
|
Based on a patch from @yselkowitz in #4545
|
||
|
---
|
||
|
configure.ac | 21 +++++++++++++++++++++
|
||
|
docsrc/assets/cyrus-build-devpkg.rst | 2 +-
|
||
|
docsrc/assets/cyrus-build-reqpkg.rst | 2 +-
|
||
|
docsrc/imap/developer/compiling.rst | 3 ++-
|
||
|
docsrc/imap/download/upgrade.rst | 2 +-
|
||
|
imap/cyr_buildinfo.c | 5 +++++
|
||
|
lib/util.h | 21 ++++++++++++---------
|
||
|
ptclient/test3.c | 2 +-
|
||
|
sieve/bc_eval.c | 4 +++-
|
||
|
sieve/comparator.h | 21 ++++++++++++---------
|
||
|
sieve/sieve.y | 4 +++-
|
||
|
11 files changed, 62 insertions(+), 25 deletions(-)
|
||
|
|
||
|
diff --git a/configure.ac b/configure.ac
|
||
|
index cad8dd8f16..6b9f6a7a7c 100644
|
||
|
--- a/configure.ac
|
||
|
+++ b/configure.ac
|
||
|
@@ -678,6 +678,8 @@ AC_ARG_ENABLE(sieve,
|
||
|
[AS_HELP_STRING([--disable-sieve], [disable Sieve support])],,[enable_sieve="yes";])
|
||
|
AC_ARG_ENABLE(pcre,
|
||
|
[AS_HELP_STRING([--disable-pcre], [disable PCRE library])],[cyrus_cv_pcre_utf8="$enableval"])
|
||
|
+AC_ARG_ENABLE(pcre2,
|
||
|
+ [AS_HELP_STRING([--disable-pcre2], [disable PCRE2 library])],[cyrus_cv_pcre2_utf8="$enableval"])
|
||
|
|
||
|
if test "$enable_sieve" != "no"; then
|
||
|
AC_DEFINE(USE_SIEVE,[],[Build in Sieve support?])
|
||
|
@@ -717,11 +719,29 @@ if test "$enable_pcre" != "no"; then
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
+if test "$enable_pcre2" != "no"; then
|
||
|
+ AC_CHECK_HEADER(pcre2posix.h)
|
||
|
+ if test "$ac_cv_header_pcre2posix_h" = "yes"; then
|
||
|
+ AC_MSG_CHECKING(for utf8 enabled pcre2)
|
||
|
+ AC_CACHE_VAL(cyrus_cv_pcre2_utf8, AC_TRY_CPP([#include <pcre2posix.h>
|
||
|
+#ifndef REG_UTF
|
||
|
+#include </nonexistent>
|
||
|
+#endif],cyrus_cv_pcre2_utf8=yes,cyrus_cv_pcre2_utf8=no))
|
||
|
+ AC_MSG_RESULT($cyrus_cv_pcre2_utf8)
|
||
|
+ else
|
||
|
+ cyrus_cv_pcre2_utf8="no"
|
||
|
+ fi
|
||
|
+fi
|
||
|
+
|
||
|
LIB_REGEX=
|
||
|
if test "$cyrus_cv_pcre_utf8" = "yes"; then
|
||
|
LIB_REGEX="-lpcre -lpcreposix";
|
||
|
AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
AC_DEFINE(HAVE_PCREPOSIX_H, [], [Do we have usable pcre library?])
|
||
|
+elif test "$cyrus_cv_pcre2_utf8" = "yes"; then
|
||
|
+ LIB_REGEX="-lpcre2-posix -lpcre2-8";
|
||
|
+ AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
+ AC_DEFINE(HAVE_PCRE2POSIX_H, [], [Do we have usable pcre2 library?])
|
||
|
else
|
||
|
AC_CHECK_HEADERS(rxposix.h)
|
||
|
if test "$ac_cv_header_rxposix_h" = "yes"; then
|
||
|
@@ -2569,6 +2589,7 @@ External dependencies:
|
||
|
zlib: $with_zlib
|
||
|
jansson: $with_jansson
|
||
|
pcre: $cyrus_cv_pcre_utf8
|
||
|
+ pcre2: $cyrus_cv_pcre2_utf8
|
||
|
clamav: $with_clamav
|
||
|
-----------------------
|
||
|
caringo: $with_caringo
|
||
|
diff --git a/docsrc/assets/cyrus-build-devpkg.rst b/docsrc/assets/cyrus-build-devpkg.rst
|
||
|
index cf3eaef1b3..5c0156bb64 100644
|
||
|
--- a/docsrc/assets/cyrus-build-devpkg.rst
|
||
|
+++ b/docsrc/assets/cyrus-build-devpkg.rst
|
||
|
@@ -8,7 +8,7 @@ automated test facility.
|
||
|
debhelper flex g++ git gperf groff heimdal-dev libbsd-resource-perl libclone-perl libconfig-inifiles-perl \
|
||
|
libcunit1-dev libdatetime-perl libbsd-dev libdigest-sha-perl libencode-imaputf7-perl \ libfile-chdir-perl libglib2.0-dev libical-dev libio-socket-inet6-perl \
|
||
|
libio-stringy-perl libldap2-dev libmysqlclient-dev \
|
||
|
- libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre3-dev libsasl2-dev \
|
||
|
+ libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre2-dev libsasl2-dev \
|
||
|
libsqlite3-dev libssl-dev libtest-unit-perl libtool libunix-syslog-perl liburi-perl \
|
||
|
libxapian-dev libxml-generator-perl libxml-xpath-perl libxml2-dev libwrap0-dev libzephyr-dev lsb-base \
|
||
|
net-tools perl php-cli php-curl pkg-config po-debconf tcl-dev \
|
||
|
diff --git a/docsrc/assets/cyrus-build-reqpkg.rst b/docsrc/assets/cyrus-build-reqpkg.rst
|
||
|
index a3a530cc39..1c8bb45951 100644
|
||
|
--- a/docsrc/assets/cyrus-build-reqpkg.rst
|
||
|
+++ b/docsrc/assets/cyrus-build-reqpkg.rst
|
||
|
@@ -2,6 +2,6 @@
|
||
|
|
||
|
sudo apt-get install git build-essential autoconf automake libtool \
|
||
|
pkg-config bison flex libssl-dev libjansson-dev libxml2-dev \
|
||
|
- libsqlite3-dev libical-dev libsasl2-dev libpcre3-dev uuid-dev \
|
||
|
+ libsqlite3-dev libical-dev libsasl2-dev libpcre2-dev uuid-dev \
|
||
|
libicu-dev
|
||
|
sudo apt-get -t jessie-backports install libxapian-dev
|
||
|
diff --git a/docsrc/imap/developer/compiling.rst b/docsrc/imap/developer/compiling.rst
|
||
|
index e05f3e43b1..2a351df5b1 100644
|
||
|
--- a/docsrc/imap/developer/compiling.rst
|
||
|
+++ b/docsrc/imap/developer/compiling.rst
|
||
|
@@ -194,7 +194,7 @@ Other
|
||
|
to enable **ptloader** to interface with LDAP directly, for canonification
|
||
|
of login usernames to mailbox names, and verification of login usernames,
|
||
|
ACL subjects and group membership. Configure option: ``--with-ldap``."
|
||
|
- `pcre`_, libpcre3-dev, pcre-devel, "yes", "PCRE 1 (8.x) - for utf-8/unicode
|
||
|
+ `pcre2`_, libpcre2-dev, pcre2-devel, "yes", "PCRE 2 (10.x) - for utf-8/unicode
|
||
|
regular expression matching. Could be replaced by something else in the
|
||
|
future. See `issues/1731`_ for more information."
|
||
|
`perl(Term::ReadLine)`_,,, "no", "Perl library needed by **cyradm**."
|
||
|
@@ -219,6 +219,7 @@ Other
|
||
|
.. _nghttp2: https://nghttp2.org/
|
||
|
.. _openldap: http://www.openldap.org/
|
||
|
.. _pcre: http://www.pcre.org/
|
||
|
+.. _pcre2: http://www.pcre.org/
|
||
|
.. _perl(Term::ReadLine): https://metacpan.org/pod/Term::ReadLine
|
||
|
.. _perl(ExtUtils::MakeMaker): http://search.cpan.org/dist/ExtUtils-MakeMaker/
|
||
|
.. _perl(Pod::POM::View::Restructured): https://metacpan.org/pod/Pod::POM::View::Restructured
|
||
|
diff --git a/docsrc/imap/download/upgrade.rst b/docsrc/imap/download/upgrade.rst
|
||
|
index 353a0114b8..09db9232b7 100644
|
||
|
--- a/docsrc/imap/download/upgrade.rst
|
||
|
+++ b/docsrc/imap/download/upgrade.rst
|
||
|
@@ -223,7 +223,7 @@ packages) for Debian is::
|
||
|
libcunit1-dev libdatetime-perl libdigest-sha-perl libencode-imaputf7-perl \
|
||
|
libfile-chdir-perl libglib2.0-dev libical-dev libio-socket-inet6-perl \
|
||
|
libio-stringy-perl libjansson-dev libldap2-dev libmysqlclient-dev \
|
||
|
- libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre3-dev \
|
||
|
+ libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre2-dev \
|
||
|
libsasl2-dev libsqlite3-dev libssl-dev libtest-unit-perl libtool \
|
||
|
libunix-syslog-perl liburi-perl libxapian-dev libxml-generator-perl \
|
||
|
libxml-xpath-perl libxml2-dev libwrap0-dev libzephyr-dev lsb-base \
|
||
|
diff --git a/imap/cyr_buildinfo.c b/imap/cyr_buildinfo.c
|
||
|
index 3d596c726a..a011101993 100644
|
||
|
--- a/imap/cyr_buildinfo.c
|
||
|
+++ b/imap/cyr_buildinfo.c
|
||
|
@@ -202,6 +202,11 @@ static json_t *buildinfo()
|
||
|
#else
|
||
|
json_object_set_new(dependency, "pcre", json_false());
|
||
|
#endif
|
||
|
+#if defined(ENABLE_REGEX) && defined(HAVE_PCRE2POSIX_H)
|
||
|
+ json_object_set_new(dependency, "pcre2", json_true());
|
||
|
+#else
|
||
|
+ json_object_set_new(dependency, "pcre2", json_false());
|
||
|
+#endif
|
||
|
#ifdef HAVE_CLAMAV
|
||
|
json_object_set_new(dependency, "clamav", json_true());
|
||
|
#else
|
||
|
diff --git a/lib/util.h b/lib/util.h
|
||
|
index 7f7ab9f655..6cdd95a271 100644
|
||
|
--- a/lib/util.h
|
||
|
+++ b/lib/util.h
|
||
|
@@ -71,17 +71,20 @@
|
||
|
extern const char CYRUS_VERSION[];
|
||
|
|
||
|
#ifdef ENABLE_REGEX
|
||
|
-# ifdef HAVE_PCREPOSIX_H
|
||
|
+# if defined HAVE_PCREPOSIX_H
|
||
|
# include <pcre.h>
|
||
|
# include <pcreposix.h>
|
||
|
-# else /* !HAVE_PCREPOSIX_H */
|
||
|
-# ifdef HAVE_RXPOSIX_H
|
||
|
-# include <rxposix.h>
|
||
|
-# else /* !HAVE_RXPOSIX_H */
|
||
|
-# include <regex.h>
|
||
|
-# endif /* HAVE_RXPOSIX_H */
|
||
|
-# endif /* HAVE_PCREPOSIX_H */
|
||
|
-#endif /* ENABLE_REGEX */
|
||
|
+# elif defined HAVE_PCRE2POSIX_H
|
||
|
+# ifndef PCRE2POSIX_H_INCLUDED
|
||
|
+# include <pcre2posix.h>
|
||
|
+# define PCRE2POSIX_H_INCLUDED
|
||
|
+# endif
|
||
|
+# elif defined HAVE_RXPOSIX_H
|
||
|
+# include <rxposix.h>
|
||
|
+# else
|
||
|
+# include <regex.h>
|
||
|
+# endif
|
||
|
+#endif
|
||
|
|
||
|
#ifdef HAVE_LIBUUID
|
||
|
#include <uuid/uuid.h>
|
||
|
diff --git a/sieve/bc_eval.c b/sieve/bc_eval.c
|
||
|
index 17241e166f..67d39355fa 100644
|
||
|
--- a/sieve/bc_eval.c
|
||
|
+++ b/sieve/bc_eval.c
|
||
|
@@ -321,9 +321,11 @@ static int regcomp_flags(int comparator, int requires)
|
||
|
{
|
||
|
int cflags = REG_EXTENDED;
|
||
|
|
||
|
-#ifdef HAVE_PCREPOSIX_H
|
||
|
/* support UTF8 comparisons */
|
||
|
+#if defined HAVE_PCREPOSIX_H
|
||
|
cflags |= REG_UTF8;
|
||
|
+#elif defined HAVE_PCRE2POSIX_H
|
||
|
+ cflags |= REG_UTF;
|
||
|
#endif
|
||
|
|
||
|
if (comparator == B_ASCIICASEMAP) {
|
||
|
diff --git a/sieve/comparator.h b/sieve/comparator.h
|
||
|
index b043bc296b..8c58bd1e73 100644
|
||
|
--- a/sieve/comparator.h
|
||
|
+++ b/sieve/comparator.h
|
||
|
@@ -47,17 +47,20 @@
|
||
|
#include <sys/types.h>
|
||
|
|
||
|
#ifdef ENABLE_REGEX
|
||
|
-# ifdef HAVE_PCREPOSIX_H
|
||
|
+# if defined HAVE_PCREPOSIX_H
|
||
|
# include <pcre.h>
|
||
|
# include <pcreposix.h>
|
||
|
-# else /* !HAVE_PCREPOSIX_H */
|
||
|
-# ifdef HAVE_RXPOSIX_H
|
||
|
-# include <rxposix.h>
|
||
|
-# else /* !HAVE_RXPOSIX_H */
|
||
|
-# include <regex.h>
|
||
|
-# endif /* HAVE_RXPOSIX_H */
|
||
|
-# endif /* HAVE_PCREPOSIX_H */
|
||
|
-#endif /* ENABLE_REGEX */
|
||
|
+# elif defined HAVE_PCRE2POSIX_H
|
||
|
+# ifndef PCRE2POSIX_H_INCLUDED
|
||
|
+# include <pcre2posix.h>
|
||
|
+# define PCRE2POSIX_H_INCLUDED
|
||
|
+# endif
|
||
|
+# elif defined HAVE_RXPOSIX_H
|
||
|
+# include <rxposix.h>
|
||
|
+# else
|
||
|
+# include <regex.h>
|
||
|
+# endif
|
||
|
+#endif
|
||
|
|
||
|
#include "sieve_interface.h"
|
||
|
#include "strarray.h"
|
||
|
diff --git a/sieve/sieve.y b/sieve/sieve.y
|
||
|
index 71aa503bd3..17adb65112 100644
|
||
|
--- a/sieve/sieve.y
|
||
|
+++ b/sieve/sieve.y
|
||
|
@@ -2143,9 +2143,11 @@ static int verify_regexlist(sieve_script_t *sscript,
|
||
|
regex_t reg;
|
||
|
int cflags = REG_EXTENDED | REG_NOSUB;
|
||
|
|
||
|
-#ifdef HAVE_PCREPOSIX_H
|
||
|
/* support UTF8 comparisons */
|
||
|
+#if defined HAVE_PCREPOSIX_H
|
||
|
cflags |= REG_UTF8;
|
||
|
+#elif defined HAVE_PCRE2POSIX_H
|
||
|
+ cflags |= REG_UTF;
|
||
|
#endif
|
||
|
|
||
|
if (collation == B_ASCIICASEMAP) {
|
||
|
|
||
|
From 7c7e1957d9a8074aa3dd7fe113cf551eadcb494f Mon Sep 17 00:00:00 2001
|
||
|
From: ellie timoney <ellie@fastmail.com>
|
||
|
Date: Mon, 13 Nov 2023 11:10:28 +1100
|
||
|
Subject: [PATCH 2/5] configure.ac: tidy up sieve/pcre checks
|
||
|
|
||
|
---
|
||
|
configure.ac | 101 ++++++++++++++++++++++++++-------------------------
|
||
|
1 file changed, 51 insertions(+), 50 deletions(-)
|
||
|
|
||
|
diff --git a/configure.ac b/configure.ac
|
||
|
index 6b9f6a7a7c..975925bebe 100644
|
||
|
--- a/configure.ac
|
||
|
+++ b/configure.ac
|
||
|
@@ -675,82 +675,83 @@ AM_CONDITIONAL([SQUATTER],
|
||
|
[test "${enable_squat}" != "no" -o "${enable_xapian}" != "no" ])
|
||
|
|
||
|
AC_ARG_ENABLE(sieve,
|
||
|
- [AS_HELP_STRING([--disable-sieve], [disable Sieve support])],,[enable_sieve="yes";])
|
||
|
-AC_ARG_ENABLE(pcre,
|
||
|
- [AS_HELP_STRING([--disable-pcre], [disable PCRE library])],[cyrus_cv_pcre_utf8="$enableval"])
|
||
|
-AC_ARG_ENABLE(pcre2,
|
||
|
- [AS_HELP_STRING([--disable-pcre2], [disable PCRE2 library])],[cyrus_cv_pcre2_utf8="$enableval"])
|
||
|
+ [AS_HELP_STRING([--disable-sieve], [disable Sieve support])],,[enable_sieve="yes";])
|
||
|
|
||
|
if test "$enable_sieve" != "no"; then
|
||
|
- AC_DEFINE(USE_SIEVE,[],[Build in Sieve support?])
|
||
|
+ AC_DEFINE(USE_SIEVE,[],[Build in Sieve support?])
|
||
|
|
||
|
- if test "x$HAVE_SQLITE" != x1; then
|
||
|
- AC_MSG_ERROR([Need sqlite3 for sieve])
|
||
|
- else
|
||
|
- use_sqlite="yes"
|
||
|
- fi
|
||
|
+ if test "x$HAVE_SQLITE" != x1; then
|
||
|
+ AC_MSG_ERROR([Need sqlite3 for sieve])
|
||
|
+ else
|
||
|
+ use_sqlite="yes"
|
||
|
+ fi
|
||
|
|
||
|
- dnl Sieve configure stuff
|
||
|
- AC_PROG_YACC
|
||
|
- AM_PROG_LEX
|
||
|
+ dnl Sieve configure stuff
|
||
|
+ AC_PROG_YACC
|
||
|
+ AM_PROG_LEX
|
||
|
|
||
|
- if test -z "$ac_cv_prog_YACC"; then
|
||
|
- AC_MSG_ERROR([Sieve requires bison/byacc/yacc, but none is installed])
|
||
|
- fi
|
||
|
+ if test -z "$ac_cv_prog_YACC"; then
|
||
|
+ AC_MSG_ERROR([Sieve requires bison/byacc/yacc, but none is installed])
|
||
|
+ fi
|
||
|
|
||
|
- if test -z "$ac_cv_prog_LEX"; then
|
||
|
- AC_MSG_ERROR([Sieve requires flex/lex, but none is installed])
|
||
|
- fi
|
||
|
+ if test -z "$ac_cv_prog_LEX"; then
|
||
|
+ AC_MSG_ERROR([Sieve requires flex/lex, but none is installed])
|
||
|
+ fi
|
||
|
fi
|
||
|
|
||
|
AM_CONDITIONAL([SIEVE], [test "${enable_sieve}" != "no"])
|
||
|
|
||
|
+AC_ARG_ENABLE(pcre,
|
||
|
+ [AS_HELP_STRING([--disable-pcre], [disable PCRE library])],[cyrus_cv_pcre_utf8="$enableval"])
|
||
|
+AC_ARG_ENABLE(pcre2,
|
||
|
+ [AS_HELP_STRING([--disable-pcre2], [disable PCRE2 library])],[cyrus_cv_pcre2_utf8="$enableval"])
|
||
|
+
|
||
|
if test "$enable_pcre" != "no"; then
|
||
|
- AC_CHECK_HEADER(pcreposix.h)
|
||
|
- if test "$ac_cv_header_pcreposix_h" = "yes"; then
|
||
|
- AC_MSG_CHECKING(for utf8 enabled pcre)
|
||
|
- AC_CACHE_VAL(cyrus_cv_pcre_utf8, AC_TRY_CPP([#include <pcreposix.h>
|
||
|
+ AC_CHECK_HEADER(pcreposix.h)
|
||
|
+ if test "$ac_cv_header_pcreposix_h" = "yes"; then
|
||
|
+ AC_MSG_CHECKING(for utf8 enabled pcre)
|
||
|
+ AC_CACHE_VAL(cyrus_cv_pcre_utf8, AC_TRY_CPP([#include <pcreposix.h>
|
||
|
#ifndef REG_UTF8
|
||
|
#include </nonexistent>
|
||
|
#endif],cyrus_cv_pcre_utf8=yes,cyrus_cv_pcre_utf8=no))
|
||
|
- AC_MSG_RESULT($cyrus_cv_pcre_utf8)
|
||
|
- else
|
||
|
- cyrus_cv_pcre_utf8="no"
|
||
|
- fi
|
||
|
+ AC_MSG_RESULT($cyrus_cv_pcre_utf8)
|
||
|
+ else
|
||
|
+ cyrus_cv_pcre_utf8="no"
|
||
|
+ fi
|
||
|
fi
|
||
|
|
||
|
if test "$enable_pcre2" != "no"; then
|
||
|
- AC_CHECK_HEADER(pcre2posix.h)
|
||
|
- if test "$ac_cv_header_pcre2posix_h" = "yes"; then
|
||
|
- AC_MSG_CHECKING(for utf8 enabled pcre2)
|
||
|
- AC_CACHE_VAL(cyrus_cv_pcre2_utf8, AC_TRY_CPP([#include <pcre2posix.h>
|
||
|
+ AC_CHECK_HEADER(pcre2posix.h)
|
||
|
+ if test "$ac_cv_header_pcre2posix_h" = "yes"; then
|
||
|
+ AC_MSG_CHECKING(for utf8 enabled pcre2)
|
||
|
+ AC_CACHE_VAL(cyrus_cv_pcre2_utf8, AC_TRY_CPP([#include <pcre2posix.h>
|
||
|
#ifndef REG_UTF
|
||
|
#include </nonexistent>
|
||
|
#endif],cyrus_cv_pcre2_utf8=yes,cyrus_cv_pcre2_utf8=no))
|
||
|
- AC_MSG_RESULT($cyrus_cv_pcre2_utf8)
|
||
|
- else
|
||
|
- cyrus_cv_pcre2_utf8="no"
|
||
|
- fi
|
||
|
+ AC_MSG_RESULT($cyrus_cv_pcre2_utf8)
|
||
|
+ else
|
||
|
+ cyrus_cv_pcre2_utf8="no"
|
||
|
+ fi
|
||
|
fi
|
||
|
|
||
|
LIB_REGEX=
|
||
|
if test "$cyrus_cv_pcre_utf8" = "yes"; then
|
||
|
- LIB_REGEX="-lpcre -lpcreposix";
|
||
|
- AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
- AC_DEFINE(HAVE_PCREPOSIX_H, [], [Do we have usable pcre library?])
|
||
|
+ LIB_REGEX="-lpcre -lpcreposix";
|
||
|
+ AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
+ AC_DEFINE(HAVE_PCREPOSIX_H, [], [Do we have usable pcre library?])
|
||
|
elif test "$cyrus_cv_pcre2_utf8" = "yes"; then
|
||
|
- LIB_REGEX="-lpcre2-posix -lpcre2-8";
|
||
|
- AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
- AC_DEFINE(HAVE_PCRE2POSIX_H, [], [Do we have usable pcre2 library?])
|
||
|
+ LIB_REGEX="-lpcre2-posix -lpcre2-8";
|
||
|
+ AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
+ AC_DEFINE(HAVE_PCRE2POSIX_H, [], [Do we have usable pcre2 library?])
|
||
|
else
|
||
|
- AC_CHECK_HEADERS(rxposix.h)
|
||
|
- if test "$ac_cv_header_rxposix_h" = "yes"; then
|
||
|
- LIB_REGEX="-lrx"
|
||
|
- AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
- else
|
||
|
- AC_SEARCH_LIBS(regcomp, regex,
|
||
|
- AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?]), [])
|
||
|
- fi
|
||
|
+ AC_CHECK_HEADERS(rxposix.h)
|
||
|
+ if test "$ac_cv_header_rxposix_h" = "yes"; then
|
||
|
+ LIB_REGEX="-lrx"
|
||
|
+ AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
+ else
|
||
|
+ AC_SEARCH_LIBS(regcomp, regex,
|
||
|
+ AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?]), [])
|
||
|
+ fi
|
||
|
fi
|
||
|
AC_SUBST(LIB_REGEX)
|
||
|
LIBS="$LIBS $LIB_REGEX"
|
||
|
|
||
|
From b9002dba94eaa8a688df4f3c280db31a4eb77f69 Mon Sep 17 00:00:00 2001
|
||
|
From: ellie timoney <ellie@fastmail.com>
|
||
|
Date: Mon, 13 Nov 2023 11:32:13 +1100
|
||
|
Subject: [PATCH 3/5] configure.ac: use pkg-config to find pcre/pcre2
|
||
|
|
||
|
Fixes #4711
|
||
|
---
|
||
|
configure.ac | 73 +++++++++++++++++++++++++++++++++++-----------------
|
||
|
1 file changed, 49 insertions(+), 24 deletions(-)
|
||
|
|
||
|
diff --git a/configure.ac b/configure.ac
|
||
|
index 975925bebe..7fed07e129 100644
|
||
|
--- a/configure.ac
|
||
|
+++ b/configure.ac
|
||
|
@@ -707,42 +707,65 @@ AC_ARG_ENABLE(pcre2,
|
||
|
[AS_HELP_STRING([--disable-pcre2], [disable PCRE2 library])],[cyrus_cv_pcre2_utf8="$enableval"])
|
||
|
|
||
|
if test "$enable_pcre" != "no"; then
|
||
|
- AC_CHECK_HEADER(pcreposix.h)
|
||
|
- if test "$ac_cv_header_pcreposix_h" = "yes"; then
|
||
|
- AC_MSG_CHECKING(for utf8 enabled pcre)
|
||
|
- AC_CACHE_VAL(cyrus_cv_pcre_utf8, AC_TRY_CPP([#include <pcreposix.h>
|
||
|
-#ifndef REG_UTF8
|
||
|
-#include </nonexistent>
|
||
|
-#endif],cyrus_cv_pcre_utf8=yes,cyrus_cv_pcre_utf8=no))
|
||
|
- AC_MSG_RESULT($cyrus_cv_pcre_utf8)
|
||
|
- else
|
||
|
- cyrus_cv_pcre_utf8="no"
|
||
|
- fi
|
||
|
+ PKG_CHECK_MODULES([PCRE],
|
||
|
+ [libpcreposix libpcre],
|
||
|
+ [ AC_MSG_CHECKING(for utf8 enabled pcre)
|
||
|
+ saved_CFLAGS="$CFLAGS"
|
||
|
+ saved_LIBS="$LIBS"
|
||
|
+ CFLAGS="$CFLAGS PCRE_CFLAGS"
|
||
|
+ LIBS="$LIBS PCRE_LIBS"
|
||
|
+ AC_CACHE_VAL(cyrus_cv_pcre_utf8,
|
||
|
+ AC_TRY_CPP([ #include <pcreposix.h>
|
||
|
+ #ifndef REG_UTF8
|
||
|
+ #include </nonexistent>
|
||
|
+ #endif
|
||
|
+ ],
|
||
|
+ [cyrus_cv_pcre_utf8=yes],
|
||
|
+ [cyrus_cv_pcre_utf8=no]))
|
||
|
+ AC_MSG_RESULT($cyrus_cv_pcre_utf8)
|
||
|
+ CFLAGS="$saved_CFLAGS"
|
||
|
+ LIBS="$saved_LIBS"
|
||
|
+ ],
|
||
|
+ [cyrus_cv_pcre_utf8="no"])
|
||
|
fi
|
||
|
|
||
|
if test "$enable_pcre2" != "no"; then
|
||
|
- AC_CHECK_HEADER(pcre2posix.h)
|
||
|
- if test "$ac_cv_header_pcre2posix_h" = "yes"; then
|
||
|
- AC_MSG_CHECKING(for utf8 enabled pcre2)
|
||
|
- AC_CACHE_VAL(cyrus_cv_pcre2_utf8, AC_TRY_CPP([#include <pcre2posix.h>
|
||
|
-#ifndef REG_UTF
|
||
|
-#include </nonexistent>
|
||
|
-#endif],cyrus_cv_pcre2_utf8=yes,cyrus_cv_pcre2_utf8=no))
|
||
|
- AC_MSG_RESULT($cyrus_cv_pcre2_utf8)
|
||
|
- else
|
||
|
- cyrus_cv_pcre2_utf8="no"
|
||
|
- fi
|
||
|
+ PKG_CHECK_MODULES([PCRE2],
|
||
|
+ [libpcre2-posix libpcre2-8],
|
||
|
+ [ AC_MSG_CHECKING(for utf8 enabled pcre2)
|
||
|
+ saved_CFLAGS="$CFLAGS"
|
||
|
+ saved_LIBS="$LIBS"
|
||
|
+ CFLAGS="$CFLAGS PCRE2_CFLAGS"
|
||
|
+ LIBS="$LIBS PCRE2_LIBS"
|
||
|
+ AC_CACHE_VAL(cyrus_cv_pcre2_utf8,
|
||
|
+ AC_TRY_CPP([ #include <pcre2posix.h>
|
||
|
+ #ifndef REG_UTF
|
||
|
+ #include </nonexistent>
|
||
|
+ #endif
|
||
|
+ ],
|
||
|
+ [cyrus_cv_pcre2_utf8=yes],
|
||
|
+ [cyrus_cv_pcre2_utf8=no]))
|
||
|
+ AC_MSG_RESULT($cyrus_cv_pcre2_utf8)
|
||
|
+ CFLAGS="$saved_CFLAGS"
|
||
|
+ LIBS="$saved_LIBS"
|
||
|
+ ],
|
||
|
+ [cyrus_cv_pcre2_utf8="no"])
|
||
|
fi
|
||
|
|
||
|
LIB_REGEX=
|
||
|
+CFLAGS_REGEX=
|
||
|
if test "$cyrus_cv_pcre_utf8" = "yes"; then
|
||
|
- LIB_REGEX="-lpcre -lpcreposix";
|
||
|
+ CFLAGS_REGEX="$PCRE_CFLAGS"
|
||
|
+ LIB_REGEX="$PCRE_LIBS";
|
||
|
AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
AC_DEFINE(HAVE_PCREPOSIX_H, [], [Do we have usable pcre library?])
|
||
|
+ cyrus_cv_pcre2_utf8="no"
|
||
|
elif test "$cyrus_cv_pcre2_utf8" = "yes"; then
|
||
|
- LIB_REGEX="-lpcre2-posix -lpcre2-8";
|
||
|
+ CFLAGS_REGEX="$PCRE2_CFLAGS"
|
||
|
+ LIB_REGEX="$PCRE2_LIBS"
|
||
|
AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
AC_DEFINE(HAVE_PCRE2POSIX_H, [], [Do we have usable pcre2 library?])
|
||
|
+ cyrus_cv_pcre_utf8="no"
|
||
|
else
|
||
|
AC_CHECK_HEADERS(rxposix.h)
|
||
|
if test "$ac_cv_header_rxposix_h" = "yes"; then
|
||
|
@@ -754,7 +777,9 @@ else
|
||
|
fi
|
||
|
fi
|
||
|
AC_SUBST(LIB_REGEX)
|
||
|
+AC_SUBST(CFLAGS_REGEX)
|
||
|
LIBS="$LIBS $LIB_REGEX"
|
||
|
+CFLAGS="$CFLAGS $CFLAGS_REGEX"
|
||
|
|
||
|
dnl
|
||
|
dnl see if we're compiling with SRS
|
||
|
|
||
|
From 3ff27055f73097123b7c1c8e3d83adc1f1c1f026 Mon Sep 17 00:00:00 2001
|
||
|
From: ellie timoney <ellie@fastmail.com>
|
||
|
Date: Mon, 13 Nov 2023 13:38:25 +1100
|
||
|
Subject: [PATCH 4/5] configure.ac: prefer pcre2 if both available
|
||
|
|
||
|
---
|
||
|
configure.ac | 14 +++++++-------
|
||
|
1 file changed, 7 insertions(+), 7 deletions(-)
|
||
|
|
||
|
diff --git a/configure.ac b/configure.ac
|
||
|
index 7fed07e129..186b0f1872 100644
|
||
|
--- a/configure.ac
|
||
|
+++ b/configure.ac
|
||
|
@@ -754,18 +754,18 @@ fi
|
||
|
|
||
|
LIB_REGEX=
|
||
|
CFLAGS_REGEX=
|
||
|
-if test "$cyrus_cv_pcre_utf8" = "yes"; then
|
||
|
- CFLAGS_REGEX="$PCRE_CFLAGS"
|
||
|
- LIB_REGEX="$PCRE_LIBS";
|
||
|
- AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
- AC_DEFINE(HAVE_PCREPOSIX_H, [], [Do we have usable pcre library?])
|
||
|
- cyrus_cv_pcre2_utf8="no"
|
||
|
-elif test "$cyrus_cv_pcre2_utf8" = "yes"; then
|
||
|
+if test "$cyrus_cv_pcre2_utf8" = "yes"; then
|
||
|
CFLAGS_REGEX="$PCRE2_CFLAGS"
|
||
|
LIB_REGEX="$PCRE2_LIBS"
|
||
|
AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
AC_DEFINE(HAVE_PCRE2POSIX_H, [], [Do we have usable pcre2 library?])
|
||
|
cyrus_cv_pcre_utf8="no"
|
||
|
+elif test "$cyrus_cv_pcre_utf8" = "yes"; then
|
||
|
+ CFLAGS_REGEX="$PCRE_CFLAGS"
|
||
|
+ LIB_REGEX="$PCRE_LIBS";
|
||
|
+ AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
|
||
|
+ AC_DEFINE(HAVE_PCREPOSIX_H, [], [Do we have usable pcre library?])
|
||
|
+ cyrus_cv_pcre2_utf8="no"
|
||
|
else
|
||
|
AC_CHECK_HEADERS(rxposix.h)
|
||
|
if test "$ac_cv_header_rxposix_h" = "yes"; then
|
||
|
|
||
|
From 1dc08fef4805f74a0b4f51dd090337d8c75f9e10 Mon Sep 17 00:00:00 2001
|
||
|
From: ellie timoney <ellie@fastmail.com>
|
||
|
Date: Mon, 13 Nov 2023 14:15:33 +1100
|
||
|
Subject: [PATCH 5/5] add changes file
|
||
|
|
||
|
---
|
||
|
changes/next/pcre2-support | 30 ++++++++++++++++++++++++++++++
|
||
|
1 file changed, 30 insertions(+)
|
||
|
create mode 100644 changes/next/pcre2-support
|
||
|
|
||
|
diff --git a/changes/next/pcre2-support b/changes/next/pcre2-support
|
||
|
new file mode 100644
|
||
|
index 0000000000..87ac924f94
|
||
|
--- /dev/null
|
||
|
+++ b/changes/next/pcre2-support
|
||
|
@@ -0,0 +1,30 @@
|
||
|
+Description:
|
||
|
+
|
||
|
+Adds pcre2 support. Prefers pcre2 over pcre if both are available.
|
||
|
+
|
||
|
+
|
||
|
+Config changes:
|
||
|
+
|
||
|
+None
|
||
|
+
|
||
|
+
|
||
|
+Upgrade instructions:
|
||
|
+
|
||
|
+Cyrus will prefer pcre2 over pcre if both are installed. If you have both
|
||
|
+installed and wish to use pcre rather than pcre2, run configure with
|
||
|
+--disable-pcre2.
|
||
|
+
|
||
|
+If you haven't specifically installed libpcre2-dev (or whatever your system's
|
||
|
+equivalent is), you might still have parts of pcre2 installed due to other
|
||
|
+packages on your system depending on it. This can confuse configure into
|
||
|
+thinking you have a usable pcre2 when you don't. Either properly install
|
||
|
+libpcre2-dev so Cyrus can use it, or configure Cyrus with --disable-pcre2
|
||
|
+so that it ignores the partial installation.
|
||
|
+
|
||
|
+Please note that on Debian-based systems, pcre (the old one, no longer
|
||
|
+maintained) is called "pcre3". Yes, this is confusing.
|
||
|
+
|
||
|
+
|
||
|
+GitHub issue:
|
||
|
+
|
||
|
+#3861 #4711
|
||
|
From 19f286ad8f2eda1cccb688edb7369050d92bb6c6 Mon Sep 17 00:00:00 2001
|
||
|
From: ellie timoney <ellie@fastmail.com>
|
||
|
Date: Wed, 22 Nov 2023 16:28:14 +1100
|
||
|
Subject: [PATCH 1/4] Sieve: add bad regex case to badscript tests
|
||
|
|
||
|
---
|
||
|
cassandane/Cassandane/Cyrus/Sieve.pm | 10 ++++++++++
|
||
|
1 file changed, 10 insertions(+)
|
||
|
|
||
|
diff --git a/cassandane/Cassandane/Cyrus/Sieve.pm b/cassandane/Cassandane/Cyrus/Sieve.pm
|
||
|
index 2cd463f37f..0f0a3e66a6 100644
|
||
|
--- a/cassandane/Cassandane/Cyrus/Sieve.pm
|
||
|
+++ b/cassandane/Cassandane/Cyrus/Sieve.pm
|
||
|
@@ -488,6 +488,16 @@ sub badscript_common
|
||
|
"require [\"fileinto\",\"copy\"];\nfileinto :copy \"foo\";\n");
|
||
|
$self->assert_str_equals('success', $res);
|
||
|
|
||
|
+ my $badregex1 = << 'EOF';
|
||
|
+require ["regex"];
|
||
|
+if header :regex "Subject" "Message (x)?(.*" {
|
||
|
+ stop;
|
||
|
+}
|
||
|
+EOF
|
||
|
+ ($res, $errs) = $self->compile_sieve_script('badregex1', $badregex1);
|
||
|
+ $self->assert_str_equals('failure', $res);
|
||
|
+ $self->assert_matches(qr/unbalanced/, $errs);
|
||
|
+
|
||
|
# TODO: test UTF-8 verification of the string parameter
|
||
|
}
|
||
|
|
||
|
|
||
|
From 0395da350fdca0b8af57f01decc26d9ccc5375eb Mon Sep 17 00:00:00 2001
|
||
|
From: ellie timoney <ellie@fastmail.com>
|
||
|
Date: Wed, 22 Nov 2023 16:29:12 +1100
|
||
|
Subject: [PATCH 2/4] sieve/sieve.y: fix pcre2 crash when regex_t uninitialised
|
||
|
|
||
|
Fixes crash when trying to regfree() after regcomp() failure
|
||
|
|
||
|
Seems like this usage was fine with the old pcreposix, but is a
|
||
|
problem with pcre2posix.
|
||
|
---
|
||
|
sieve/sieve.y | 2 +-
|
||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/sieve/sieve.y b/sieve/sieve.y
|
||
|
index 17adb65112..908f2a4ed0 100644
|
||
|
--- a/sieve/sieve.y
|
||
|
+++ b/sieve/sieve.y
|
||
|
@@ -2140,7 +2140,6 @@ static int verify_regexlist(sieve_script_t *sscript,
|
||
|
const strarray_t *sa, int collation)
|
||
|
{
|
||
|
int i, ret = 0;
|
||
|
- regex_t reg;
|
||
|
int cflags = REG_EXTENDED | REG_NOSUB;
|
||
|
|
||
|
/* support UTF8 comparisons */
|
||
|
@@ -2156,6 +2155,7 @@ static int verify_regexlist(sieve_script_t *sscript,
|
||
|
|
||
|
for (i = 0 ; !ret && i < strarray_size(sa) ; i++) {
|
||
|
const char *s = strarray_nth(sa, i);
|
||
|
+ regex_t reg = {0};
|
||
|
|
||
|
/* Don't try to validate a regex that includes variables */
|
||
|
if (supported(SIEVE_CAPA_VARIABLES) && strstr(s, "${")) continue;
|
||
|
|
||
|
From eae2966b2198b4446a5f311cb6b25070dffa4335 Mon Sep 17 00:00:00 2001
|
||
|
From: ellie timoney <ellie@fastmail.com>
|
||
|
Date: Wed, 22 Nov 2023 16:50:52 +1100
|
||
|
Subject: [PATCH 3/4] buf.testc: regcomp failure is fatal
|
||
|
|
||
|
---
|
||
|
cunit/buf.testc | 2 +-
|
||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/cunit/buf.testc b/cunit/buf.testc
|
||
|
index 19f52e8cb2..c88a54e8b0 100644
|
||
|
--- a/cunit/buf.testc
|
||
|
+++ b/cunit/buf.testc
|
||
|
@@ -646,7 +646,7 @@ static void test_replace_all(void)
|
||
|
CU_ASSERT_STRING_EQUAL(b.s, _in); \
|
||
|
\
|
||
|
r = regcomp(&re, _reg, REG_EXTENDED); \
|
||
|
- CU_ASSERT_EQUAL(r, 0);
|
||
|
+ CU_ASSERT_EQUAL_FATAL(r, 0);
|
||
|
#define TESTCASE_MIDDLE \
|
||
|
n = buf_replace_one_re(&b, &re, _rep);
|
||
|
#define TESTCASE_END \
|
||
|
|
||
|
From ba43ab2462adca1a6f2dbfc54d967f02bd1dcb33 Mon Sep 17 00:00:00 2001
|
||
|
From: ellie timoney <ellie@fastmail.com>
|
||
|
Date: Wed, 22 Nov 2023 16:51:37 +1100
|
||
|
Subject: [PATCH 4/4] glob: assert that regcomp succeeded
|
||
|
|
||
|
instead of assuming it succeeded
|
||
|
---
|
||
|
lib/glob.c | 5 ++++-
|
||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/lib/glob.c b/lib/glob.c
|
||
|
index 06d5cb282b..89c45f0eae 100644
|
||
|
--- a/lib/glob.c
|
||
|
+++ b/lib/glob.c
|
||
|
@@ -46,6 +46,7 @@
|
||
|
#include <config.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
+#include <assert.h>
|
||
|
#include "util.h"
|
||
|
#include "glob.h"
|
||
|
#include "xmalloc.h"
|
||
|
@@ -58,6 +59,7 @@
|
||
|
EXPORTED glob *glob_init(const char *str, char sep)
|
||
|
{
|
||
|
struct buf buf = BUF_INITIALIZER;
|
||
|
+ int r;
|
||
|
|
||
|
buf_appendcstr(&buf, "(^");
|
||
|
while (*str) {
|
||
|
@@ -109,7 +111,9 @@ EXPORTED glob *glob_init(const char *str, char sep)
|
||
|
buf_appendcstr(&buf, "]|$)");
|
||
|
|
||
|
glob *g = xmalloc(sizeof(glob));
|
||
|
- regcomp(&g->regex, buf_cstring(&buf), REG_EXTENDED);
|
||
|
+ r = regcomp(&g->regex, buf_cstring(&buf), REG_EXTENDED);
|
||
|
+ /* XXX handle regex compilation failure properly! */
|
||
|
+ assert(r == 0);
|
||
|
buf_free(&buf);
|
||
|
|
||
|
return g;
|