Module Name:    src
Committed By:   rin
Date:           Sun Nov 19 13:22:58 UTC 2017

Modified Files:
        src/external/bsd/tre/dist/lib: tre-match-approx.c tre-match-parallel.c
            tre-match-utils.h

Log Message:
Fix memory leak when input contains illegal multibyte sequence, partially
taken from musl libc:
https://git.musl-libc.org/cgit/musl/commit/src/regex/regexec.c?id=546f6b322bcafa2452925c19f9607d9689c75f95


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/external/bsd/tre/dist/lib/tre-match-approx.c \
    src/external/bsd/tre/dist/lib/tre-match-parallel.c \
    src/external/bsd/tre/dist/lib/tre-match-utils.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/tre/dist/lib/tre-match-approx.c
diff -u src/external/bsd/tre/dist/lib/tre-match-approx.c:1.3 src/external/bsd/tre/dist/lib/tre-match-approx.c:1.4
--- src/external/bsd/tre/dist/lib/tre-match-approx.c:1.3	Fri Nov 17 16:14:30 2017
+++ src/external/bsd/tre/dist/lib/tre-match-approx.c	Sun Nov 19 13:22:58 2017
@@ -225,6 +225,8 @@ tre_tnfa_run_approx(const tre_tnfa_t *tn
 
   size_t i, id;
 
+  reg_errcode_t ret;
+
   if (!match_tags)
     num_tags = 0;
   else
@@ -781,16 +783,17 @@ tre_tnfa_run_approx(const tre_tnfa_t *tn
   DPRINT(("match end offset = %d, match cost = %d\n", match_eo,
 	  match_costs[TRE_M_COST]));
 
-#ifndef TRE_USE_ALLOCA
-  if (buf)
-    xfree(buf);
-#endif /* !TRE_USE_ALLOCA */
-
   match->cost = match_costs[TRE_M_COST];
   match->num_ins = match_costs[TRE_M_NUM_INS];
   match->num_del = match_costs[TRE_M_NUM_DEL];
   match->num_subst = match_costs[TRE_M_NUM_SUBST];
   *match_end_ofs = match_eo;
 
-  return match_eo >= 0 ? REG_OK : REG_NOMATCH;
+  ret = match_eo >= 0 ? REG_OK : REG_NOMATCH;
+error_exit:
+#ifndef TRE_USE_ALLOCA
+  if (buf)
+    xfree(buf);
+#endif /* !TRE_USE_ALLOCA */
+  return ret;
 }
Index: src/external/bsd/tre/dist/lib/tre-match-parallel.c
diff -u src/external/bsd/tre/dist/lib/tre-match-parallel.c:1.3 src/external/bsd/tre/dist/lib/tre-match-parallel.c:1.4
--- src/external/bsd/tre/dist/lib/tre-match-parallel.c:1.3	Fri Nov 17 16:14:30 2017
+++ src/external/bsd/tre/dist/lib/tre-match-parallel.c	Sun Nov 19 13:22:58 2017
@@ -121,6 +121,7 @@ tre_tnfa_run_parallel(const tre_tnfa_t *
   int new_match = 0;
   int *tmp_tags = NULL;
   int *tmp_iptr;
+  reg_errcode_t ret;
 
 #ifdef TRE_MBSTATE
   memset(&mbstate, '\0', sizeof(mbstate));
@@ -474,13 +475,14 @@ tre_tnfa_run_parallel(const tre_tnfa_t *
 
   DPRINT(("match end offset = %d\n", match_eo));
 
+  *match_end_ofs = match_eo;
+  ret = match_eo >= 0 ? REG_OK : REG_NOMATCH;
+error_exit:
 #ifndef TRE_USE_ALLOCA
   if (buf)
     xfree(buf);
 #endif /* !TRE_USE_ALLOCA */
-
-  *match_end_ofs = match_eo;
-  return match_eo >= 0 ? REG_OK : REG_NOMATCH;
+  return ret;
 }
 
 /* EOF */
Index: src/external/bsd/tre/dist/lib/tre-match-utils.h
diff -u src/external/bsd/tre/dist/lib/tre-match-utils.h:1.3 src/external/bsd/tre/dist/lib/tre-match-utils.h:1.4
--- src/external/bsd/tre/dist/lib/tre-match-utils.h:1.3	Fri Nov 17 16:14:30 2017
+++ src/external/bsd/tre/dist/lib/tre-match-utils.h	Sun Nov 19 13:22:58 2017
@@ -52,8 +52,10 @@
 	    else							      \
 	      {								      \
 		w = tre_mbrtowc(&next_c, str_byte, (size_t)max, &mbstate);    \
-		if (w == (size_t)-1 || w == (size_t)-2)			      \
-		  return REG_NOMATCH;					      \
+		if (w == (size_t)-1 || w == (size_t)-2) {		      \
+		  ret = REG_NOMATCH;					      \
+		  goto error_exit;					      \
+		}							      \
 		if (w == 0 && len >= 0)					      \
 		  {							      \
 		    pos_add_next = 1;					      \

Reply via email to