From e51c76c72b79e1453b135de8acd12d3c50014b12 Mon Sep 17 00:00:00 2001 From: Guldoman Date: Wed, 12 Jan 2022 19:56:09 +0100 Subject: [PATCH] Assert for negative `field` in bit32 polyfill This more closely matches the behavior of lua5.2. --- data/core/bit.lua | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/data/core/bit.lua b/data/core/bit.lua index 114ea3cb..e55fb9bf 100644 --- a/data/core/bit.lua +++ b/data/core/bit.lua @@ -11,18 +11,23 @@ local function mask(n) return (~((ALLONES << 1) << ((n) - 1))) end +local function check_args(field, width) + assert(field >= 0, "field cannot be negative") + assert(width > 0, "width must be positive") + assert(field + width < LUA_NBITS and field + width >= 0, + "trying to access non-existent bits") +end + function bit.extract(n, field, width) local w = width or 1 - assert(w > 0, "width must be positive") - assert(field + w < LUA_NBITS and field + w >= 0, "trying to access non-existent bits") + check_args(field, w) local m = trim(n) return m >> field & mask(w) end function bit.replace(n, v, field, width) local w = width or 1 - assert(w > 0, "width must be positive") - assert(field + w < LUA_NBITS and field + w >= 0, "trying to access non-existent bits") + check_args(field, w) local m = trim(n) local x = v & mask(width); return m & ~(mask(w) << field) | (x << field)