File 0214-Fix-max-atom-size-overflow-on-64-bits-Erlang-by-lowe.patch of Package erlang

From 864362749246d15355e904cf95248a634eebdfb7 Mon Sep 17 00:00:00 2001
From: Boshan Sun <boshan@subsplash.com>
Date: Mon, 20 Nov 2017 10:41:48 -0800
Subject: [PATCH 2/2] Fix max atom size overflow on 64-bits Erlang by lowering
 the MAX_ATOM_TABLE_SIZE

Currently, the max atom size on 64-bits Erlang is

	((UWORD_CONSTANT(1) << 32) = 4294967296

This number will cause the range of atom size to be displayed as
[8192-0].

Also, the +t option for max atom size will be parsed as a long type, and
assigned to a int variable erts_atom_table_size (erl_init.c),
which will cause integer overflow if the number is larger than the
maximum value a 4-bytes signed integer can hold

	((1 << 31) - 1) = 2147483647

Therefore, during the comparison

	erts_atom_table_size < MIN_ATOM_TABLE_SIZE

any number above 2147483647 will be come negative, and causing
the condition to be true, which then errored out as bad atom table size.

Hence, the actual max atom size is same as the max signed int value.
---
 erts/emulator/beam/atom.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/erts/emulator/beam/atom.h b/erts/emulator/beam/atom.h
index be998a46bd..385120a8d9 100644
--- a/erts/emulator/beam/atom.h
+++ b/erts/emulator/beam/atom.h
@@ -36,7 +36,7 @@
 /* Internal atom cache needs MAX_ATOM_TABLE_SIZE to be less than an
    unsigned 32 bit integer. See external.c(erts_encode_ext_dist_header_setup)
    for more details. */
-#define MAX_ATOM_TABLE_SIZE ((MAX_ATOM_INDEX + 1 < (UWORD_CONSTANT(1) << 32)) ? MAX_ATOM_INDEX + 1 : (UWORD_CONSTANT(1) << 32))
+#define MAX_ATOM_TABLE_SIZE ((MAX_ATOM_INDEX + 1 < (UWORD_CONSTANT(1) << 32)) ? MAX_ATOM_INDEX + 1 : ((UWORD_CONSTANT(1) << 31) - 1)) /* Here we use maximum signed interger value to avoid integer overflow */
 #else
 #define MAX_ATOM_TABLE_SIZE (MAX_ATOM_INDEX + 1)
 #endif
-- 
2.15.0

openSUSE Build Service is sponsored by