This patch is incomplete because the UBSAN error in libavcodec/tests/jpeg2000dwt.c has not been fixed. I will send the v2 patch soon.
> On Nov 11, 2024, at 17:34, WATANABE Osamu <owata...@es.takushoku-u.ac.jp> > wrote: > > This patch fixes undefined behaviour error in left shift > operations in jpeg2000dec.c and jpeg2000htdec.c. > > Signed-off-by: Osamu Watanabe <owata...@es.takushoku-u.ac.jp> > --- > libavcodec/jpeg2000dec.c | 6 +++--- > libavcodec/jpeg2000htdec.c | 6 +++--- > 2 files changed, 6 insertions(+), 6 deletions(-) > > diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c > index c9d8b025b1..8054129589 100644 > --- a/libavcodec/jpeg2000dec.c > +++ b/libavcodec/jpeg2000dec.c > @@ -1886,10 +1886,10 @@ static void decode_sigpass(Jpeg2000T1Context *t1, int > width, int height, > if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + > ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, > bandno))) { > int xorbit, ctxno = > ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, > &xorbit); > if (t1->mqc.raw) { > - t1->data[(y) * t1->stride + x] |= > ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) << 31; > + t1->data[(y) * t1->stride + x] |= > (int)((uint32_t)(ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno)) << 31); > t1->data[(y) * t1->stride + x] |= mask; > } else { > - t1->data[(y) * t1->stride + x] |= > (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) << 31; > + t1->data[(y) * t1->stride + x] |= > (int)((uint32_t)(ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) > << 31); > t1->data[(y) * t1->stride + x] |= mask; > } > ff_jpeg2000_set_significance(t1, x, y, > @@ -1969,7 +1969,7 @@ static void decode_clnpass(const Jpeg2000DecoderContext > *s, Jpeg2000T1Context *t > int xorbit; > int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y + 1) * > t1->stride + x + 1] & flags_mask, > &xorbit); > - t1->data[(y) * t1->stride + x] |= > (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) << 31; > + t1->data[(y) * t1->stride + x] |= > (int)((uint32_t)(ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) > << 31); > t1->data[(y) * t1->stride + x] |= mask; > ff_jpeg2000_set_significance(t1, x, y, t1->data[(y) * > t1->stride + x] & INT32_MIN); > } > diff --git a/libavcodec/jpeg2000htdec.c b/libavcodec/jpeg2000htdec.c > index 186a6873ac..b4bb6dcf33 100644 > --- a/libavcodec/jpeg2000htdec.c > +++ b/libavcodec/jpeg2000htdec.c > @@ -1070,7 +1070,7 @@ static void jpeg2000_process_stripes_block(StateVars > *sig_prop, int i_s, int j_s > uint8_t *state_p = block_states + (i + 1) * stride + (j + 1); > if ((state_p[0] >> HT_SHIFT_REF) & 1) { > bit = jpeg2000_peek_bit(sig_prop, magref_segment, > magref_length); > - *sp |= (int32_t)bit << 31; > + *sp |= (int32_t)((uint32_t)bit << 31); > } > } > } > @@ -1160,7 +1160,7 @@ jpeg2000_decode_magref_segment( uint16_t width, > uint16_t block_height, const int > jpeg2000_modify_state(i, j, stride, 1 << > HT_SHIFT_REF_IND, block_states); > bit = jpeg2000_import_magref_bit(&mag_ref, > magref_segment, magref_length); > tmp = 0xFFFFFFFE | (uint32_t)bit; > - tmp <<= pLSB; > + tmp = (int32_t)((uint32_t)tmp << pLSB); > sp[0] &= tmp; > sp[0] |= 1 << (pLSB - 1); // Add 0.5 (reconstruction > parameter = 1/2) > } > @@ -1176,7 +1176,7 @@ jpeg2000_decode_magref_segment( uint16_t width, > uint16_t block_height, const int > jpeg2000_modify_state(i, j, stride, 1 << HT_SHIFT_REF_IND, > block_states); > bit = jpeg2000_import_magref_bit(&mag_ref, magref_segment, > magref_length); > tmp = 0xFFFFFFFE | (uint32_t)bit; > - tmp <<= pLSB; > + tmp = (int32_t)((uint32_t)tmp << pLSB); > sp[0] &= tmp; > sp[0] |= 1 << (pLSB - 1); // Add 0.5 (reconstruction > parameter = 1/2) > } > -- > 2.43.0 > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".