1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

avcodec/exr: Fix potential effective-type violation

Storing the values via a union of an uint32_t and a float makes
said union the effective type of the destination. This means that
it may only be read via such a union which is of course not what
our users do/expect. So store the values via AV_WN32A instead
which disables effective type analysis (for compilers that perform it).

This also fixes a -Wdeclaration-after-statement warning
introduced in 0e917389fe.

Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2025-03-05 14:19:13 +01:00
parent 431805c096
commit 72cff47be7

View File

@ -1383,34 +1383,29 @@ static int decode_block(AVCodecContext *avctx, void *tdata,
s->compression == EXR_DWAA || s->compression == EXR_DWAA ||
s->compression == EXR_DWAB) { s->compression == EXR_DWAB) {
// 32-bit // 32-bit
union av_intfloat32 *ptr_x; uint8_t *ptr_x = ptr;
src = channel_buffer[c]; src = channel_buffer[c];
ptr_x = (union av_intfloat32 *)ptr;
// Zero out the start if xmin is not 0 // Zero out the start if xmin is not 0
memset(ptr_x, 0, bxmin); memset(ptr_x, 0, bxmin);
ptr_x += window_xoffset; ptr_x += 4 * window_xoffset;
union av_intfloat32 t;
if (trc_func && c < 3) { if (trc_func && c < 3) {
for (x = 0; x < xsize; x++) { for (int x = 0; x < xsize; x++, ptr_x += 4) {
t.i = bytestream_get_le32(&src); float f = av_int2float(bytestream_get_le32(&src));
t.f = trc_func(t.f); AV_WN32A(ptr_x, av_float2int(trc_func(f)));
*ptr_x++ = t;
} }
} else if (one_gamma != 1.f) { } else if (one_gamma != 1.f) {
for (x = 0; x < xsize; x++) { for (int x = 0; x < xsize; x++, ptr_x += 4) {
t.i = bytestream_get_le32(&src); float f = av_int2float(bytestream_get_le32(&src));
if (t.f > 0.0f && c < 3) /* avoid negative values */ if (f > 0.0f && c < 3) /* avoid negative values */
t.f = powf(t.f, one_gamma); f = powf(f, one_gamma);
*ptr_x++ = t; AV_WN32A(ptr_x, av_float2int(f));
} }
} else { } else {
for (x = 0; x < xsize; x++) { for (int x = 0; x < xsize; x++, ptr_x += 4)
t.i = bytestream_get_le32(&src); AV_WN32A(ptr_x, bytestream_get_le32(&src));
*ptr_x++ = t;
}
} }
memset(ptr_x, 0, axmax); memset(ptr_x, 0, axmax);
} else if (s->pixel_type == EXR_HALF) { } else if (s->pixel_type == EXR_HALF) {