From 9d414d0e5ed5d95fcdbb17e4961ec498f45ef3c1 Mon Sep 17 00:00:00 2001 From: Daniel Kraus Date: Fri, 9 Aug 2013 17:34:01 +0200 Subject: [PATCH] Prevent crashes due to regexp compilation errors Page titles are now properly escaped using preg_quote() to prevent regexp compilation errors if the title contains characters with special meanings in regular expressions. --- LinkTitles.body.php | 12 ++++++++---- LinkTitles.php | 2 +- NEWS | 3 +++ release/LinkTitles-2.2.2.tar.gz | Bin 0 -> 11750 bytes 4 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 release/LinkTitles-2.2.2.tar.gz diff --git a/LinkTitles.body.php b/LinkTitles.body.php index 5d712ac..fe13c7d 100755 --- a/LinkTitles.body.php +++ b/LinkTitles.body.php @@ -184,15 +184,19 @@ // see http://stackoverflow.com/questions/10672286 $arr = preg_split( $delimiter, $text, -1, PREG_SPLIT_DELIM_CAPTURE ); + // Escape certain special characters in the page title to prevent + // regexp compilation errors + $escapedTitle = preg_quote(LinkTitles::$safeTitle, '/'); + // Depending on the global configuration setting $wgCapitalLinks, // the title has to be searched for either in a strictly case-sensitive // way, or in a 'fuzzy' way where the first letter of the title may // be either case. if ( $wgCapitalLinks ) { - $searchTerm = '((?i)' . LinkTitles::$safeTitle[0] . '(?-i)' . - substr(LinkTitles::$safeTitle, 1) . ')'; + $searchTerm = '((?i)' . $escapedTitle[0] . '(?-i)' . + substr($escapedTitle, 1) . ')'; } else { - $searchTerm = '(' . LinkTitles::$safeTitle . ')'; + $searchTerm = '(' . $escapedTitle . ')'; } for ( $i = 0; $i < count( $arr ); $i+=2 ) { @@ -218,7 +222,7 @@ for ( $i = 0; $i < count( $arr ); $i+=2 ) { // even indexes will point to text that is not enclosed by brackets $arr[$i] = preg_replace_callback( '/(?= 0 ) && ( $count > 0 )) { break; diff --git a/LinkTitles.php b/LinkTitles.php index f906c8e..1d25626 100755 --- a/LinkTitles.php +++ b/LinkTitles.php @@ -49,7 +49,7 @@ 'name' => 'LinkTitles', 'author' => '[https://www.mediawiki.org/wiki/User:Bovender Daniel Kraus]', 'url' => 'https://www.mediawiki.org/wiki/Extension:LinkTitles', - 'version' => '2.2.1', + 'version' => '2.2.2', 'descriptionmsg' => 'linktitles-desc' ); diff --git a/NEWS b/NEWS index 6be9591..670797f 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +LinkTitles 2.2.2: 2013-08-09 +* Prevent crashes due to special characters in page titles. + LinkTitles 2.2.1: 2013-07-22 * Make the extension work with sqlite databases. diff --git a/release/LinkTitles-2.2.2.tar.gz b/release/LinkTitles-2.2.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f5d99592bdd198b69915a2ba61782db9885b05c9 GIT binary patch literal 11750 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 IApoEN0OPp2e*gdg literal 0 HcmV?d00001