diff --git a/src/libsodium/sodium/utils.c b/src/libsodium/sodium/utils.c index ad6677d0..0e79ef87 100644 --- a/src/libsodium/sodium/utils.c +++ b/src/libsodium/sodium/utils.c @@ -196,7 +196,8 @@ sodium_memcmp(const void *const b1_, const void *const b2_, size_t len) (const volatile unsigned char *volatile) b2_; #endif size_t i; - volatile unsigned char d = 0U; + unsigned char d = 0U; + volatile unsigned char e; #if HAVE_WEAK_SYMBOLS _sodium_dummy_symbol_to_prevent_memcmp_lto(b1, b2, len); @@ -204,7 +205,11 @@ sodium_memcmp(const void *const b1_, const void *const b2_, size_t len) for (i = 0U; i < len; i++) { d |= b1[i] ^ b2[i]; } - return (1 & ((d - 1) >> 8)) - 1; + e = d; +#if defined(__GNUC__) || defined(__clang__) + __asm__("" : "+r"(e) :); +#endif + return (1 & ((e - 1) >> 8)) - 1; } #ifdef HAVE_WEAK_SYMBOLS @@ -258,12 +263,17 @@ int sodium_is_zero(const unsigned char *n, const size_t nlen) { size_t i; - volatile unsigned char d = 0U; + unsigned char d = 0U; + volatile unsigned char e; for (i = 0U; i < nlen; i++) { d |= n[i]; } - return 1 & ((d - 1) >> 8); + e = d; +#if defined(__GNUC__) || defined(__clang__) + __asm__("" : "+r"(e) :); +#endif + return 1 & ((e - 1) >> 8); } void