summaryrefslogtreecommitdiff
path: root/lib/typesafe.h
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2023-09-19 21:03:24 +0200
committerDavid Lamparter <equinox@opensourcerouting.org>2023-09-19 21:09:17 +0200
commite7737c89eb9ef5677a3b21141b6f8eb1e47c958e (patch)
tree840ae9b937be99c0a0f90588a23e9dddd6f4ea1a /lib/typesafe.h
parente7f0bbb1980660bdcf4595e88b60eadd41a0a172 (diff)
lib: constrain hash table "tabshift" both ways
The previous change to assume() did address the coverity warning about one direction of the shift in HASH_KEY, let's constrain the other in HASH_SIZE as well. To be fair, the hash table *will* break at 1G entries, but at that point we have other problems RAM-wise. (Could bump the thing to 64-bit, but then we need better item hash functions too on every single user.) Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'lib/typesafe.h')
-rw-r--r--lib/typesafe.h9
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/typesafe.h b/lib/typesafe.h
index a84298b062..93258c5954 100644
--- a/lib/typesafe.h
+++ b/lib/typesafe.h
@@ -795,13 +795,16 @@ struct thash_head {
uint8_t minshift, maxshift;
};
-#define _HASH_SIZE(tabshift) \
- ((1U << (tabshift)) >> 1)
+#define _HASH_SIZE(tabshift) \
+ ({ \
+ assume((tabshift) <= 31); \
+ (1U << (tabshift)) >> 1; \
+ })
#define HASH_SIZE(head) \
_HASH_SIZE((head).tabshift)
#define _HASH_KEY(tabshift, val) \
({ \
- assume((tabshift) >= 2 && (tabshift) <= 33); \
+ assume((tabshift) >= 2 && (tabshift) <= 31); \
(val) >> (33 - (tabshift)); \
})
#define HASH_KEY(head, val) \