diff options
Diffstat (limited to 'base/sdctd.c')
-rw-r--r-- | base/sdctd.c | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/base/sdctd.c b/base/sdctd.c index ec54a9e2..635aa6fc 100644 --- a/base/sdctd.c +++ b/base/sdctd.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2020 Artifex Software, Inc. +/* Copyright (C) 2001-2021 Artifex Software, Inc. All Rights Reserved. This software is provided AS-IS with no warranty, either express or @@ -239,8 +239,10 @@ s_DCTD_process(stream_state * st, stream_cursor_read * pr, u.c = pr->ptr+1; update_jpeg_header_height(u.u, src->bytes_in_buffer, ss->data.common->Height); } - if ((code = gs_jpeg_read_header(ss, TRUE)) < 0) - return ERRC; + if ((code = gs_jpeg_read_header(ss, TRUE)) < 0) { + code = ERRC; + goto error_out; + } pr->ptr = (jddp->faked_eoi ? pr->limit : src->next_input_byte - 1); switch (code) { @@ -251,7 +253,7 @@ s_DCTD_process(stream_state * st, stream_cursor_read * pr, /*case JPEG_HEADER_OK: */ } - /* + /* * Default the color transform if not set and check for * the Adobe marker and use Adobe's transform if the * marker is set. @@ -262,10 +264,10 @@ s_DCTD_process(stream_state * st, stream_cursor_read * pr, else ss->ColorTransform = 0; } - + if (jddp->dinfo.saw_Adobe_marker) ss->ColorTransform = jddp->dinfo.Adobe_transform; - + switch (jddp->dinfo.num_components) { case 3: jddp->dinfo.jpeg_color_space = @@ -281,8 +283,10 @@ s_DCTD_process(stream_state * st, stream_cursor_read * pr, ss->phase = 2; /* falls through */ case 2: /* start_decompress */ - if ((code = gs_jpeg_start_decompress(ss)) < 0) - return ERRC; + if ((code = gs_jpeg_start_decompress(ss)) < 0) { + code = ERRC; + goto error_out; + } pr->ptr = (jddp->faked_eoi ? pr->limit : src->next_input_byte - 1); if (code == 0) { @@ -302,8 +306,10 @@ s_DCTD_process(stream_state * st, stream_cursor_read * pr, gs_alloc_bytes_immovable(gs_memory_stable(jddp->memory), ss->scan_line_size, "s_DCTD_process(scanline_buffer)"); - if (jddp->scanline_buffer == NULL) - return ERRC; + if (jddp->scanline_buffer == NULL) { + code = ERRC; + goto error_out; + } } jddp->bytes_in_scanline = 0; ss->phase = 3; @@ -357,8 +363,10 @@ s_DCTD_process(stream_state * st, stream_cursor_read * pr, samples = pw->ptr + 1; } read = gs_jpeg_read_scanlines(ss, &samples, 1); - if (read < 0) - return ERRC; + if (read < 0) { + code = ERRC; + goto error_out; + } if_debug3m('w', ss->memory, "[wdd]read returns %d, used=%u, faked_eoi=%d\n", read, (uint) (src->next_input_byte - 1 - pr->ptr), @@ -380,8 +388,10 @@ s_DCTD_process(stream_state * st, stream_cursor_read * pr, * buffer can be grown as required. */ if ((src->next_input_byte-1 == pr->ptr) && (pr->limit - pr->ptr >= ss->templat->min_in_size) && - (compact_jpeg_buffer(pr) == 0)) - return ERRC; + (compact_jpeg_buffer(pr) == 0)) { + code = ERRC; + goto error_out; + } if (jddp->PassThrough && jddp->PassThroughfn) { (jddp->PassThroughfn)(jddp->device, Buf, pr->ptr - (Buf - 1)); } @@ -398,8 +408,10 @@ s_DCTD_process(stream_state * st, stream_cursor_read * pr, case 4: /* end of image; scan for EOI */ if (jddp->PassThrough && jddp->PassThroughfn) (jddp->PassThroughfn)(jddp->device, Buf, pr->ptr - (Buf - 1)); - if ((code = gs_jpeg_finish_decompress(ss)) < 0) - return ERRC; + if ((code = gs_jpeg_finish_decompress(ss)) < 0) { + code = ERRC; + goto error_out; + } pr->ptr = (jddp->faked_eoi ? pr->limit : src->next_input_byte - 1); if (code == 0) @@ -411,6 +423,10 @@ s_DCTD_process(stream_state * st, stream_cursor_read * pr, } /* Default case can't happen.... */ return ERRC; + +error_out: + stream_dct_end_passthrough(jddp); + return code; } /* Stream template */ |