wok-next diff mupdf/stuff/use_openjpeg_1.5.patch @ rev 19458
linux: CVE-2016-5195
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Oct 21 17:33:56 2016 +0200 (2016-10-21) |
parents | |
children | ae25e1ecf064 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/mupdf/stuff/use_openjpeg_1.5.patch Fri Oct 21 17:33:56 2016 +0200 1.3 @@ -0,0 +1,160 @@ 1.4 +commit a7341e98ef48d6041028b7294d1acc13665b04ba 1.5 +Author: Quoc-Viet Nguyen <afelion@gmail.com> 1.6 +Date: Fri Apr 18 23:48:29 2014 +1000 1.7 + 1.8 + Use openjpeg 1.5 rather than 2.0 1.9 +--- 1.10 + source/fitz/load-jpx.c | 104 +++++++++---------------------------------------- 1.11 + 1 file changed, 18 insertions(+), 86 deletions(-) 1.12 + 1.13 +diff --git a/source/fitz/load-jpx.c b/source/fitz/load-jpx.c 1.14 +index dfb89f4..d27b5de 100644 1.15 +--- a/source/fitz/load-jpx.c 1.16 ++++ b/source/fitz/load-jpx.c 1.17 +@@ -27,119 +27,51 @@ static void fz_opj_info_callback(const char *msg, void *client_data) 1.18 + /* fz_warn("openjpeg info: %s", msg); */ 1.19 + } 1.20 + 1.21 +-typedef struct stream_block_s 1.22 +-{ 1.23 +- unsigned char *data; 1.24 +- int size; 1.25 +- int pos; 1.26 +-} stream_block; 1.27 +- 1.28 +-static OPJ_SIZE_T fz_opj_stream_read(void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) 1.29 +-{ 1.30 +- stream_block *sb = (stream_block *)p_user_data; 1.31 +- int len; 1.32 +- 1.33 +- len = sb->size - sb->pos; 1.34 +- if (len < 0) 1.35 +- len = 0; 1.36 +- if (len == 0) 1.37 +- return (OPJ_SIZE_T)-1; /* End of file! */ 1.38 +- if ((OPJ_SIZE_T)len > p_nb_bytes) 1.39 +- len = p_nb_bytes; 1.40 +- memcpy(p_buffer, sb->data + sb->pos, len); 1.41 +- sb->pos += len; 1.42 +- return len; 1.43 +-} 1.44 +- 1.45 +-static OPJ_OFF_T fz_opj_stream_skip(OPJ_OFF_T skip, void * p_user_data) 1.46 +-{ 1.47 +- stream_block *sb = (stream_block *)p_user_data; 1.48 +- 1.49 +- if (skip > sb->size - sb->pos) 1.50 +- skip = sb->size - sb->pos; 1.51 +- sb->pos += skip; 1.52 +- return sb->pos; 1.53 +-} 1.54 +- 1.55 +-static OPJ_BOOL fz_opj_stream_seek(OPJ_OFF_T seek_pos, void * p_user_data) 1.56 +-{ 1.57 +- stream_block *sb = (stream_block *)p_user_data; 1.58 +- 1.59 +- if (seek_pos > sb->size) 1.60 +- return OPJ_FALSE; 1.61 +- sb->pos = seek_pos; 1.62 +- return OPJ_TRUE; 1.63 +-} 1.64 +- 1.65 + fz_pixmap * 1.66 + fz_load_jpx(fz_context *ctx, unsigned char *data, int size, fz_colorspace *defcs, int indexed) 1.67 + { 1.68 + fz_pixmap *img; 1.69 + fz_colorspace *origcs; 1.70 ++ opj_event_mgr_t evtmgr; 1.71 + opj_dparameters_t params; 1.72 +- opj_codec_t *codec; 1.73 ++ opj_dinfo_t *codec; 1.74 + opj_image_t *jpx; 1.75 +- opj_stream_t *stream; 1.76 ++ opj_cio_t *stream; 1.77 + fz_colorspace *colorspace; 1.78 + unsigned char *p; 1.79 + OPJ_CODEC_FORMAT format; 1.80 + int a, n, w, h, depth, sgnd; 1.81 + int x, y, k, v; 1.82 +- stream_block sb; 1.83 + 1.84 + if (size < 2) 1.85 + fz_throw(ctx, FZ_ERROR_GENERIC, "not enough data to determine image format"); 1.86 + 1.87 + /* Check for SOC marker -- if found we have a bare J2K stream */ 1.88 + if (data[0] == 0xFF && data[1] == 0x4F) 1.89 +- format = OPJ_CODEC_J2K; 1.90 ++ format = CODEC_J2K; 1.91 + else 1.92 +- format = OPJ_CODEC_JP2; 1.93 ++ format = CODEC_JP2; 1.94 ++ 1.95 ++ memset(&evtmgr, 0, sizeof(evtmgr)); 1.96 ++ evtmgr.error_handler = fz_opj_error_callback; 1.97 ++ evtmgr.warning_handler = fz_opj_warning_callback; 1.98 ++ evtmgr.info_handler = fz_opj_info_callback; 1.99 + 1.100 + opj_set_default_decoder_parameters(¶ms); 1.101 + if (indexed) 1.102 + params.flags |= OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; 1.103 + 1.104 + codec = opj_create_decompress(format); 1.105 +- opj_set_info_handler(codec, fz_opj_info_callback, ctx); 1.106 +- opj_set_warning_handler(codec, fz_opj_warning_callback, ctx); 1.107 +- opj_set_error_handler(codec, fz_opj_error_callback, ctx); 1.108 +- if (!opj_setup_decoder(codec, ¶ms)) 1.109 +- { 1.110 +- fz_throw(ctx, FZ_ERROR_GENERIC, "j2k decode failed"); 1.111 +- } 1.112 +- 1.113 +- stream = opj_stream_default_create(OPJ_TRUE); 1.114 +- sb.data = data; 1.115 +- sb.pos = 0; 1.116 +- sb.size = size; 1.117 ++ opj_set_event_mgr((opj_common_ptr)codec, &evtmgr, ctx); 1.118 ++ opj_setup_decoder(codec, ¶ms); 1.119 + 1.120 +- opj_stream_set_read_function(stream, fz_opj_stream_read); 1.121 +- opj_stream_set_skip_function(stream, fz_opj_stream_skip); 1.122 +- opj_stream_set_seek_function(stream, fz_opj_stream_seek); 1.123 +- opj_stream_set_user_data(stream, &sb); 1.124 +- /* Set the length to avoid an assert */ 1.125 +- opj_stream_set_user_data_length(stream, size); 1.126 ++ stream = opj_cio_open((opj_common_ptr)codec, data, size); 1.127 + 1.128 +- if (!opj_read_header(stream, codec, &jpx)) 1.129 +- { 1.130 +- opj_stream_destroy(stream); 1.131 +- opj_destroy_codec(codec); 1.132 +- fz_throw(ctx, FZ_ERROR_GENERIC, "Failed to read JPX header"); 1.133 +- } 1.134 +- 1.135 +- if (!opj_decode(codec, stream, jpx)) 1.136 +- { 1.137 +- opj_stream_destroy(stream); 1.138 +- opj_destroy_codec(codec); 1.139 +- opj_image_destroy(jpx); 1.140 +- fz_throw(ctx, FZ_ERROR_GENERIC, "Failed to decode JPX image"); 1.141 +- } 1.142 ++ jpx = opj_decode(codec, stream); 1.143 + 1.144 +- opj_stream_destroy(stream); 1.145 +- opj_destroy_codec(codec); 1.146 ++ opj_cio_close(stream); 1.147 ++ opj_destroy_decompress(codec); 1.148 + 1.149 +- /* jpx should never be NULL here, but check anyway */ 1.150 + if (!jpx) 1.151 + fz_throw(ctx, FZ_ERROR_GENERIC, "opj_decode failed"); 1.152 + 1.153 +@@ -173,8 +105,8 @@ fz_load_jpx(fz_context *ctx, unsigned char *data, int size, fz_colorspace *defcs 1.154 + depth = jpx->comps[0].prec; 1.155 + sgnd = jpx->comps[0].sgnd; 1.156 + 1.157 +- if (jpx->color_space == OPJ_CLRSPC_SRGB && n == 4) { n = 3; a = 1; } 1.158 +- else if (jpx->color_space == OPJ_CLRSPC_SYCC && n == 4) { n = 3; a = 1; } 1.159 ++ if (jpx->color_space == CLRSPC_SRGB && n == 4) { n = 3; a = 1; } 1.160 ++ else if (jpx->color_space == CLRSPC_SYCC && n == 4) { n = 3; a = 1; } 1.161 + else if (n == 2) { n = 1; a = 1; } 1.162 + else if (n > 4) { n = 4; a = 1; } 1.163 + else { a = 0; }