The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

a/util: Don't crash on libjpeg conversions

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2482>

authored by

Beyley Cardellio and committed by
Marge Bot
9d1f8d00 15fd4a2d

+36 -3
+36 -3
src/xrt/auxiliary/util/u_sink_converter.c
··· 292 292 */ 293 293 294 294 #ifdef XRT_HAVE_JPEG 295 + 296 + #include <setjmp.h> 297 + 298 + struct jpeg_decoder_err 299 + { 300 + struct jpeg_error_mgr base; 301 + 302 + char error_msg[JMSG_LENGTH_MAX]; 303 + jmp_buf setjmp_buffer; 304 + }; 305 + 306 + METHODDEF(void) handle_jpeg_error(j_common_ptr cinfo) 307 + { 308 + struct jpeg_decoder_err *err_mgr = (struct jpeg_decoder_err *)cinfo->err; 309 + 310 + (*(cinfo->err->format_message))(cinfo, err_mgr->error_msg); 311 + U_LOG_E("JPEG decode error: %s", err_mgr->error_msg); 312 + 313 + // Jump to the setjmp point if we get an error 314 + longjmp(err_mgr->setjmp_buffer, 1); 315 + } 316 + 295 317 static bool 296 318 check_header(size_t size, const uint8_t *data) 297 319 { ··· 318 340 } 319 341 320 342 struct jpeg_decompress_struct cinfo = {0}; 321 - struct jpeg_error_mgr jerr = {0}; 343 + struct jpeg_decoder_err jerr = {0}; 322 344 323 - cinfo.err = jpeg_std_error(&jerr); 324 - jerr.trace_level = 0; 345 + cinfo.err = jpeg_std_error(&jerr.base); 346 + jerr.base.trace_level = 0; 347 + jerr.base.error_exit = handle_jpeg_error; 325 348 326 349 jpeg_create_decompress(&cinfo); 350 + 351 + // If an error occurs, it will longjmp back here, indicating failure 352 + if (setjmp(jerr.setjmp_buffer)) { 353 + goto fail; 354 + } 355 + 327 356 jpeg_mem_src(&cinfo, data, size); 328 357 329 358 int ret = jpeg_read_header(&cinfo, TRUE); ··· 359 388 jpeg_destroy_decompress(&cinfo); 360 389 361 390 return true; 391 + fail: 392 + jpeg_abort_decompress(&cinfo); 393 + return false; 362 394 } 363 395 #endif 364 396 ··· 498 530 if (!create_frame_with_format(xf, XRT_FORMAT_L8, &converted)) { 499 531 return; 500 532 } 533 + 501 534 if (!from_MJPEG_to_frame(converted, xf->size, xf->data)) { 502 535 // Make sure to free frame when we fail to decode. 503 536 xrt_frame_reference(&converted, NULL);