Fix caseless reference
This commit is contained in:
parent
abbcae7348
commit
54a4973709
552
pcre-8.12-caseless_reference.patch
Normal file
552
pcre-8.12-caseless_reference.patch
Normal file
@ -0,0 +1,552 @@
|
|||||||
|
r595 | ph10 | 2011-05-02 12:33:29 +0200 (Po, 02 kvě 2011) | 3 lines
|
||||||
|
Fix problems with caseless reference matching in UTF-8 mode when the
|
||||||
|
upper/lower case characters have different lengths.
|
||||||
|
|
||||||
|
and
|
||||||
|
|
||||||
|
r597 | ph10 | 2011-05-02 19:08:52 +0200 (Po, 02 kvě 2011) | 2 lines
|
||||||
|
Complete incomplete fix for UTF-8 caseless references of different lengths.
|
||||||
|
|
||||||
|
http://bugs.exim.org/show_bug.cgi?id=1074
|
||||||
|
|
||||||
|
Petr Pisar: Changelog and comment changes removed.
|
||||||
|
|
||||||
|
Index: testdata/testoutput12
|
||||||
|
===================================================================
|
||||||
|
--- testdata/testoutput12 (revision 594)
|
||||||
|
+++ testdata/testoutput12 (revision 595)
|
||||||
|
@@ -1176,4 +1176,64 @@
|
||||||
|
End
|
||||||
|
------------------------------------------------------------------
|
||||||
|
|
||||||
|
+/-- These behaved oddly in Perl, so they are kept in this test --/
|
||||||
|
+
|
||||||
|
+/(\x{23a}\x{23a}\x{23a})?\1/8i
|
||||||
|
+ \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}
|
||||||
|
+No match
|
||||||
|
+
|
||||||
|
+/(ȺȺȺ)?\1/8i
|
||||||
|
+ ȺȺȺⱥⱥ
|
||||||
|
+No match
|
||||||
|
+
|
||||||
|
+/(\x{23a}\x{23a}\x{23a})?\1/8i
|
||||||
|
+ \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
|
||||||
|
+ 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
|
||||||
|
+ 1: \x{23a}\x{23a}\x{23a}
|
||||||
|
+
|
||||||
|
+/(ȺȺȺ)?\1/8i
|
||||||
|
+ ȺȺȺⱥⱥⱥ
|
||||||
|
+ 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
|
||||||
|
+ 1: \x{23a}\x{23a}\x{23a}
|
||||||
|
+
|
||||||
|
+/(\x{23a}\x{23a}\x{23a})\1/8i
|
||||||
|
+ \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}
|
||||||
|
+No match
|
||||||
|
+
|
||||||
|
+/(ȺȺȺ)\1/8i
|
||||||
|
+ ȺȺȺⱥⱥ
|
||||||
|
+No match
|
||||||
|
+
|
||||||
|
+/(\x{23a}\x{23a}\x{23a})\1/8i
|
||||||
|
+ \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
|
||||||
|
+ 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
|
||||||
|
+ 1: \x{23a}\x{23a}\x{23a}
|
||||||
|
+
|
||||||
|
+/(ȺȺȺ)\1/8i
|
||||||
|
+ ȺȺȺⱥⱥⱥ
|
||||||
|
+ 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
|
||||||
|
+ 1: \x{23a}\x{23a}\x{23a}
|
||||||
|
+
|
||||||
|
+/(\x{2c65}\x{2c65})\1/8i
|
||||||
|
+ \x{2c65}\x{2c65}\x{23a}\x{23a}
|
||||||
|
+ 0: \x{2c65}\x{2c65}\x{23a}\x{23a}
|
||||||
|
+ 1: \x{2c65}\x{2c65}
|
||||||
|
+
|
||||||
|
+/(ⱥⱥ)\1/8i
|
||||||
|
+ ⱥⱥȺȺ
|
||||||
|
+ 0: \x{2c65}\x{2c65}\x{23a}\x{23a}
|
||||||
|
+ 1: \x{2c65}\x{2c65}
|
||||||
|
+
|
||||||
|
+/(\x{23a}\x{23a}\x{23a})\1Y/8i
|
||||||
|
+ X\x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}YZ
|
||||||
|
+ 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}Y
|
||||||
|
+ 1: \x{23a}\x{23a}\x{23a}
|
||||||
|
+
|
||||||
|
+/(\x{2c65}\x{2c65})\1Y/8i
|
||||||
|
+ X\x{2c65}\x{2c65}\x{23a}\x{23a}YZ
|
||||||
|
+ 0: \x{2c65}\x{2c65}\x{23a}\x{23a}Y
|
||||||
|
+ 1: \x{2c65}\x{2c65}
|
||||||
|
+
|
||||||
|
+/-- --/
|
||||||
|
+
|
||||||
|
/-- End of testinput12 --/
|
||||||
|
Index: testdata/testinput12
|
||||||
|
===================================================================
|
||||||
|
--- testdata/testinput12 (revision 594)
|
||||||
|
+++ testdata/testinput12 (revision 595)
|
||||||
|
@@ -503,4 +503,44 @@
|
||||||
|
|
||||||
|
/A+\p{N}A+\dB+\p{N}*B+\d*/WBZ
|
||||||
|
|
||||||
|
+/-- These behaved oddly in Perl, so they are kept in this test --/
|
||||||
|
+
|
||||||
|
+/(\x{23a}\x{23a}\x{23a})?\1/8i
|
||||||
|
+ \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}
|
||||||
|
+
|
||||||
|
+/(ȺȺȺ)?\1/8i
|
||||||
|
+ ȺȺȺⱥⱥ
|
||||||
|
+
|
||||||
|
+/(\x{23a}\x{23a}\x{23a})?\1/8i
|
||||||
|
+ \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
|
||||||
|
+
|
||||||
|
+/(ȺȺȺ)?\1/8i
|
||||||
|
+ ȺȺȺⱥⱥⱥ
|
||||||
|
+
|
||||||
|
+/(\x{23a}\x{23a}\x{23a})\1/8i
|
||||||
|
+ \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}
|
||||||
|
+
|
||||||
|
+/(ȺȺȺ)\1/8i
|
||||||
|
+ ȺȺȺⱥⱥ
|
||||||
|
+
|
||||||
|
+/(\x{23a}\x{23a}\x{23a})\1/8i
|
||||||
|
+ \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
|
||||||
|
+
|
||||||
|
+/(ȺȺȺ)\1/8i
|
||||||
|
+ ȺȺȺⱥⱥⱥ
|
||||||
|
+
|
||||||
|
+/(\x{2c65}\x{2c65})\1/8i
|
||||||
|
+ \x{2c65}\x{2c65}\x{23a}\x{23a}
|
||||||
|
+
|
||||||
|
+/(ⱥⱥ)\1/8i
|
||||||
|
+ ⱥⱥȺȺ
|
||||||
|
+
|
||||||
|
+/(\x{23a}\x{23a}\x{23a})\1Y/8i
|
||||||
|
+ X\x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}YZ
|
||||||
|
+
|
||||||
|
+/(\x{2c65}\x{2c65})\1Y/8i
|
||||||
|
+ X\x{2c65}\x{2c65}\x{23a}\x{23a}YZ
|
||||||
|
+
|
||||||
|
+/-- --/
|
||||||
|
+
|
||||||
|
/-- End of testinput12 --/
|
||||||
|
Index: pcre_exec.c
|
||||||
|
===================================================================
|
||||||
|
--- pcre_exec.c (revision 594)
|
||||||
|
+++ pcre_exec.c (revision 595)
|
||||||
|
@@ -132,24 +132,27 @@
|
||||||
|
* Match a back-reference *
|
||||||
|
*************************************************/
|
||||||
|
|
||||||
|
-/* If a back reference hasn't been set, the length that is passed is greater
|
||||||
|
-than the number of characters left in the string, so the match fails.
|
||||||
|
+/* Normally, if a back reference hasn't been set, the length that is passed is
|
||||||
|
+negative, so the match always fails. However, in JavaScript compatibility mode,
|
||||||
|
+the length passed is zero. Note that in caseless UTF-8 mode, the number of
|
||||||
|
+subject bytes matched may be different to the number of reference bytes.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
offset index into the offset vector
|
||||||
|
- eptr points into the subject
|
||||||
|
- length length to be matched
|
||||||
|
+ eptr pointer into the subject
|
||||||
|
+ length length of reference to be matched (number of bytes)
|
||||||
|
md points to match data block
|
||||||
|
ims the ims flags
|
||||||
|
|
||||||
|
-Returns: TRUE if matched
|
||||||
|
+Returns: < 0 if not matched, otherwise the number of subject bytes matched
|
||||||
|
*/
|
||||||
|
|
||||||
|
-static BOOL
|
||||||
|
+static int
|
||||||
|
match_ref(int offset, register USPTR eptr, int length, match_data *md,
|
||||||
|
unsigned long int ims)
|
||||||
|
{
|
||||||
|
-USPTR p = md->start_subject + md->offset_vector[offset];
|
||||||
|
+USPTR eptr_start = eptr;
|
||||||
|
+register USPTR p = md->start_subject + md->offset_vector[offset];
|
||||||
|
|
||||||
|
#ifdef PCRE_DEBUG
|
||||||
|
if (eptr >= md->end_subject)
|
||||||
|
@@ -164,9 +167,9 @@
|
||||||
|
printf("\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-/* Always fail if not enough characters left */
|
||||||
|
+/* Always fail if reference not set (and not JavaScript compatible). */
|
||||||
|
|
||||||
|
-if (length > md->end_subject - eptr) return FALSE;
|
||||||
|
+if (length < 0) return -1;
|
||||||
|
|
||||||
|
/* Separate the caseless case for speed. In UTF-8 mode we can only do this
|
||||||
|
properly if Unicode properties are supported. Otherwise, we can check only
|
||||||
|
@@ -178,13 +181,21 @@
|
||||||
|
#ifdef SUPPORT_UCP
|
||||||
|
if (md->utf8)
|
||||||
|
{
|
||||||
|
- USPTR endptr = eptr + length;
|
||||||
|
- while (eptr < endptr)
|
||||||
|
+ /* Match characters up to the end of the reference. NOTE: the number of
|
||||||
|
+ bytes matched may differ, because there are some characters whose upper and
|
||||||
|
+ lower case versions code as different numbers of bytes. For example, U+023A
|
||||||
|
+ (2 bytes in UTF-8) is the upper case version of U+2C65 (3 bytes in UTF-8);
|
||||||
|
+ a sequence of 3 of the former uses 6 bytes, as does a sequence of two of
|
||||||
|
+ the latter. It is important, therefore, to check the length along the
|
||||||
|
+ reference, not along the subject (earlier code did this wrong). */
|
||||||
|
+
|
||||||
|
+ USPTR endptr = p + length;
|
||||||
|
+ while (p < endptr)
|
||||||
|
{
|
||||||
|
int c, d;
|
||||||
|
GETCHARINC(c, eptr);
|
||||||
|
GETCHARINC(d, p);
|
||||||
|
- if (c != d && c != UCD_OTHERCASE(d)) return FALSE;
|
||||||
|
+ if (c != d && c != UCD_OTHERCASE(d)) return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
@@ -195,16 +206,16 @@
|
||||||
|
is no UCP support. */
|
||||||
|
|
||||||
|
while (length-- > 0)
|
||||||
|
- { if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE; }
|
||||||
|
+ { if (md->lcc[*p++] != md->lcc[*eptr++]) return -1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In the caseful case, we can just compare the bytes, whether or not we
|
||||||
|
are in UTF-8 mode. */
|
||||||
|
|
||||||
|
else
|
||||||
|
- { while (length-- > 0) if (*p++ != *eptr++) return FALSE; }
|
||||||
|
+ { while (length-- > 0) if (*p++ != *eptr++) return -1; }
|
||||||
|
|
||||||
|
-return TRUE;
|
||||||
|
+return eptr - eptr_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -2252,129 +2263,129 @@
|
||||||
|
loops). */
|
||||||
|
|
||||||
|
case OP_REF:
|
||||||
|
- {
|
||||||
|
- offset = GET2(ecode, 1) << 1; /* Doubled ref number */
|
||||||
|
- ecode += 3;
|
||||||
|
+ offset = GET2(ecode, 1) << 1; /* Doubled ref number */
|
||||||
|
+ ecode += 3;
|
||||||
|
|
||||||
|
- /* If the reference is unset, there are two possibilities:
|
||||||
|
+ /* If the reference is unset, there are two possibilities:
|
||||||
|
|
||||||
|
- (a) In the default, Perl-compatible state, set the length to be longer
|
||||||
|
- than the amount of subject left; this ensures that every attempt at a
|
||||||
|
- match fails. We can't just fail here, because of the possibility of
|
||||||
|
- quantifiers with zero minima.
|
||||||
|
+ (a) In the default, Perl-compatible state, set the length negative;
|
||||||
|
+ this ensures that every attempt at a match fails. We can't just fail
|
||||||
|
+ here, because of the possibility of quantifiers with zero minima.
|
||||||
|
|
||||||
|
- (b) If the JavaScript compatibility flag is set, set the length to zero
|
||||||
|
- so that the back reference matches an empty string.
|
||||||
|
+ (b) If the JavaScript compatibility flag is set, set the length to zero
|
||||||
|
+ so that the back reference matches an empty string.
|
||||||
|
|
||||||
|
- Otherwise, set the length to the length of what was matched by the
|
||||||
|
- referenced subpattern. */
|
||||||
|
+ Otherwise, set the length to the length of what was matched by the
|
||||||
|
+ referenced subpattern. */
|
||||||
|
|
||||||
|
- if (offset >= offset_top || md->offset_vector[offset] < 0)
|
||||||
|
- length = (md->jscript_compat)? 0 : (int)(md->end_subject - eptr + 1);
|
||||||
|
- else
|
||||||
|
- length = md->offset_vector[offset+1] - md->offset_vector[offset];
|
||||||
|
+ if (offset >= offset_top || md->offset_vector[offset] < 0)
|
||||||
|
+ length = (md->jscript_compat)? 0 : -1;
|
||||||
|
+ else
|
||||||
|
+ length = md->offset_vector[offset+1] - md->offset_vector[offset];
|
||||||
|
|
||||||
|
- /* Set up for repetition, or handle the non-repeated case */
|
||||||
|
+ /* Set up for repetition, or handle the non-repeated case */
|
||||||
|
|
||||||
|
- switch (*ecode)
|
||||||
|
- {
|
||||||
|
- case OP_CRSTAR:
|
||||||
|
- case OP_CRMINSTAR:
|
||||||
|
- case OP_CRPLUS:
|
||||||
|
- case OP_CRMINPLUS:
|
||||||
|
- case OP_CRQUERY:
|
||||||
|
- case OP_CRMINQUERY:
|
||||||
|
- c = *ecode++ - OP_CRSTAR;
|
||||||
|
- minimize = (c & 1) != 0;
|
||||||
|
- min = rep_min[c]; /* Pick up values from tables; */
|
||||||
|
- max = rep_max[c]; /* zero for max => infinity */
|
||||||
|
- if (max == 0) max = INT_MAX;
|
||||||
|
- break;
|
||||||
|
+ switch (*ecode)
|
||||||
|
+ {
|
||||||
|
+ case OP_CRSTAR:
|
||||||
|
+ case OP_CRMINSTAR:
|
||||||
|
+ case OP_CRPLUS:
|
||||||
|
+ case OP_CRMINPLUS:
|
||||||
|
+ case OP_CRQUERY:
|
||||||
|
+ case OP_CRMINQUERY:
|
||||||
|
+ c = *ecode++ - OP_CRSTAR;
|
||||||
|
+ minimize = (c & 1) != 0;
|
||||||
|
+ min = rep_min[c]; /* Pick up values from tables; */
|
||||||
|
+ max = rep_max[c]; /* zero for max => infinity */
|
||||||
|
+ if (max == 0) max = INT_MAX;
|
||||||
|
+ break;
|
||||||
|
|
||||||
|
- case OP_CRRANGE:
|
||||||
|
- case OP_CRMINRANGE:
|
||||||
|
- minimize = (*ecode == OP_CRMINRANGE);
|
||||||
|
- min = GET2(ecode, 1);
|
||||||
|
- max = GET2(ecode, 3);
|
||||||
|
- if (max == 0) max = INT_MAX;
|
||||||
|
- ecode += 5;
|
||||||
|
- break;
|
||||||
|
+ case OP_CRRANGE:
|
||||||
|
+ case OP_CRMINRANGE:
|
||||||
|
+ minimize = (*ecode == OP_CRMINRANGE);
|
||||||
|
+ min = GET2(ecode, 1);
|
||||||
|
+ max = GET2(ecode, 3);
|
||||||
|
+ if (max == 0) max = INT_MAX;
|
||||||
|
+ ecode += 5;
|
||||||
|
+ break;
|
||||||
|
|
||||||
|
- default: /* No repeat follows */
|
||||||
|
- if (!match_ref(offset, eptr, length, md, ims))
|
||||||
|
- {
|
||||||
|
- CHECK_PARTIAL();
|
||||||
|
- MRRETURN(MATCH_NOMATCH);
|
||||||
|
- }
|
||||||
|
- eptr += length;
|
||||||
|
- continue; /* With the main loop */
|
||||||
|
+ default: /* No repeat follows */
|
||||||
|
+ if ((length = match_ref(offset, eptr, length, md, ims)) < 0)
|
||||||
|
+ {
|
||||||
|
+ CHECK_PARTIAL();
|
||||||
|
+ MRRETURN(MATCH_NOMATCH);
|
||||||
|
}
|
||||||
|
+ eptr += length;
|
||||||
|
+ continue; /* With the main loop */
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- /* If the length of the reference is zero, just continue with the
|
||||||
|
- main loop. */
|
||||||
|
+ /* Handle repeated back references. If the length of the reference is
|
||||||
|
+ zero, just continue with the main loop. */
|
||||||
|
|
||||||
|
- if (length == 0) continue;
|
||||||
|
+ if (length == 0) continue;
|
||||||
|
|
||||||
|
- /* First, ensure the minimum number of matches are present. We get back
|
||||||
|
- the length of the reference string explicitly rather than passing the
|
||||||
|
- address of eptr, so that eptr can be a register variable. */
|
||||||
|
+ /* First, ensure the minimum number of matches are present. We get back
|
||||||
|
+ the length of the reference string explicitly rather than passing the
|
||||||
|
+ address of eptr, so that eptr can be a register variable. */
|
||||||
|
|
||||||
|
- for (i = 1; i <= min; i++)
|
||||||
|
+ for (i = 1; i <= min; i++)
|
||||||
|
+ {
|
||||||
|
+ int slength;
|
||||||
|
+ if ((slength = match_ref(offset, eptr, length, md, ims)) < 0)
|
||||||
|
{
|
||||||
|
- if (!match_ref(offset, eptr, length, md, ims))
|
||||||
|
- {
|
||||||
|
- CHECK_PARTIAL();
|
||||||
|
- MRRETURN(MATCH_NOMATCH);
|
||||||
|
- }
|
||||||
|
- eptr += length;
|
||||||
|
+ CHECK_PARTIAL();
|
||||||
|
+ MRRETURN(MATCH_NOMATCH);
|
||||||
|
}
|
||||||
|
+ eptr += slength;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- /* If min = max, continue at the same level without recursion.
|
||||||
|
- They are not both allowed to be zero. */
|
||||||
|
+ /* If min = max, continue at the same level without recursion.
|
||||||
|
+ They are not both allowed to be zero. */
|
||||||
|
|
||||||
|
- if (min == max) continue;
|
||||||
|
+ if (min == max) continue;
|
||||||
|
|
||||||
|
- /* If minimizing, keep trying and advancing the pointer */
|
||||||
|
+ /* If minimizing, keep trying and advancing the pointer */
|
||||||
|
|
||||||
|
- if (minimize)
|
||||||
|
+ if (minimize)
|
||||||
|
+ {
|
||||||
|
+ for (fi = min;; fi++)
|
||||||
|
{
|
||||||
|
- for (fi = min;; fi++)
|
||||||
|
+ int slength;
|
||||||
|
+ RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM14);
|
||||||
|
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||||
|
+ if (fi >= max) MRRETURN(MATCH_NOMATCH);
|
||||||
|
+ if ((slength = match_ref(offset, eptr, length, md, ims)) < 0)
|
||||||
|
{
|
||||||
|
- RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM14);
|
||||||
|
- if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||||
|
- if (fi >= max) MRRETURN(MATCH_NOMATCH);
|
||||||
|
- if (!match_ref(offset, eptr, length, md, ims))
|
||||||
|
- {
|
||||||
|
- CHECK_PARTIAL();
|
||||||
|
- MRRETURN(MATCH_NOMATCH);
|
||||||
|
- }
|
||||||
|
- eptr += length;
|
||||||
|
+ CHECK_PARTIAL();
|
||||||
|
+ MRRETURN(MATCH_NOMATCH);
|
||||||
|
}
|
||||||
|
- /* Control never gets here */
|
||||||
|
+ eptr += slength;
|
||||||
|
}
|
||||||
|
+ /* Control never gets here */
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- /* If maximizing, find the longest string and work backwards */
|
||||||
|
+ /* If maximizing, find the longest string and work backwards */
|
||||||
|
|
||||||
|
- else
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ pp = eptr;
|
||||||
|
+ for (i = min; i < max; i++)
|
||||||
|
{
|
||||||
|
- pp = eptr;
|
||||||
|
- for (i = min; i < max; i++)
|
||||||
|
+ int slength;
|
||||||
|
+ if ((slength = match_ref(offset, eptr, length, md, ims)) < 0)
|
||||||
|
{
|
||||||
|
- if (!match_ref(offset, eptr, length, md, ims))
|
||||||
|
- {
|
||||||
|
- CHECK_PARTIAL();
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- eptr += length;
|
||||||
|
+ CHECK_PARTIAL();
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
- while (eptr >= pp)
|
||||||
|
- {
|
||||||
|
- RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM15);
|
||||||
|
- if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||||
|
- eptr -= length;
|
||||||
|
- }
|
||||||
|
- MRRETURN(MATCH_NOMATCH);
|
||||||
|
+ eptr += slength;
|
||||||
|
}
|
||||||
|
+ while (eptr >= pp)
|
||||||
|
+ {
|
||||||
|
+ RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM15);
|
||||||
|
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||||
|
+ eptr -= length;
|
||||||
|
+ }
|
||||||
|
+ MRRETURN(MATCH_NOMATCH);
|
||||||
|
}
|
||||||
|
/* Control never gets here */
|
||||||
|
|
||||||
|
Index: testdata/testinput1
|
||||||
|
===================================================================
|
||||||
|
--- testdata/testinput1 (revision 596)
|
||||||
|
+++ testdata/testinput1 (revision 597)
|
||||||
|
@@ -4079,4 +4079,10 @@
|
||||||
|
/^\c/
|
||||||
|
?
|
||||||
|
|
||||||
|
+/(abc)\1/i
|
||||||
|
+ abc
|
||||||
|
+
|
||||||
|
+/(abc)\1/
|
||||||
|
+ abc
|
||||||
|
+
|
||||||
|
/-- End of testinput1 --/
|
||||||
|
Index: testdata/testoutput1
|
||||||
|
===================================================================
|
||||||
|
--- testdata/testoutput1 (revision 596)
|
||||||
|
+++ testdata/testoutput1 (revision 597)
|
||||||
|
@@ -6666,4 +6666,12 @@
|
||||||
|
?
|
||||||
|
0: ?
|
||||||
|
|
||||||
|
+/(abc)\1/i
|
||||||
|
+ abc
|
||||||
|
+No match
|
||||||
|
+
|
||||||
|
+/(abc)\1/
|
||||||
|
+ abc
|
||||||
|
+No match
|
||||||
|
+
|
||||||
|
/-- End of testinput1 --/
|
||||||
|
Index: testdata/testinput4
|
||||||
|
===================================================================
|
||||||
|
--- testdata/testinput4 (revision 596)
|
||||||
|
+++ testdata/testinput4 (revision 597)
|
||||||
|
@@ -644,4 +644,10 @@
|
||||||
|
/A*/g8
|
||||||
|
AAB\x{123}BAA
|
||||||
|
|
||||||
|
+/(abc)\1/8i
|
||||||
|
+ abc
|
||||||
|
+
|
||||||
|
+/(abc)\1/8
|
||||||
|
+ abc
|
||||||
|
+
|
||||||
|
/-- End of testinput4 --/
|
||||||
|
Index: testdata/testoutput4
|
||||||
|
===================================================================
|
||||||
|
--- testdata/testoutput4 (revision 596)
|
||||||
|
+++ testdata/testoutput4 (revision 597)
|
||||||
|
@@ -1128,4 +1128,12 @@
|
||||||
|
0: AA
|
||||||
|
0:
|
||||||
|
|
||||||
|
+/(abc)\1/8i
|
||||||
|
+ abc
|
||||||
|
+No match
|
||||||
|
+
|
||||||
|
+/(abc)\1/8
|
||||||
|
+ abc
|
||||||
|
+No match
|
||||||
|
+
|
||||||
|
/-- End of testinput4 --/
|
||||||
|
Index: pcre_exec.c
|
||||||
|
===================================================================
|
||||||
|
--- pcre_exec.c (revision 596)
|
||||||
|
+++ pcre_exec.c (revision 597)
|
||||||
|
@@ -193,6 +193,7 @@
|
||||||
|
while (p < endptr)
|
||||||
|
{
|
||||||
|
int c, d;
|
||||||
|
+ if (eptr >= md->end_subject) return -1;
|
||||||
|
GETCHARINC(c, eptr);
|
||||||
|
GETCHARINC(d, p);
|
||||||
|
if (c != d && c != UCD_OTHERCASE(d)) return -1;
|
||||||
|
@@ -204,16 +205,21 @@
|
||||||
|
|
||||||
|
/* The same code works when not in UTF-8 mode and in UTF-8 mode when there
|
||||||
|
is no UCP support. */
|
||||||
|
-
|
||||||
|
- while (length-- > 0)
|
||||||
|
- { if (md->lcc[*p++] != md->lcc[*eptr++]) return -1; }
|
||||||
|
+ {
|
||||||
|
+ if (eptr + length > md->end_subject) return -1;
|
||||||
|
+ while (length-- > 0)
|
||||||
|
+ { if (md->lcc[*p++] != md->lcc[*eptr++]) return -1; }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In the caseful case, we can just compare the bytes, whether or not we
|
||||||
|
are in UTF-8 mode. */
|
||||||
|
|
||||||
|
else
|
||||||
|
- { while (length-- > 0) if (*p++ != *eptr++) return -1; }
|
||||||
|
+ {
|
||||||
|
+ if (eptr + length > md->end_subject) return -1;
|
||||||
|
+ while (length-- > 0) if (*p++ != *eptr++) return -1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return eptr - eptr_start;
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
Name: pcre
|
Name: pcre
|
||||||
Version: 8.12
|
Version: 8.12
|
||||||
Release: 3%{?dist}
|
Release: 4%{?dist}
|
||||||
Summary: Perl-compatible regular expression library
|
Summary: Perl-compatible regular expression library
|
||||||
Group: System Environment/Libraries
|
Group: System Environment/Libraries
|
||||||
License: BSD
|
License: BSD
|
||||||
@ -11,6 +11,8 @@ Patch0: pcre-8.10-multilib.patch
|
|||||||
Patch1: pcre-8.12-manual_typos.patch
|
Patch1: pcre-8.12-manual_typos.patch
|
||||||
# Refused by upstream, bug #675477
|
# Refused by upstream, bug #675477
|
||||||
Patch2: pcre-8.12-refused_spelling_terminated.patch
|
Patch2: pcre-8.12-refused_spelling_terminated.patch
|
||||||
|
# In upstream, bug #702623
|
||||||
|
Patch3: pcre-8.12-caseless_reference.patch
|
||||||
# New libtool to get rid of rpath
|
# New libtool to get rid of rpath
|
||||||
BuildRequires: autoconf, automake, libtool
|
BuildRequires: autoconf, automake, libtool
|
||||||
|
|
||||||
@ -44,6 +46,7 @@ Library for static linking for %{name}.
|
|||||||
libtoolize --copy --force && autoreconf
|
libtoolize --copy --force && autoreconf
|
||||||
%patch1 -p0 -b .manual_typos
|
%patch1 -p0 -b .manual_typos
|
||||||
%patch2 -p1 -b .terminated_typos
|
%patch2 -p1 -b .terminated_typos
|
||||||
|
%patch3 -p0 -b .caseless_reference
|
||||||
# One contributor's name is non-UTF-8
|
# One contributor's name is non-UTF-8
|
||||||
for F in ChangeLog; do
|
for F in ChangeLog; do
|
||||||
iconv -f latin1 -t utf8 "$F" >"${F}.utf8"
|
iconv -f latin1 -t utf8 "$F" >"${F}.utf8"
|
||||||
@ -103,6 +106,10 @@ make check
|
|||||||
%doc COPYING LICENCE
|
%doc COPYING LICENCE
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon May 09 2011 Petr Pisar <ppisar@redhat.com> - 8.12-4
|
||||||
|
- Fix caseless reference matching in UTF-8 mode when the upper/lower case
|
||||||
|
characters have different lengths (bug #702623)
|
||||||
|
|
||||||
* Mon May 09 2011 Petr Pisar <ppisar@redhat.com> - 8.12-3
|
* Mon May 09 2011 Petr Pisar <ppisar@redhat.com> - 8.12-3
|
||||||
- Fix typos in manual pages (bugs #675476, #675477)
|
- Fix typos in manual pages (bugs #675476, #675477)
|
||||||
- Clean spec file up
|
- Clean spec file up
|
||||||
|
Loading…
Reference in New Issue
Block a user