diff options
| author | Thijs Schreijer <thijs@thijsschreijer.nl> | 2026-08-29 17:09:47 +0200 |
|---|---|---|
| committer | Thijs Schreijer <thijs@thijsschreijer.nl> | 2026-08-29 17:22:29 +0200 |
| commit | 8cbbce56e64c84b53593c815f6dcdd9214897b74 (patch) | |
| tree | 101db7e5d326b8e7b8394840dda6d4de6eec343a /src/buffer.c | |
| parent | e912d157b242e661dca37d0a8269202dda974ba7 (diff) | |
| download | luasocket-8cbbce56e64c84b53593c815f6dcdd9214897b74.tar.gz luasocket-8cbbce56e64c84b53593c815f6dcdd9214897b74.tar.bz2 luasocket-8cbbce56e64c84b53593c815f6dcdd9214897b74.zip | |
fix(receive): guard maxsize against size_t overflow on cast
Casting a double larger than SIZE_MAX to size_t is undefined
behavior; bound-check maxsize before the cast.
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/buffer.c b/src/buffer.c index 05d6fb3..5f06fc1 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -134,7 +134,8 @@ int buffer_meth_receive(lua_State *L, p_buffer buf) { | |||
| 134 | } | 134 | } |
| 135 | if (!lua_isnoneornil(L, 4)) { | 135 | if (!lua_isnoneornil(L, 4)) { |
| 136 | double m = luaL_checknumber(L, 4); | 136 | double m = luaL_checknumber(L, 4); |
| 137 | luaL_argcheck(L, m >= 1, 4, "maxsize must be a positive number"); | 137 | luaL_argcheck(L, m >= 1 && m < (lua_Number) ((size_t) -1), 4, |
| 138 | "maxsize must be a positive number"); | ||
| 138 | maxsize = (size_t) m; | 139 | maxsize = (size_t) m; |
| 139 | luaL_argcheck(L, size < maxsize, 4, | 140 | luaL_argcheck(L, size < maxsize, 4, |
| 140 | "prefix length >= maxsize (drain with prefix=\"\" or raise maxsize)"); | 141 | "prefix length >= maxsize (drain with prefix=\"\" or raise maxsize)"); |
