aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/utils
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2011-05-12 11:50:01 +0200
committerBjörn Gustavsson <[email protected]>2011-08-03 11:24:52 +0200
commit2d30edeb73119bbbcf3622e5c163552c10df0861 (patch)
tree05939b21fc25a0591f7d8406a1f9779fee673fea /erts/emulator/utils
parent8f066e99c9d614742dfb987befe72d21de4d739a (diff)
downloadotp-2d30edeb73119bbbcf3622e5c163552c10df0861.tar.gz
otp-2d30edeb73119bbbcf3622e5c163552c10df0861.tar.bz2
otp-2d30edeb73119bbbcf3622e5c163552c10df0861.zip
beam_load.c: Add overflow check of tag values
The handling of large values for other tags than TAG_i (integer) is buggy. Any tag value equal to or greater than 2^40 (5 bytes) will abort loading. Tag values fitting in 5 bytes will be truncated to 4 bytes values. Those bugs cause real problems because the bs_init2/6 and bs_init_bits/6 instructions unfortunately use TAG_u to encode literal sizes (using TAG_i would have been a better choice, but it is too late to change that now). Any binary size that cannot fit in an Uint should cause a system_limit exception at run-time, but instead the buggy handling will either cause an emulator crash (for values in the range 2^32 to 2^40-1) or abort loading. In this commit, implement overflow checking of tag values as a preparation for fixing the binary construction instructions. If any tag value cannot fit in an Uint (except for TAG_i), change the tag to the special TAG_o overflow tag.
Diffstat (limited to 'erts/emulator/utils')
-rwxr-xr-xerts/emulator/utils/beam_makeops2
1 files changed, 1 insertions, 1 deletions
diff --git a/erts/emulator/utils/beam_makeops b/erts/emulator/utils/beam_makeops
index 1a117b168f..354439b5e3 100755
--- a/erts/emulator/utils/beam_makeops
+++ b/erts/emulator/utils/beam_makeops
@@ -110,7 +110,7 @@ my @pred_table;
# Operand types for generic instructions.
my $compiler_types = "uiaxyfhz";
-my $loader_types = "nprvlq";
+my $loader_types = "nprvlqo";
my $genop_types = $compiler_types . $loader_types;
#