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_DWAB) {
// 32-bit
union av_intfloat32 *ptr_x;
uint8_t *ptr_x = ptr;
src = channel_buffer[c];
ptr_x = (union av_intfloat32 *)ptr;
// Zero out the start if xmin is not 0
memset(ptr_x, 0, bxmin);
ptr_x += window_xoffset;
ptr_x += 4 * window_xoffset;
union av_intfloat32 t;
if (trc_func && c < 3) {
for (x = 0; x < xsize; x++) {
t.i = bytestream_get_le32(&src);
t.f = trc_func(t.f);
*ptr_x++ = t;
for (int x = 0; x < xsize; x++, ptr_x += 4) {
float f = av_int2float(bytestream_get_le32(&src));
AV_WN32A(ptr_x, av_float2int(trc_func(f)));
}
} else if (one_gamma != 1.f) {
for (x = 0; x < xsize; x++) {
t.i = bytestream_get_le32(&src);
if (t.f > 0.0f && c < 3) /* avoid negative values */
t.f = powf(t.f, one_gamma);
*ptr_x++ = t;
for (int x = 0; x < xsize; x++, ptr_x += 4) {
float f = av_int2float(bytestream_get_le32(&src));
if (f > 0.0f && c < 3) /* avoid negative values */
f = powf(f, one_gamma);
AV_WN32A(ptr_x, av_float2int(f));
}
} else {
for (x = 0; x < xsize; x++) {
t.i = bytestream_get_le32(&src);
*ptr_x++ = t;
}
for (int x = 0; x < xsize; x++, ptr_x += 4)
AV_WN32A(ptr_x, bytestream_get_le32(&src));
}
memset(ptr_x, 0, axmax);
} else if (s->pixel_type == EXR_HALF) {