summaryrefslogtreecommitdiff
path: root/erts/emulator
diff options
context:
space:
mode:
authorLukas Larsson <lukas@erlang-solutions.com>2014-08-14 09:43:04 +0200
committerLukas Larsson <lukas@erlang-solutions.com>2014-08-14 09:43:04 +0200
commit8fe6c462ec8e20ab2ad14b0c1addf1030ada0e54 (patch)
tree84b846c45bb63029cbd725e19ee3ab0274b21056 /erts/emulator
parent9170441003f193e8b3f3a83e5ac51305e09e0f8c (diff)
parenta8cbf025f6e20a68b6575747200be149c6c09932 (diff)
downloaderlang-8fe6c462ec8e20ab2ad14b0c1addf1030ada0e54.tar.gz
Merge branch 'nox/clang-ubsan/OTP-12097' into maint
* nox/clang-ubsan/OTP-12097: Properly handle SINT_MIN in small_to_big() Use offsetof() in io.c
Diffstat (limited to 'erts/emulator')
-rw-r--r--erts/emulator/beam/big.c6
-rw-r--r--erts/emulator/beam/io.c2
2 files changed, 5 insertions, 3 deletions
diff --git a/erts/emulator/beam/big.c b/erts/emulator/beam/big.c
index 41a041eba6..4d087bf967 100644
--- a/erts/emulator/beam/big.c
+++ b/erts/emulator/beam/big.c
@@ -1506,13 +1506,15 @@ Eterm uword_to_big(UWord x, Eterm *y)
*/
Eterm small_to_big(Sint x, Eterm *y)
{
+ Uint xu;
if (x >= 0) {
+ xu = x;
*y = make_pos_bignum_header(1);
} else {
- x = -x;
+ xu = -(Uint)x;
*y = make_neg_bignum_header(1);
}
- BIG_DIGIT(y, 0) = x;
+ BIG_DIGIT(y, 0) = xu;
return make_big(y);
}
diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c
index d028737664..0f86d8e41d 100644
--- a/erts/emulator/beam/io.c
+++ b/erts/emulator/beam/io.c
@@ -7166,7 +7166,7 @@ char *driver_dl_error(void)
#define ERL_DRV_SYS_INFO_SIZE(LAST_FIELD) \
- (((size_t) &((ErlDrvSysInfo *) 0)->LAST_FIELD) \
+ (offsetof(ErlDrvSysInfo, LAST_FIELD) \
+ sizeof(((ErlDrvSysInfo *) 0)->LAST_FIELD))
void