]> granicus.if.org Git - php/commitdiff
Change Big Endian backup implementations to use signed indexes
authorSara Golemon <pollita@php.net>
Wed, 12 Oct 2016 03:43:02 +0000 (20:43 -0700)
committerSara Golemon <pollita@php.net>
Tue, 1 Nov 2016 16:35:54 +0000 (09:35 -0700)
load64() counted down from 7..0, but the decrement turned 0 into 255.
This means the loop would never terminate on Big Endian systems.

Just use signed char integers since we're only dealing with values from 0..7 anyway.

Closes https://bugs.php.net/bug.php?id=73282

ext/hash/hash_sha3.c

index 8f18fa1c2768a2050cfb9d0140094a6bdb86c8ec..b03c1f9453a35b6c0f52c7f88047cb72bf074ced 100644 (file)
@@ -38,7 +38,7 @@ static inline unsigned char idx(unsigned char x, unsigned char y) {
 
 #ifdef WORDS_BIGENDIAN
 static inline uint64_t load64(const unsigned char* x) {
-       unsigned char i;
+       char i;
        uint64_t ret = 0;
        for (i = 7; i >= 0; --i) {
                ret <<= 8;
@@ -47,14 +47,14 @@ static inline uint64_t load64(const unsigned char* x) {
        return ret;
 }
 static inline void store64(unsigned char* x, uint64_t val) {
-       unsigned char i;
+       char i;
        for (i = 0; i < 8; ++i) {
                x[i] = val & 0xFF;
                val >>= 8;
        }
 }
 static inline void xor64(unsigned char* x, uint64_t val) {
-       unsigned char i;
+       char i;
        for (i = 0; i < 8; ++i) {
                x[i] ^= val & 0xFF;
                val >>= 8;