diff --git a/pcre-8.42-Declare-POSIX-regex-function-names-as-macros-to-PCRE.patch b/pcre-8.42-Declare-POSIX-regex-function-names-as-macros-to-PCRE.patch new file mode 100644 index 0000000..c6ae004 --- /dev/null +++ b/pcre-8.42-Declare-POSIX-regex-function-names-as-macros-to-PCRE.patch @@ -0,0 +1,161 @@ +From f1e9a32ee7fad2263636a51536ce0f9f13f09949 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Wed, 23 Jan 2019 10:16:20 +0100 +Subject: [PATCH] Declare POSIX regex function names as macros to PCRE + functions +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +POSIX regex libraries differ in regex_t size. If a program includes +, but is not linked to pcreposix library at run-time +(either in effect of --as-needed or a lazy binding in dlopen) +other implementation touches memory out of the structure and the +program can crash. + +That means once a program includes , it must link to the +pcreposix library. + +This patch replaces the POSIX regex declaration with macros to the +PCRE uniqely-named function. This ensures that the PCRE's regex_t +structure is always handled by the PCRE functions. + +This patch still preserves the POSIX regex definitions in order to +preseve ABI with application compiled before this change. The +definition can be removed in the future. + +Signed-off-by: Petr Písař +--- + pcreposix.c | 50 +++++++++++++++++++++++++++++++++++++++++++++----- + pcreposix.h | 20 ++++++++++++++------ + 2 files changed, 59 insertions(+), 11 deletions(-) + +diff --git a/pcreposix.c b/pcreposix.c +index a76d6bf..3f2f3ef 100644 +--- a/pcreposix.c ++++ b/pcreposix.c +@@ -39,7 +39,10 @@ POSSIBILITY OF SUCH DAMAGE. + + + /* This module is a wrapper that provides a POSIX API to the underlying PCRE +-functions. */ ++functions. The operative functions are called pcre_regcomp(), etc., with ++wrappers that use the plain POSIX names. This makes it easier for an ++application to be sure it gets the PCRE versions in the presence of other ++POSIX regex libraries. */ + + + #ifdef HAVE_CONFIG_H +@@ -204,12 +207,49 @@ static const char *const pstring[] = { + + + /************************************************* +-* Translate error code to string * ++* Wrappers with traditional POSIX names * + *************************************************/ + ++/* Keep defining them to preseve ABI with application linked to pcreposix ++ * library before they were changed into macros. */ ++ ++#undef regerror + PCREPOSIX_EXP_DEFN size_t PCRE_CALL_CONVENTION + regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) + { ++return pcre_regerror(errcode, preg, errbuf, errbuf_size); ++} ++ ++#undef regfree ++PCREPOSIX_EXP_DEFN void PCRE_CALL_CONVENTION ++regfree(regex_t *preg) ++{ ++pcre_regfree(preg); ++} ++ ++#undef regcomp ++PCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION ++regcomp(regex_t *preg, const char *pattern, int cflags) ++{ ++return pcre_regcomp(preg, pattern, cflags); ++} ++ ++#undef regexec ++PCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION ++regexec(const regex_t *preg, const char *string, size_t nmatch, ++ regmatch_t pmatch[], int eflags) ++{ ++return pcre_regexec(preg, string, nmatch, pmatch, eflags); ++} ++ ++ ++/************************************************* ++* Translate error code to string * ++*************************************************/ ++ ++PCREPOSIX_EXP_DEFN size_t PCRE_CALL_CONVENTION ++pcre_regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) ++{ + const char *message, *addmessage; + size_t length, addlength; + +@@ -243,7 +283,7 @@ return length + addlength; + *************************************************/ + + PCREPOSIX_EXP_DEFN void PCRE_CALL_CONVENTION +-regfree(regex_t *preg) ++pcre_regfree(regex_t *preg) + { + (PUBL(free))(preg->re_pcre); + } +@@ -266,7 +306,7 @@ Returns: 0 on success + */ + + PCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION +-regcomp(regex_t *preg, const char *pattern, int cflags) ++pcre_regcomp(regex_t *preg, const char *pattern, int cflags) + { + const char *errorptr; + int erroffset; +@@ -320,7 +360,7 @@ be set. When this is the case, the nmatch and pmatch arguments are ignored, and + the only result is yes/no/error. */ + + PCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION +-regexec(const regex_t *preg, const char *string, size_t nmatch, ++pcre_regexec(const regex_t *preg, const char *string, size_t nmatch, + regmatch_t pmatch[], int eflags) + { + int rc, so, eo; +diff --git a/pcreposix.h b/pcreposix.h +index c77c0b0..6f108b8 100644 +--- a/pcreposix.h ++++ b/pcreposix.h +@@ -131,13 +131,21 @@ file. */ + # endif + #endif + +-/* The functions */ +- +-PCREPOSIX_EXP_DECL int regcomp(regex_t *, const char *, int); +-PCREPOSIX_EXP_DECL int regexec(const regex_t *, const char *, size_t, ++/* The functions. The actual code is in functions with pcre_xxx names for ++uniqueness. POSIX names are provided for API compatibility with POSIX regex ++functions. It's done this way to ensure to they are always get from the ++PCRE library and not by accident from elsewhere. (regex_t differs in size ++elsewhere.) */ ++ ++PCREPOSIX_EXP_DECL int pcre_regcomp(regex_t *, const char *, int); ++#define regcomp pcre_regcomp ++PCREPOSIX_EXP_DECL int pcre_regexec(const regex_t *, const char *, size_t, + regmatch_t *, int); +-PCREPOSIX_EXP_DECL size_t regerror(int, const regex_t *, char *, size_t); +-PCREPOSIX_EXP_DECL void regfree(regex_t *); ++#define regexec pcre_regexec ++PCREPOSIX_EXP_DECL size_t pcre_regerror(int, const regex_t *, char *, size_t); ++#define regerror pcre_regerror ++PCREPOSIX_EXP_DECL void pcre_regfree(regex_t *); ++#define regfree pcre_regfree + + #ifdef __cplusplus + } /* extern "C" */ +-- +2.17.2 + diff --git a/pcre.spec b/pcre.spec index 613eee6..ef2a278 100644 --- a/pcre.spec +++ b/pcre.spec @@ -2,7 +2,7 @@ #%%global rcversion RC1 Name: pcre Version: 8.42 -Release: %{?rcversion:0.}6%{?rcversion:.%rcversion}%{?dist} +Release: %{?rcversion:0.}7%{?rcversion:.%rcversion}%{?dist} %global myversion %{version}%{?rcversion:-%rcversion} Summary: Perl-compatible regular expression library ## Source package only: @@ -58,6 +58,11 @@ Patch8: pcre-8.42-Fix-zero-repeat-leading-subroutine-call-first-charac.patch # fix an undefined behavior in aarch64 JIT compiler, upstream bug #2355, # in upstream after 8.42 Patch9: pcre-8.42-JIT-compiler-update.patch +# Link applications to PCRE-specific symbols when using POSIX API, bug #1667614, +# upstream bug 1830, partially borrowed from PCRE2, proposed to upstream, +# This amends ABI, application built with this patch cannot run with +# previous libpcreposix builds. +Patch10: pcre-8.42-Declare-POSIX-regex-function-names-as-macros-to-PCRE.patch BuildRequires: readline-devel BuildRequires: autoconf BuildRequires: automake @@ -149,6 +154,7 @@ Utilities demonstrating PCRE capabilities like pcregrep or pcretest. %patch7 -p1 %patch8 -p1 %patch9 -p1 +%patch10 -p1 # Because of rpath patch libtoolize --copy --force autoreconf -vif @@ -243,6 +249,9 @@ make %{?_smp_mflags} check VERBOSE=yes %{_mandir}/man1/pcretest.* %changelog +* Wed Jan 23 2019 Petr Pisar - 8.42-7 +- Link applications to PCRE-specific symbols when using POSIX API (bug #1667614) + * Thu Jan 03 2019 Petr Pisar - 8.42-6 - Fix OpenPOWER 64-bit ELFv2 ABI detection in JIT compiler (upstream bug #2353) - Fix an undefined behavior in aarch64 JIT compiler (upstream bug #2355)