Skip to content

Commit 8f44445

Browse files
authored
Merge pull request #706 from imazen/fix/mozjpeg-aliasing-ub
fix: eliminate mutable aliasing UB in mozjpeg decoder callbacks
2 parents cd5644e + 64ef472 commit 8f44445

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed

imageflow_core/src/codecs/mozjpeg_decoder.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -421,9 +421,9 @@ impl MzDec {
421421

422422
#[unsafe(no_mangle)]
423423
extern "C" fn source_fill_buffer(
424-
codec_info: &mut mozjpeg_sys::jpeg_decompress_struct,
424+
_codec_info: *mut mozjpeg_sys::jpeg_decompress_struct,
425425
custom_state: *mut c_void,
426-
suspend_io: &mut bool,
426+
_suspend_io: *mut bool,
427427
) -> bool {
428428
if custom_state.is_null() {
429429
return false;
@@ -470,7 +470,7 @@ impl MzDec {
470470

471471
#[unsafe(no_mangle)]
472472
extern "C" fn source_skip_bytes(
473-
codec_info: &mut mozjpeg_sys::jpeg_decompress_struct,
473+
_codec_info: *mut mozjpeg_sys::jpeg_decompress_struct,
474474
custom_state: *mut c_void,
475475
mut byte_count: c_long,
476476
) -> bool {
@@ -480,7 +480,7 @@ impl MzDec {
480480
if byte_count > 0 {
481481
// Re-derive decoder/source_manager references each iteration to avoid
482482
// holding &mut MzDec across the source_fill_buffer call (which also
483-
// derives &mut MzDec from custom_state, causing mutable aliasing UB).
483+
// derives &mut MzDec from custom_state).
484484
loop {
485485
let decoder = unsafe { &mut *(custom_state as *mut MzDec) };
486486
let source_manager = decoder.source_manager.as_deref_mut().unwrap();
@@ -492,7 +492,8 @@ impl MzDec {
492492
let _ = source_manager;
493493
let _ = decoder;
494494
let mut suspend = false;
495-
if !MzDec::source_fill_buffer(codec_info, custom_state, &mut suspend) {
495+
if !MzDec::source_fill_buffer(_codec_info, custom_state, &mut suspend as *mut bool)
496+
{
496497
let decoder = unsafe { &mut *(custom_state as *mut MzDec) };
497498
decoder.error = decoder.error.clone().map(|e| e.at(here!()));
498499
return false;

imageflow_core/src/ffi/c_interop.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ type WrapJpegErrorHandler = extern "C" fn(
8181
) -> bool;
8282

8383
type WrapJpegSourceManagerFunc =
84-
extern "C" fn(&mut mozjpeg_sys::jpeg_decompress_struct, *mut c_void) -> bool;
84+
extern "C" fn(*mut mozjpeg_sys::jpeg_decompress_struct, *mut c_void) -> bool;
8585
type WrapJpegSourceManagerFillBufferFunc =
86-
extern "C" fn(&mut mozjpeg_sys::jpeg_decompress_struct, *mut c_void, &mut bool) -> bool;
86+
extern "C" fn(*mut mozjpeg_sys::jpeg_decompress_struct, *mut c_void, *mut bool) -> bool;
8787
type WrapJpegSourceManagerSkipBytesFunc =
88-
extern "C" fn(&mut mozjpeg_sys::jpeg_decompress_struct, *mut c_void, c_long) -> bool;
88+
extern "C" fn(*mut mozjpeg_sys::jpeg_decompress_struct, *mut c_void, c_long) -> bool;
8989

9090
// typedef bool (*wrap_png_custom_read_function) (png_structp png_ptr, void * custom_state, uint8_t * buffer, size_t bytes_requested, size_t * out_bytes_read);
9191
type WrapPngCustomReadFunction =

0 commit comments

Comments
 (0)