From 0c7d3bb99f72d66ec6ac63aee4c5fe6d683eee86 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 17 Jan 2021 12:53:48 -0500 Subject: [PATCH] Add missing array-enlargement logic to test_regex.c. The stanza to report a "partial" match could overrun the initially allocated output array, so it needs its own copy of the array-resizing logic that's in the main loop. I overlooked the need for this in ca8217c10. Per report from Alexander Lakhin. Discussion: https://postgr.es/m/3206aace-50db-e02a-bbea-76d5cdaa2cb6@gmail.com --- src/test/modules/test_regex/test_regex.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/modules/test_regex/test_regex.c b/src/test/modules/test_regex/test_regex.c index ad3c6d3b1a..095751cf04 100644 --- a/src/test/modules/test_regex/test_regex.c +++ b/src/test/modules/test_regex/test_regex.c @@ -555,6 +555,18 @@ setup_test_matches(text *orig_str, */ if (matchctx->nmatches == 0 && re_flags->partial && re_flags->indices) { + /* enlarge output space if needed */ + while (array_idx + matchctx->npatterns * 2 + 1 > array_len) + { + array_len += array_len + 1; /* 2^n-1 => 2^(n+1)-1 */ + if (array_len > MaxAllocSize / sizeof(int)) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("too many regular expression matches"))); + matchctx->match_locs = (int *) repalloc(matchctx->match_locs, + sizeof(int) * array_len); + } + matchctx->match_locs[array_idx++] = matchctx->details.rm_extend.rm_so; matchctx->match_locs[array_idx++] = matchctx->details.rm_extend.rm_eo; /* we don't have pmatch data, so emit -1 */ @@ -566,6 +578,8 @@ setup_test_matches(text *orig_str, matchctx->nmatches++; } + Assert(array_idx <= array_len); + if (eml > 1) { int64 maxsiz = eml * (int64) maxlen;