summaryrefslogtreecommitdiff
path: root/jbig2dec
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2021-08-01 20:07:14 +0200
committerSebastian Rasmussen <sebras@gmail.com>2021-08-09 17:36:17 +0200
commitd718fe7384c02f8715ba6eb5eaf6ae4ded552346 (patch)
tree097a0a4524a2b417725172df2dcec7e10ace6843 /jbig2dec
parent61fa8918ef80fc8d445b547dd1d784aeee32366c (diff)
downloadghostpdl-d718fe7384c02f8715ba6eb5eaf6ae4ded552346.tar.gz
jbig2dec: Improve reporting from custom allocator that limits memory use.
Diffstat (limited to 'jbig2dec')
-rw-r--r--jbig2dec/jbig2dec.c65
1 files changed, 45 insertions, 20 deletions
diff --git a/jbig2dec/jbig2dec.c b/jbig2dec/jbig2dec.c
index 3996e5b17..dc1fd560d 100644
--- a/jbig2dec/jbig2dec.c
+++ b/jbig2dec/jbig2dec.c
@@ -91,6 +91,47 @@ static int print_usage(void);
#define KBYTE 1024
#define MBYTE (1024 * KBYTE)
+static void *jbig2dec_reached_limit(jbig2dec_allocator_t *allocator, size_t oldsize, size_t size)
+{
+ size_t limit_mb = allocator->memory_limit / MBYTE;
+ size_t used_mb = allocator->memory_used / MBYTE;
+ size_t oldsize_mb = oldsize / MBYTE;
+ size_t size_mb = size / MBYTE;
+
+ if (oldsize == 0)
+ jbig2_error(allocator->ctx, JBIG2_SEVERITY_FATAL, -1, "memory: limit reached: limit: %zu (%zu Mbyte) used: %zu (%zu Mbyte) allocation: %zu (%zu Mbyte)",
+ allocator->memory_limit, limit_mb,
+ allocator->memory_used, used_mb,
+ size, size_mb);
+ else
+ jbig2_error(allocator->ctx, JBIG2_SEVERITY_FATAL, -1, "memory: limit reached: limit: %zu (%zu Mbyte) used: %zu (%zu Mbyte) reallocation: %zu (%zu Mbyte) -> %zu (%zu Mbyte)",
+ allocator->memory_limit, limit_mb,
+ allocator->memory_used, used_mb,
+ oldsize, oldsize_mb,
+ size, size_mb);
+
+ return NULL;
+}
+
+static void jbig2dec_peak(jbig2dec_allocator_t *allocator)
+{
+ size_t limit_mb = allocator->memory_limit / MBYTE;
+ size_t peak_mb = allocator->memory_peak / MBYTE;
+ size_t used_mb = allocator->memory_used / MBYTE;
+
+ if (allocator->ctx == NULL)
+ return;
+ if (used_mb <= peak_mb)
+ return;
+
+ allocator->memory_peak = allocator->memory_used;
+
+ jbig2_error(allocator->ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, "memory: limit: %lu %sbyte used: %lu %sbyte, peak: %lu %sbyte",
+ limit_mb > 0 ? limit_mb : allocator->memory_limit, limit_mb > 0 ? "M" : "",
+ used_mb > 0 ? used_mb : allocator->memory_used, used_mb > 0 ? "M" : "",
+ peak_mb > 0 ? peak_mb : allocator->memory_peak, peak_mb > 0 ? "M" : "");
+}
+
static void *jbig2dec_alloc(Jbig2Allocator *allocator_, size_t size)
{
jbig2dec_allocator_t *allocator = (jbig2dec_allocator_t *) allocator_;
@@ -102,7 +143,7 @@ static void *jbig2dec_alloc(Jbig2Allocator *allocator_, size_t size)
return NULL;
if (size + ALIGNMENT > allocator->memory_limit - allocator->memory_used)
- return NULL;
+ return jbig2dec_reached_limit(allocator, 0, size + ALIGNMENT);
ptr = malloc(size + ALIGNMENT);
if (ptr == NULL)
@@ -110,15 +151,7 @@ static void *jbig2dec_alloc(Jbig2Allocator *allocator_, size_t size)
memcpy(ptr, &size, sizeof(size));
allocator->memory_used += size + ALIGNMENT;
- if (allocator->memory_used > allocator->memory_peak) {
- allocator->memory_peak = allocator->memory_used;
-
- if (allocator->ctx) {
- size_t limit_mb = allocator->memory_limit / MBYTE;
- size_t peak_mb = allocator->memory_peak / MBYTE;
- jbig2_error(allocator->ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, "memory: limit: %lu Mbyte peak usage: %lu Mbyte", limit_mb, peak_mb);
- }
- }
+ jbig2dec_peak(allocator);
return (unsigned char *) ptr + ALIGNMENT;
}
@@ -158,7 +191,7 @@ static void *jbig2dec_realloc(Jbig2Allocator *allocator_, void *p, size_t size)
memcpy(&oldsize, oldp, sizeof(oldsize));
if (size + ALIGNMENT > allocator->memory_limit - allocator->memory_used + oldsize + ALIGNMENT)
- return NULL;
+ return jbig2dec_reached_limit(allocator, oldsize + ALIGNMENT, size + ALIGNMENT);
p = realloc(oldp, size + ALIGNMENT);
if (p == NULL)
@@ -168,15 +201,7 @@ static void *jbig2dec_realloc(Jbig2Allocator *allocator_, void *p, size_t size)
memcpy(p, &size, sizeof(size));
allocator->memory_used += size + ALIGNMENT;
- if (allocator->memory_used > allocator->memory_peak) {
- allocator->memory_peak = allocator->memory_used;
-
- if (allocator->ctx) {
- size_t limit_mb = allocator->memory_limit / MBYTE;
- size_t peak_mb = allocator->memory_peak / MBYTE;
- jbig2_error(allocator->ctx, JBIG2_SEVERITY_DEBUG, JBIG2_UNKNOWN_SEGMENT_NUMBER, "memory: limit: %lu Mbyte peak usage: %lu Mbyte", limit_mb, peak_mb);
- }
- }
+ jbig2dec_peak(allocator);
return (unsigned char *) p + ALIGNMENT;
}