mirror of
https://github.com/owntone/owntone-server.git
synced 2025-05-23 02:21:55 -04:00
Fix 32bit MurmurHash64 routines
Properly handle the tail of the data buffer, accessing the tail as an unsigned char array instead of a uint32_t array. Issue spotted by Peter Carmichael.
This commit is contained in:
parent
65c8924898
commit
2be812e04d
@ -107,6 +107,7 @@ murmur_hash64(const void *key, int len, uint32_t seed)
|
|||||||
const uint32_t m = 0x5bd1e995;
|
const uint32_t m = 0x5bd1e995;
|
||||||
|
|
||||||
const uint32_t *data;
|
const uint32_t *data;
|
||||||
|
const unsigned char *data_tail;
|
||||||
uint32_t k1;
|
uint32_t k1;
|
||||||
uint32_t h1;
|
uint32_t h1;
|
||||||
uint32_t k2;
|
uint32_t k2;
|
||||||
@ -124,12 +125,12 @@ murmur_hash64(const void *key, int len, uint32_t seed)
|
|||||||
k1 = *data++;
|
k1 = *data++;
|
||||||
k1 *= m; k1 ^= k1 >> r; k1 *= m;
|
k1 *= m; k1 ^= k1 >> r; k1 *= m;
|
||||||
h1 *= m; h1 ^= k1;
|
h1 *= m; h1 ^= k1;
|
||||||
len -= 4;
|
|
||||||
|
|
||||||
k2 = *data++;
|
k2 = *data++;
|
||||||
k2 *= m; k2 ^= k2 >> r; k2 *= m;
|
k2 *= m; k2 ^= k2 >> r; k2 *= m;
|
||||||
h2 *= m; h2 ^= k2;
|
h2 *= m; h2 ^= k2;
|
||||||
len -= 4;
|
|
||||||
|
len -= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len >= 4)
|
if (len >= 4)
|
||||||
@ -140,14 +141,16 @@ murmur_hash64(const void *key, int len, uint32_t seed)
|
|||||||
len -= 4;
|
len -= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data_tail = (const unsigned char *)data;
|
||||||
|
|
||||||
switch(len)
|
switch(len)
|
||||||
{
|
{
|
||||||
case 3:
|
case 3:
|
||||||
h2 ^= (uint32_t)(data[2]) << 16;
|
h2 ^= (uint32_t)(data_tail[2]) << 16;
|
||||||
case 2:
|
case 2:
|
||||||
h2 ^= (uint32_t)(data[1]) << 8;
|
h2 ^= (uint32_t)(data_tail[1]) << 8;
|
||||||
case 1:
|
case 1:
|
||||||
h2 ^= (uint32_t)(data[0]);
|
h2 ^= (uint32_t)(data_tail[0]);
|
||||||
h2 *= m;
|
h2 *= m;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
13
src/misc.c
13
src/misc.c
@ -684,6 +684,7 @@ murmur_hash64(const void *key, int len, uint32_t seed)
|
|||||||
const uint32_t m = 0x5bd1e995;
|
const uint32_t m = 0x5bd1e995;
|
||||||
|
|
||||||
const uint32_t *data;
|
const uint32_t *data;
|
||||||
|
const unsigned char *data_tail;
|
||||||
uint32_t k1;
|
uint32_t k1;
|
||||||
uint32_t h1;
|
uint32_t h1;
|
||||||
uint32_t k2;
|
uint32_t k2;
|
||||||
@ -701,12 +702,12 @@ murmur_hash64(const void *key, int len, uint32_t seed)
|
|||||||
k1 = *data++;
|
k1 = *data++;
|
||||||
k1 *= m; k1 ^= k1 >> r; k1 *= m;
|
k1 *= m; k1 ^= k1 >> r; k1 *= m;
|
||||||
h1 *= m; h1 ^= k1;
|
h1 *= m; h1 ^= k1;
|
||||||
len -= 4;
|
|
||||||
|
|
||||||
k2 = *data++;
|
k2 = *data++;
|
||||||
k2 *= m; k2 ^= k2 >> r; k2 *= m;
|
k2 *= m; k2 ^= k2 >> r; k2 *= m;
|
||||||
h2 *= m; h2 ^= k2;
|
h2 *= m; h2 ^= k2;
|
||||||
len -= 4;
|
|
||||||
|
len -= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len >= 4)
|
if (len >= 4)
|
||||||
@ -717,14 +718,16 @@ murmur_hash64(const void *key, int len, uint32_t seed)
|
|||||||
len -= 4;
|
len -= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data_tail = (const unsigned char *)data;
|
||||||
|
|
||||||
switch(len)
|
switch(len)
|
||||||
{
|
{
|
||||||
case 3:
|
case 3:
|
||||||
h2 ^= (uint32_t)(data[2]) << 16;
|
h2 ^= (uint32_t)(data_tail[2]) << 16;
|
||||||
case 2:
|
case 2:
|
||||||
h2 ^= (uint32_t)(data[1]) << 8;
|
h2 ^= (uint32_t)(data_tail[1]) << 8;
|
||||||
case 1:
|
case 1:
|
||||||
h2 ^= (uint32_t)(data[0]);
|
h2 ^= (uint32_t)(data_tail[0]);
|
||||||
h2 *= m;
|
h2 *= m;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user