mirror of
https://github.com/lua/lua
synced 2024-11-22 12:51:30 +03:00
Small simplification in overflow check in 'getfield'
Subtracting a small non-negative int from a non-negative int cannot overflow, and adding a non-negative int to INT_MIN cannot overflow.
This commit is contained in:
parent
a1089b415a
commit
cfbe378f90
4
loslib.c
4
loslib.c
@ -260,9 +260,7 @@ static int getfield (lua_State *L, const char *key, int d, int delta) {
|
|||||||
res = d;
|
res = d;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* unsigned avoids overflow when lua_Integer has 32 bits */
|
if (!(res >= 0 ? res - delta <= INT_MAX : INT_MIN + delta <= res))
|
||||||
if (!(res >= 0 ? (lua_Unsigned)res <= (lua_Unsigned)INT_MAX + delta
|
|
||||||
: (lua_Integer)INT_MIN + delta <= res))
|
|
||||||
return luaL_error(L, "field '%s' is out-of-bound", key);
|
return luaL_error(L, "field '%s' is out-of-bound", key);
|
||||||
res -= delta;
|
res -= delta;
|
||||||
}
|
}
|
||||||
|
@ -825,8 +825,17 @@ checkerr("missing", os.time, {hour = 12}) -- missing date
|
|||||||
if string.packsize("i") == 4 then -- 4-byte ints
|
if string.packsize("i") == 4 then -- 4-byte ints
|
||||||
checkerr("field 'year' is out-of-bound", os.time,
|
checkerr("field 'year' is out-of-bound", os.time,
|
||||||
{year = -(1 << 31) + 1899, month = 1, day = 1})
|
{year = -(1 << 31) + 1899, month = 1, day = 1})
|
||||||
|
|
||||||
|
checkerr("field 'year' is out-of-bound", os.time,
|
||||||
|
{year = -(1 << 31), month = 1, day = 1})
|
||||||
|
|
||||||
|
if math.maxinteger > 2^31 then -- larger lua_integer?
|
||||||
|
checkerr("field 'year' is out-of-bound", os.time,
|
||||||
|
{year = (1 << 31) + 1900, month = 1, day = 1})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
if not _port then
|
if not _port then
|
||||||
-- test Posix-specific modifiers
|
-- test Posix-specific modifiers
|
||||||
assert(type(os.date("%Ex")) == 'string')
|
assert(type(os.date("%Ex")) == 'string')
|
||||||
|
Loading…
Reference in New Issue
Block a user