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