aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2010-12-21 11:31:09 +0100
committerBjörn Gustavsson <[email protected]>2010-12-21 11:31:09 +0100
commit2d69a4f735967fbc40b55df2c85f1851cb7c46bb (patch)
treeb3285001cbd1008067a133977cafb1f53be8a876 /erts/emulator/beam
parentf026b83b15b144965ae2013eaeae320dd16b3c10 (diff)
parentb36c9d12d7960c06872d866c25a913eb45b957bc (diff)
downloadotp-2d69a4f735967fbc40b55df2c85f1851cb7c46bb.tar.gz
otp-2d69a4f735967fbc40b55df2c85f1851cb7c46bb.tar.bz2
otp-2d69a4f735967fbc40b55df2c85f1851cb7c46bb.zip
Merge branch 'bjorn/bs-zero-width-bug/OTP-8997' into dev
* bjorn/bs-zero-width-bug/OTP-8997: Fix type-checking of variable used in zero-width bit syntax construction
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r--erts/emulator/beam/erl_bits.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/erts/emulator/beam/erl_bits.c b/erts/emulator/beam/erl_bits.c
index 88d2c06246..6f8a7436d5 100644
--- a/erts/emulator/beam/erl_bits.c
+++ b/erts/emulator/beam/erl_bits.c
@@ -555,10 +555,11 @@ fmt_int(byte *buf, Uint sz, Eterm val, Uint size, Uint flags)
{
unsigned long offs;
- ASSERT(size != 0);
offs = BIT_OFFSET(size);
if (is_small(val)) {
Sint v = signed_val(val);
+
+ ASSERT(size != 0); /* Tested by caller */
if (flags & BSF_LITTLE) { /* Little endian */
sz--;
COPY_VAL(buf,1,v,sz);
@@ -578,6 +579,9 @@ fmt_int(byte *buf, Uint sz, Eterm val, Uint size, Uint flags)
ErtsDigit* dp = big_v(val);
int n = MIN(sz,ds);
+ if (size == 0) {
+ return 0;
+ }
if (flags & BSF_LITTLE) {
sz -= n; /* pad with this amount */
if (sign) {
@@ -729,15 +733,13 @@ erts_new_bs_put_integer(ERL_BITS_PROTO_3(Eterm arg, Uint num_bits, unsigned flag
Uint b;
byte *iptr;
- if (num_bits == 0) {
- return 1;
- }
-
bit_offset = BIT_OFFSET(bin_offset);
if (is_small(arg)) {
Uint rbits = 8 - bit_offset;
- if (bit_offset + num_bits <= 8) {
+ if (num_bits == 0) {
+ return 1;
+ } else if (bit_offset + num_bits <= 8) {
/*
* All bits are in the same byte.
*/