From: Alexandre Oliva Date: Thu, 29 Dec 2022 17:33:07 +0000 (-0300) Subject: prevent hash set/map insertion of deleted entries X-Git-Tag: basepoints/gcc-14~2275 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=603da201681ad06342055e8c12a656f5289e52a8;p=thirdparty%2Fgcc.git prevent hash set/map insertion of deleted entries Just like the recently-added checks for empty entries, add checks for deleted entries as well. This didn't catch any problems, but it might prevent future accidents. Suggested by David Malcolm. for gcc/ChangeLog * hash-map.h (put, get_or_insert): Check that added entry doesn't look deleted either. * hash-set.h (add): Likewise. --- diff --git a/gcc/hash-map.h b/gcc/hash-map.h index 63fa21cf37c5..e6ca9cf5e642 100644 --- a/gcc/hash-map.h +++ b/gcc/hash-map.h @@ -173,8 +173,9 @@ public: if (ins) { e->m_key = k; - new ((void *) &e->m_value) Value (v); - gcc_checking_assert (!Traits::is_empty (*e)); + new ((void *)&e->m_value) Value (v); + gcc_checking_assert (!Traits::is_empty (*e) + && !Traits::is_deleted (*e)); } else e->m_value = v; @@ -204,7 +205,8 @@ public: { e->m_key = k; new ((void *)&e->m_value) Value (); - gcc_checking_assert (!Traits::is_empty (*e)); + gcc_checking_assert (!Traits::is_empty (*e) + && !Traits::is_deleted (*e)); } if (existed != NULL) diff --git a/gcc/hash-set.h b/gcc/hash-set.h index a98121a060ee..08e1851d5118 100644 --- a/gcc/hash-set.h +++ b/gcc/hash-set.h @@ -61,7 +61,8 @@ public: { new (e) Key (k); // Catch attempts to insert e.g. a NULL pointer. - gcc_checking_assert (!Traits::is_empty (*e)); + gcc_checking_assert (!Traits::is_empty (*e) + && !Traits::is_deleted (*e)); } return existed;