summaryrefslogtreecommitdiff
path: root/jbig2dec
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2020-03-12 00:27:13 +0800
committerSebastian Rasmussen <sebras@gmail.com>2020-03-20 20:49:02 +0800
commitf2613ed2159e8efc6b5b593e668a00d8bea9ace8 (patch)
tree7e90c590c281a6b0a4d9179fc72a3c45aaaca55b /jbig2dec
parentff53af0d4ff9291aa5039522f5553a2850dd569d (diff)
downloadghostpdl-f2613ed2159e8efc6b5b593e668a00d8bea9ace8.tar.gz
jbig2dec: Use uint32_t when counting segments.
Diffstat (limited to 'jbig2dec')
-rw-r--r--jbig2dec/jbig2.c11
-rw-r--r--jbig2dec/jbig2_priv.h6
2 files changed, 12 insertions, 5 deletions
diff --git a/jbig2dec/jbig2.c b/jbig2dec/jbig2.c
index 9fbb3400a..323ea29dd 100644
--- a/jbig2dec/jbig2.c
+++ b/jbig2dec/jbig2.c
@@ -322,9 +322,17 @@ jbig2_data_in(Jbig2Ctx *ctx, const unsigned char *data, size_t size)
return 0; /* need more data */
ctx->buf_rd_ix += header_size;
- if (ctx->n_segments == ctx->n_segments_max) {
+ if (ctx->n_segments >= ctx->n_segments_max) {
Jbig2Segment **segments;
+ if (ctx->n_segments_max == UINT32_MAX) {
+ ctx->state = JBIG2_FILE_EOF;
+ return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "too many segments in jbig2 image");
+ }
+ else if (ctx->n_segments_max > (UINT32_MAX >> 2)) {
+ ctx->n_segments_max = UINT32_MAX;
+ }
+
segments = jbig2_renew(ctx, ctx->segments, Jbig2Segment *, (ctx->n_segments_max <<= 2));
if (segments == NULL) {
ctx->state = JBIG2_FILE_EOF;
@@ -333,7 +341,6 @@ jbig2_data_in(Jbig2Ctx *ctx, const unsigned char *data, size_t size)
ctx->segments = segments;
}
-
ctx->segments[ctx->n_segments++] = segment;
if (ctx->state == JBIG2_FILE_RANDOM_HEADERS) {
if ((segment->flags & 63) == 51) /* end of file */
diff --git a/jbig2dec/jbig2_priv.h b/jbig2dec/jbig2_priv.h
index d4642086f..08cd35734 100644
--- a/jbig2dec/jbig2_priv.h
+++ b/jbig2dec/jbig2_priv.h
@@ -94,10 +94,10 @@ struct _Jbig2Ctx {
uint8_t file_header_flags;
uint32_t n_pages;
- int n_segments_max;
+ uint32_t n_segments_max;
Jbig2Segment **segments;
- int n_segments; /* index of last segment header parsed */
- int segment_index; /* index of last segment body parsed */
+ uint32_t n_segments; /* index of last segment header parsed */
+ uint32_t segment_index; /* index of last segment body parsed */
/* list of decoded pages, including the one in progress,
currently stored as a contiguous, 0-indexed array. */