Patchwork [PULL,3/7] sd/pl181.c: Avoid undefined shift behaviour in RWORD macro

login
register
mail settings
Submitter Peter Maydell
Date July 15, 2013, 4:01 p.m.
Message ID <1373904095-27592-4-git-send-email-peter.maydell@linaro.org>
Download mbox | patch
Permalink /patch/259127/
State New
Headers show

Comments

Peter Maydell - July 15, 2013, 4:01 p.m.
Add a cast to avoid potentially shifting into the sign bit of
a signed value, which is undefined behaviour in C.

(Detected with clang's -fsanitize=undefined.)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 1372341831-4264-1-git-send-email-peter.maydell@linaro.org
---
 hw/sd/pl181.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Patch

diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
index 4b17234..f5eb1e4 100644
--- a/hw/sd/pl181.c
+++ b/hw/sd/pl181.c
@@ -175,7 +175,7 @@  static void pl181_send_command(pl181_state *s)
     if (rlen < 0)
         goto error;
     if (s->cmd & PL181_CMD_RESPONSE) {
-#define RWORD(n) ((response[n] << 24) | (response[n + 1] << 16) \
+#define RWORD(n) (((uint32_t)response[n] << 24) | (response[n + 1] << 16) \
                   | (response[n + 2] << 8) | response[n + 3])
         if (rlen == 0 || (rlen == 4 && (s->cmd & PL181_CMD_LONGRESP)))
             goto error;