Bug reported by Bruno Haible in <https://lists.gnu.org/r/bug-gnulib/2022-04/msg00023.html>. * lib/hamt.c (entry_insert): Remove technically undefined behavior when shifting an integer of N bits by N or more bits. --- ChangeLog | 8 ++++++++ lib/hamt.c | 5 +++++ 2 files changed, 13 insertions(+)
diff --git a/ChangeLog b/ChangeLog index ccf4acd03..0d04cb70e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2022-08-12 Marc Nieper-Wißkirchen <m...@nieper-wisskirchen.de> + + hamt: fix technically undefined behavior + Bug reported by Bruno Haible in + <https://lists.gnu.org/r/bug-gnulib/2022-04/msg00023.html>. + * lib/hamt.c (entry_insert): Remove technically undefined + behavior when shifting an integer of N bits by N or more bits. + 2022-08-10 Paul Eggert <egg...@cs.ucla.edu> stdckdint: fix dependency diff --git a/lib/hamt.c b/lib/hamt.c index 2b07cf23b..be9712561 100644 --- a/lib/hamt.c +++ b/lib/hamt.c @@ -680,6 +680,11 @@ entry_insert (const struct function_table *functions, Hamt_entry *entry, Hamt_entry *new_entry = copy_entry (*elt_ptr); if (replace) *elt_ptr = NULL; + /* We have to take this shortcut as shifting an integer of N + bits by N or more bits triggers undefined behavior. + See: https://lists.gnu.org/archive/html/bug-gnulib/2022-04/msg00023.html. */ + if (depth >= _GL_HAMT_MAX_DEPTH) + return (Hamt_entry *) create_populated_bucket (new_entry, copy_entry (entry)); return create_populated_subtrie (new_entry, copy_entry (entry), hash, (hash_element (functions, entry) >> (5 * depth)), depth); -- 2.34.1