diff options
author | Björn Gustavsson <[email protected]> | 2010-12-14 15:08:49 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2010-12-21 11:30:45 +0100 |
commit | b36c9d12d7960c06872d866c25a913eb45b957bc (patch) | |
tree | e659c3058ff5b5d1b0078df2b1d3cd1a1964a49e /erts/emulator/beam/erl_bits.c | |
parent | 9f4dd4934d427f0fb2caeb034115e0227cc4610a (diff) | |
download | otp-b36c9d12d7960c06872d866c25a913eb45b957bc.tar.gz otp-b36c9d12d7960c06872d866c25a913eb45b957bc.tar.bz2 otp-b36c9d12d7960c06872d866c25a913eb45b957bc.zip |
Fix type-checking of variable used in zero-width bit syntax construction
<<A:0>> will always produce an empty binary, regardless of the
type of A. The bug is in the run-time system. Fix it so that a
non-numeric value for A will cause a badarg exception.
Reported-by: Zvi
Diffstat (limited to 'erts/emulator/beam/erl_bits.c')
-rw-r--r-- | erts/emulator/beam/erl_bits.c | 14 |
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. */ |