--- CV/CV.xs 2017/12/27 17:48:16 1.56 +++ CV/CV.xs 2018/07/30 22:55:46 1.57 @@ -215,20 +215,26 @@ static boolean cv_ms_fill (j_decompress_ptr cinfo) { - ERREXIT (cinfo, JERR_INPUT_EMPTY); + // unexpected EOF, warn and generate fake EOI marker + + WARNMS (cinfo, JWRN_JPEG_EOF); + + struct jpeg_source_mgr *src = (struct jpeg_source_mgr *)cinfo->src; + + static const JOCTET eoi[] = { 0xFF, JPEG_EOI }; + + src->next_input_byte = eoi; + src->bytes_in_buffer = sizeof (eoi); return TRUE; } static void cv_ms_skip (j_decompress_ptr cinfo, long num_bytes) { - if (num_bytes > 0) - { - struct jpeg_source_mgr *src = (struct jpeg_source_mgr *)cinfo->src; - - src->next_input_byte += num_bytes; - src->bytes_in_buffer -= num_bytes; - } + struct jpeg_source_mgr *src = (struct jpeg_source_mgr *)cinfo->src; + + src->next_input_byte += num_bytes; + src->bytes_in_buffer -= num_bytes; } static void cv_jpeg_mem_src (j_decompress_ptr cinfo, void *buf, size_t buflen) @@ -523,6 +529,9 @@ XSRETURN_UNDEF; } + if (!data_len) + longjmp (jerr.setjmp_buffer, 4); + jpeg_create_decompress (&cinfo); cv_jpeg_mem_src (&cinfo, data, data_len);