File 0212-erts-Add-assertions-that-flatmaps-have-correct-size.patch of Package erlang

From 89eef52aab27c3eb8901032126f95925beada532 Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Thu, 31 Mar 2022 09:54:34 +0200
Subject: [PATCH 1/2] erts: Add assertions that flatmaps have correct size

---
 erts/emulator/beam/copy.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/erts/emulator/beam/copy.c b/erts/emulator/beam/copy.c
index 51cbb7644d..b1e8b7edbd 100644
--- a/erts/emulator/beam/copy.c
+++ b/erts/emulator/beam/copy.c
@@ -163,6 +163,7 @@ Uint size_object_x(Eterm obj, erts_literal_area_t *litopt)
                                 mp  = (flatmap_t*)flatmap_val(obj);
                                 ptr = (Eterm *)mp;
                                 n   = flatmap_get_size(mp) + 1;
+                                ASSERT(flatmap_get_size(mp) <= MAP_SMALL_MAP_LIMIT);
                                 sum += n + 2;
                                 ptr += 2; /* hdr + size words */
                                 while (n--) {
@@ -430,6 +431,7 @@ Uint size_shared(Eterm obj)
                     case MAP_HEADER_TAG_FLATMAP_HEAD : {
                         flatmap_t *mp  = (flatmap_t*)flatmap_val(obj);
                         Uint n = flatmap_get_size(mp) + 1;
+                        ASSERT(flatmap_get_size(mp) <= MAP_SMALL_MAP_LIMIT);
                         ptr  = (Eterm *)mp;
                         sum += n + 2;
                         ptr += 2; /* hdr + size words */
@@ -566,6 +568,7 @@ cleanup:
                     case MAP_HEADER_TAG_FLATMAP_HEAD : {
                         flatmap_t *mp = (flatmap_t *) ptr;
                         Uint n = flatmap_get_size(mp) + 1;
+                        ASSERT(flatmap_get_size(mp) <= MAP_SMALL_MAP_LIMIT);
                         ptr += 2; /* hdr + size words */
                         while (n--) {
                             obj = *ptr++;
@@ -916,6 +919,7 @@ Eterm copy_struct_x(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap,
 		switch (MAP_HEADER_TYPE(hdr)) {
 		    case MAP_HEADER_TAG_FLATMAP_HEAD :
                         i = flatmap_get_size(objp) + 3;
+                        ASSERT(flatmap_get_size(objp) <= MAP_SMALL_MAP_LIMIT);
                         *argp = make_flatmap(htop);
                         while (i--) {
                             *htop++ = *objp++;
@@ -1318,6 +1322,7 @@ Uint copy_shared_calculate(Eterm obj, erts_shcopy_t *info)
                     case MAP_HEADER_TAG_FLATMAP_HEAD : {
                         flatmap_t *mp = (flatmap_t *) ptr;
                         Uint n = flatmap_get_size(mp) + 1;
+                        ASSERT(flatmap_get_size(mp) <= MAP_SMALL_MAP_LIMIT);
                         sum += n + 2;
                         ptr += 2; /* hdr + size words */
                         while (n--) {
@@ -1629,6 +1634,7 @@ Uint copy_shared_perform_x(Eterm obj, Uint size, erts_shcopy_t *info,
                     case MAP_HEADER_TAG_FLATMAP_HEAD : {
                         flatmap_t *mp = (flatmap_t *) ptr;
                         Uint n = flatmap_get_size(mp) + 1;
+                        ASSERT(flatmap_get_size(mp) <= MAP_SMALL_MAP_LIMIT);
                         *hp++  = *++ptr; /* keys */
                         while (n--) {
                             obj = *++ptr;
@@ -1832,6 +1838,7 @@ Uint copy_shared_perform_x(Eterm obj, Uint size, erts_shcopy_t *info,
                                 case MAP_HEADER_TAG_FLATMAP_HEAD : {
                                     flatmap_t *mp = (flatmap_t *) hscan;
                                     remaining = flatmap_get_size(mp) + 1;
+                                    ASSERT(flatmap_get_size(mp) <= MAP_SMALL_MAP_LIMIT);
                                     hscan += 2;
                                     break;
                                 }
-- 
2.34.1

openSUSE Build Service is sponsored by