[Pcre-svn] [1169] code/trunk/src: Mend bug introduced in pre…

Top Page
Delete this message
Author: Subversion repository
Date:  
To: pcre-svn
Subject: [Pcre-svn] [1169] code/trunk/src: Mend bug introduced in previous patch.
Revision: 1169
          http://www.exim.org/viewvc/pcre2?view=rev&revision=1169
Author:   ph10
Date:     2019-09-10 14:22:08 +0100 (Tue, 10 Sep 2019)
Log Message:
-----------
Mend bug introduced in previous patch. Fixes crash detected by ClusterFuzz 
17101.


Modified Paths:
--------------
    code/trunk/src/pcre2_compile.c
    code/trunk/src/pcre2_intmodedep.h


Modified: code/trunk/src/pcre2_compile.c
===================================================================
--- code/trunk/src/pcre2_compile.c    2019-09-09 17:00:19 UTC (rev 1168)
+++ code/trunk/src/pcre2_compile.c    2019-09-10 13:22:08 UTC (rev 1169)
@@ -5585,7 +5585,7 @@
     they are case partners. This can be optimized to generate a caseless single
     character match (which also sets first/required code units if relevant). */


-    if (meta == META_CLASS && pptr[1] < META_END && pptr[2] < META_END && 
+    if (meta == META_CLASS && pptr[1] < META_END && pptr[2] < META_END &&
         pptr[3] == META_CLASS_END)
       {
       uint32_t c = pptr[1];
@@ -5594,10 +5594,18 @@
       if (UCD_CASESET(c) == 0)
 #endif
         {
-        uint32_t d = TABLE_GET(c, cb->fcc, c);
+        uint32_t d;
+        
 #ifdef SUPPORT_UNICODE
-        if (utf && c > 127) d = UCD_OTHERCASE(c);
+        if (utf && c > 127) d = UCD_OTHERCASE(c); else
 #endif
+          {
+#if PCRE2_CODE_UNIT_WIDTH != 8
+          if (c > 255) d = c; else
+#endif 
+          d = TABLE_GET(c, cb->fcc, c);
+          }  
+
         if (c != d && pptr[2] == d)
           {
           pptr += 3;                 /* Move on to class end */
@@ -5607,7 +5615,7 @@
             reset_caseful = TRUE;
             options |= PCRE2_CASELESS;
             req_caseopt = REQ_CASELESS;
-            } 
+            }
           goto CLASS_CASELESS_CHAR;
           }
         }
@@ -7892,7 +7900,7 @@
       zeroreqcuflags = reqcuflags;


       /* If the character is more than one code unit long, we can set a single
-      firstcu only if it is not to be matched caselessly. Multiple possible 
+      firstcu only if it is not to be matched caselessly. Multiple possible
       starting code units may be picked up later in the studying code. */


       if (mclength == 1 || req_caseopt == 0)


Modified: code/trunk/src/pcre2_intmodedep.h
===================================================================
--- code/trunk/src/pcre2_intmodedep.h    2019-09-09 17:00:19 UTC (rev 1168)
+++ code/trunk/src/pcre2_intmodedep.h    2019-09-10 13:22:08 UTC (rev 1169)
@@ -205,12 +205,13 @@
 The CHMAX_255 macro does not assume one code unit. The maximum length of a MARK
 name must fit in one code unit; currently it is set to 255 or 65535. The
 TABLE_GET macro is used to access elements of tables containing exactly 256
-items. When code points can be greater than 255, a check is needed before
-accessing these tables. */
+items. Its argument is a code unit. When code points can be greater than 255, a
+check is needed before accessing these tables. */


#if PCRE2_CODE_UNIT_WIDTH == 8
#define MAX_255(c) TRUE
#define MAX_MARK ((1u << 8) - 1)
+#define TABLE_GET(c, table, default) ((table)[c])
#ifdef SUPPORT_UNICODE
#define SUPPORT_WIDE_CHARS
#define CHMAX_255(c) ((c) <= 255u)
@@ -217,7 +218,6 @@
#else
#define CHMAX_255(c) TRUE
#endif /* SUPPORT_UNICODE */
-#define TABLE_GET(c, table, default) ((table)[c])

#else /* Code units are 16 or 32 bits */
#define CHMAX_255(c) ((c) <= 255u)
@@ -228,7 +228,6 @@
#endif


-
/* ----------------- Character-handling macros ----------------- */

/* There is a proposed future special "UTF-21" mode, in which only the lowest