aboutsummaryrefslogtreecommitdiff
path: root/src/test/modules/test_regex/test_regex.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2021-01-17 12:53:48 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2021-01-17 12:53:48 -0500
commit0c7d3bb99f72d66ec6ac63aee4c5fe6d683eee86 (patch)
treeb2542f545b3d2544efa1f5f9c48e57acc3cd2585 /src/test/modules/test_regex/test_regex.c
parentcf621d9d84db1e6edaff8ffa26bad93fdce5f830 (diff)
downloadpostgresql-0c7d3bb99f72d66ec6ac63aee4c5fe6d683eee86.tar.gz
postgresql-0c7d3bb99f72d66ec6ac63aee4c5fe6d683eee86.zip
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
Diffstat (limited to 'src/test/modules/test_regex/test_regex.c')
-rw-r--r--src/test/modules/test_regex/test_regex.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/test/modules/test_regex/test_regex.c b/src/test/modules/test_regex/test_regex.c
index ad3c6d3b1a6..095751cf04e 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;