[Pcre-svn] [669] code/trunk: Check malloc returns in pcre2te…

Top Page
Delete this message
Author: Subversion repository
Date:  
To: pcre-svn
Subject: [Pcre-svn] [669] code/trunk: Check malloc returns in pcre2test.
Revision: 669
          http://www.exim.org/viewvc/pcre2?view=rev&revision=669
Author:   ph10
Date:     2017-02-23 17:05:43 +0000 (Thu, 23 Feb 2017)
Log Message:
-----------
Check malloc returns in pcre2test.


Modified Paths:
--------------
    code/trunk/ChangeLog
    code/trunk/configure.ac
    code/trunk/src/pcre2.h
    code/trunk/src/pcre2test.c
    code/trunk/testdata/testinput2
    code/trunk/testdata/testoutput2


Modified: code/trunk/ChangeLog
===================================================================
--- code/trunk/ChangeLog    2017-02-15 07:27:08 UTC (rev 668)
+++ code/trunk/ChangeLog    2017-02-23 17:05:43 UTC (rev 669)
@@ -2,6 +2,15 @@
 --------------------



+Version 10.24 14-February-2017
+------------------------------
+
+1. Hardened pcre2test so as to reduce the number of bugs reported by fuzzers:
+
+   (a) Check for malloc failures when getting memory for the ovector (POSIX) or 
+       the match data block (non-POSIX). 
+
+
 Version 10.23 14-February-2017
 ------------------------------



Modified: code/trunk/configure.ac
===================================================================
--- code/trunk/configure.ac    2017-02-15 07:27:08 UTC (rev 668)
+++ code/trunk/configure.ac    2017-02-23 17:05:43 UTC (rev 669)
@@ -9,9 +9,9 @@
 dnl be defined as -RC2, for example. For real releases, it should be empty.


m4_define(pcre2_major, [10])
-m4_define(pcre2_minor, [23])
-m4_define(pcre2_prerelease, [])
-m4_define(pcre2_date, [2017-02-14])
+m4_define(pcre2_minor, [24])
+m4_define(pcre2_prerelease, [-RC1])
+m4_define(pcre2_date, [2017-02-15])

# NOTE: The CMakeLists.txt file searches for the above variables in the first
# 50 lines of this file. Please update that if the variables above are moved.

Modified: code/trunk/src/pcre2.h
===================================================================
--- code/trunk/src/pcre2.h    2017-02-15 07:27:08 UTC (rev 668)
+++ code/trunk/src/pcre2.h    2017-02-23 17:05:43 UTC (rev 669)
@@ -42,9 +42,9 @@
 /* The current PCRE version information. */


 #define PCRE2_MAJOR          10
-#define PCRE2_MINOR          23
-#define PCRE2_PRERELEASE     
-#define PCRE2_DATE           2017-02-14
+#define PCRE2_MINOR          24
+#define PCRE2_PRERELEASE     -RC1
+#define PCRE2_DATE           2017-02-15


/* When an application links to a PCRE DLL in Windows, the symbols that are
imported have to be identified as such. When building PCRE2, the appropriate

Modified: code/trunk/src/pcre2test.c
===================================================================
--- code/trunk/src/pcre2test.c    2017-02-15 07:27:08 UTC (rev 668)
+++ code/trunk/src/pcre2test.c    2017-02-23 17:05:43 UTC (rev 669)
@@ -1365,9 +1365,8 @@
   (test_mode == PCRE8_MODE && G(x,8)->f r (y)) || \
   (test_mode == PCRE16_MODE && G(x,16)->f r (y)) || \
   (test_mode == PCRE32_MODE && G(x,32)->f r (y)))
+  


-
-
/* ----- Two out of three modes are supported ----- */

#else
@@ -1775,8 +1774,8 @@
#define TESTFLD(x,f,r,y) ( \
(test_mode == G(G(PCRE,BITONE),_MODE) && G(x,BITONE)->f r (y)) || \
(test_mode == G(G(PCRE,BITTWO),_MODE) && G(x,BITTWO)->f r (y)))
+

-
#endif /* Two out of three modes */

/* ----- End of cases where more than one mode is supported ----- */
@@ -6169,7 +6168,16 @@
if (msg[0] == 0) fprintf(outfile, "\n");

   if (dat_datctl.oveccount > 0)
+    { 
     pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * dat_datctl.oveccount);
+    if (pmatch == NULL)
+      {
+      fprintf(outfile, "** Failed to get memory for recording matching "
+        "information (size set = %du)\n", dat_datctl.oveccount);
+      return PR_OK;     
+      }     
+    }   
+ 
   if ((dat_datctl.options & PCRE2_NOTBOL) != 0) eflags |= REG_NOTBOL;
   if ((dat_datctl.options & PCRE2_NOTEOL) != 0) eflags |= REG_NOTEOL;
   if ((dat_datctl.options & PCRE2_NOTEMPTY) != 0) eflags |= REG_NOTEMPTY;
@@ -6305,6 +6313,14 @@
   PCRE2_MATCH_DATA_CREATE(match_data, max_oveccount, NULL);
   }


+if (CASTVAR(void *, match_data) == NULL)
+  {
+  fprintf(outfile, "** Failed to get memory for recording matching "
+    "information (size requested: %d)\n", dat_datctl.oveccount);
+  max_oveccount = 0;   
+  return PR_OK;     
+  }     
+
 /* Replacement processing is ignored for DFA matching. */


if (dat_datctl.replacement[0] != 0 && (dat_datctl.control & CTL_DFA) != 0)

Modified: code/trunk/testdata/testinput2
===================================================================
--- code/trunk/testdata/testinput2    2017-02-15 07:27:08 UTC (rev 668)
+++ code/trunk/testdata/testinput2    2017-02-23 17:05:43 UTC (rev 669)
@@ -4969,4 +4969,7 @@


/(?<a>a)(?<b>b)\g{b}\g{a}\g{a}\g{a}\g{a}(?<a>xx)(?<b>zz)/I,dupnames

+//
+    \=ovector=7777777777
+
 # End of testinput2 


Modified: code/trunk/testdata/testoutput2
===================================================================
--- code/trunk/testdata/testoutput2    2017-02-15 07:27:08 UTC (rev 668)
+++ code/trunk/testdata/testoutput2    2017-02-23 17:05:43 UTC (rev 669)
@@ -15479,6 +15479,10 @@
 Last code unit = 'z'
 Subject length lower bound = 11


+//
+    \=ovector=7777777777
+** Invalid value in 'ovector=7777777777'
+
 # End of testinput2 
 Error -63: PCRE2_ERROR_BADDATA (unknown error number)
 Error -62: bad serialized data