Skip to content

Commit 69d6b24

Browse files
committed
Fix minor memory check bug in pcre2test
1 parent fa5ec50 commit 69d6b24

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ milliseconds to microseconds. This is more useful for modern CPUs.
3333
7. Applied PR #193, which makes the requirement for C99 explicit in
3434
configure.ac and CMakeLists.txt.
3535

36+
8. Fixed a bug in pcre2test when a ridiculously large string repeat required a
37+
stupid amount of memory. It now gives a clean realloc() failure error.
38+
3639

3740
Version 10.42 11-December-2022
3841
------------------------------

src/pcre2test.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6839,11 +6839,15 @@ extended if replication is involved). */
68396839
needlen = (size_t)((len+1) * code_unit_size);
68406840
if (dbuffer == NULL || needlen >= dbuffer_size)
68416841
{
6842-
while (needlen >= dbuffer_size) dbuffer_size *= 2;
6842+
while (needlen >= dbuffer_size)
6843+
{
6844+
if (dbuffer_size < SIZE_MAX/2) dbuffer_size *= 2;
6845+
else dbuffer_size = needlen + 1;
6846+
}
68436847
dbuffer = (uint8_t *)realloc(dbuffer, dbuffer_size);
68446848
if (dbuffer == NULL)
68456849
{
6846-
fprintf(stderr, "pcre2test: realloc(%d) failed\n", (int)dbuffer_size);
6850+
fprintf(stderr, "pcre2test: realloc(%" SIZ_FORM ") failed\n", dbuffer_size);
68476851
exit(1);
68486852
}
68496853
}
@@ -6900,11 +6904,16 @@ while ((c = *p++) != 0)
69006904
{
69016905
size_t qoffset = CAST8VAR(q) - dbuffer;
69026906
size_t rep_offset = start_rep - dbuffer;
6903-
while (needlen >= dbuffer_size) dbuffer_size *= 2;
6907+
while (needlen >= dbuffer_size)
6908+
{
6909+
if (dbuffer_size < SIZE_MAX/2) dbuffer_size *= 2;
6910+
else dbuffer_size = needlen + 1;
6911+
}
69046912
dbuffer = (uint8_t *)realloc(dbuffer, dbuffer_size);
69056913
if (dbuffer == NULL)
69066914
{
6907-
fprintf(stderr, "pcre2test: realloc(%d) failed\n", (int)dbuffer_size);
6915+
fprintf(stderr, "pcre2test: realloc(%" SIZ_FORM ") failed\n",
6916+
dbuffer_size);
69086917
exit(1);
69096918
}
69106919
SETCASTPTR(q, dbuffer + qoffset);

0 commit comments

Comments
 (0)