summaryrefslogtreecommitdiffstats
path: root/libutils/JenkinsHash.cpp
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2015-08-22 14:27:03 -0700
committerNick Kralevich <nnk@google.com>2015-08-24 15:52:22 +0000
commit1f286989986a384e34d9de1acf8899439506695a (patch)
treeca15d9ff0bce7642a7b479002867cac5d0063b15 /libutils/JenkinsHash.cpp
parent3b94cef1b75893f98ad3011a09582405bb32baf4 (diff)
downloadcore-1f286989986a384e34d9de1acf8899439506695a.tar.gz
core-1f286989986a384e34d9de1acf8899439506695a.tar.bz2
core-1f286989986a384e34d9de1acf8899439506695a.zip
libutils: cleanups for -fsanitize=integer
* Hashing functions rely on integer overflow behavior. Mark those functions as safe. * abort() if a passed in size_t value is greater than UINT32_MAX. This can occur on 64 bit builds where size_t is larger than uint32_t. * Special case the index lookup for an empty sorted vector. Without the special case, size() == 0, and size()-1 underflows. Change-Id: I343a14b589fc8f0d221c1998ae5d6f0b9e2781f8
Diffstat (limited to 'libutils/JenkinsHash.cpp')
-rw-r--r--libutils/JenkinsHash.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/libutils/JenkinsHash.cpp b/libutils/JenkinsHash.cpp
index 52c9bb7df..ff5d252a4 100644
--- a/libutils/JenkinsHash.cpp
+++ b/libutils/JenkinsHash.cpp
@@ -19,10 +19,14 @@
* should still be quite good.
**/
+#include <stdlib.h>
#include <utils/JenkinsHash.h>
namespace android {
+#ifdef __clang__
+__attribute__((no_sanitize("integer")))
+#endif
hash_t JenkinsHashWhiten(uint32_t hash) {
hash += (hash << 3);
hash ^= (hash >> 11);
@@ -31,6 +35,9 @@ hash_t JenkinsHashWhiten(uint32_t hash) {
}
uint32_t JenkinsHashMixBytes(uint32_t hash, const uint8_t* bytes, size_t size) {
+ if (size > UINT32_MAX) {
+ abort();
+ }
hash = JenkinsHashMix(hash, (uint32_t)size);
size_t i;
for (i = 0; i < (size & -4); i += 4) {
@@ -47,6 +54,9 @@ uint32_t JenkinsHashMixBytes(uint32_t hash, const uint8_t* bytes, size_t size) {
}
uint32_t JenkinsHashMixShorts(uint32_t hash, const uint16_t* shorts, size_t size) {
+ if (size > UINT32_MAX) {
+ abort();
+ }
hash = JenkinsHashMix(hash, (uint32_t)size);
size_t i;
for (i = 0; i < (size & -2); i += 2) {