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; \