From 25bacd0a0c32ae682e6f411b1ac9020aeaabca72 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin@martin.st>
Date: Thu, 28 Jul 2016 13:10:22 +0300
Subject: [PATCH] Don't use expressions with side effects in macro parameters
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

AV_WB32 can be implemented as a macro that expands its parameters
multiple times (in case AV_HAVE_FAST_UNALIGNED isn't set and the
compiler doesn't support GCC attributes); make sure not to read
multiple times from the source in this case.

Signed-off-by: Martin Storsjö <martin@martin.st>
---
 libavcodec/dxv.c  | 18 ++++++++++++------
 libavformat/xmv.c |  6 ++++--
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/libavcodec/dxv.c b/libavcodec/dxv.c
index 99327dfacea..39b297a2356 100644
--- a/libavcodec/dxv.c
+++ b/libavcodec/dxv.c
@@ -121,8 +121,10 @@ static int dxv_decompress_dxt1(AVCodecContext *avctx)
     int pos = 2;
 
     /* Copy the first two elements */
-    AV_WL32(ctx->tex_data, bytestream2_get_le32(gbc));
-    AV_WL32(ctx->tex_data + 4, bytestream2_get_le32(gbc));
+    value = bytestream2_get_le32(gbc);
+    AV_WL32(ctx->tex_data, value);
+    value = bytestream2_get_le32(gbc);
+    AV_WL32(ctx->tex_data + 4, value);
 
     /* Process input until the whole texture has been filled */
     while (pos + 2 <= ctx->tex_size / 4) {
@@ -172,10 +174,14 @@ static int dxv_decompress_dxt5(AVCodecContext *avctx)
     int probe, check;
 
     /* Copy the first four elements */
-    AV_WL32(ctx->tex_data +  0, bytestream2_get_le32(gbc));
-    AV_WL32(ctx->tex_data +  4, bytestream2_get_le32(gbc));
-    AV_WL32(ctx->tex_data +  8, bytestream2_get_le32(gbc));
-    AV_WL32(ctx->tex_data + 12, bytestream2_get_le32(gbc));
+    value = bytestream2_get_le32(gbc);
+    AV_WL32(ctx->tex_data +  0, value);
+    value = bytestream2_get_le32(gbc);
+    AV_WL32(ctx->tex_data +  4, value);
+    value = bytestream2_get_le32(gbc);
+    AV_WL32(ctx->tex_data +  8, value);
+    value = bytestream2_get_le32(gbc);
+    AV_WL32(ctx->tex_data + 12, value);
 
     /* Process input until the whole texture has been filled */
     while (pos + 2 <= ctx->tex_size / 4) {
diff --git a/libavformat/xmv.c b/libavformat/xmv.c
index b2112b0e958..fa391560f05 100644
--- a/libavformat/xmv.c
+++ b/libavformat/xmv.c
@@ -512,8 +512,10 @@ static int xmv_fetch_video_packet(AVFormatContext *s,
      * WMV2 is little-endian.
      * TODO: This manual swap is of course suboptimal.
      */
-    for (i = 0; i < frame_size; i += 4)
-        AV_WB32(pkt->data + i, avio_rl32(pb));
+    for (i = 0; i < frame_size; i += 4) {
+        uint32_t val = avio_rl32(pb);
+        AV_WB32(pkt->data + i, val);
+    }
 
     pkt->stream_index = video->stream_index;
 
-- 
GitLab