Fix potential integer overflow in getnum (#3633)
This commit is contained in:
parent
6038307bbf
commit
1c3cc2b6a4
|
@ -99,12 +99,14 @@ typedef struct Header {
|
||||||
} Header;
|
} Header;
|
||||||
|
|
||||||
|
|
||||||
static int getnum (const char **fmt, int df) {
|
static int getnum (lua_State *L, const char **fmt, int df) {
|
||||||
if (!isdigit(**fmt)) /* no number? */
|
if (!isdigit(**fmt)) /* no number? */
|
||||||
return df; /* return default value */
|
return df; /* return default value */
|
||||||
else {
|
else {
|
||||||
int a = 0;
|
int a = 0;
|
||||||
do {
|
do {
|
||||||
|
if (a > (INT_MAX / 10) || a * 10 > (INT_MAX - (**fmt - '0')))
|
||||||
|
luaL_error(L, "integral size overflow");
|
||||||
a = a*10 + *((*fmt)++) - '0';
|
a = a*10 + *((*fmt)++) - '0';
|
||||||
} while (isdigit(**fmt));
|
} while (isdigit(**fmt));
|
||||||
return a;
|
return a;
|
||||||
|
@ -127,9 +129,9 @@ static size_t optsize (lua_State *L, char opt, const char **fmt) {
|
||||||
case 'd': return sizeof(double);
|
case 'd': return sizeof(double);
|
||||||
#endif
|
#endif
|
||||||
case 'x': return 1;
|
case 'x': return 1;
|
||||||
case 'c': return getnum(fmt, 1);
|
case 'c': return getnum(L, fmt, 1);
|
||||||
case 'i': case 'I': {
|
case 'i': case 'I': {
|
||||||
int sz = getnum(fmt, sizeof(int));
|
int sz = getnum(L, fmt, sizeof(int));
|
||||||
if (sz > MAXINTSIZE)
|
if (sz > MAXINTSIZE)
|
||||||
luaL_error(L, "integral size %d is larger than limit of %d",
|
luaL_error(L, "integral size %d is larger than limit of %d",
|
||||||
sz, MAXINTSIZE);
|
sz, MAXINTSIZE);
|
||||||
|
@ -162,7 +164,7 @@ static void controloptions (lua_State *L, int opt, const char **fmt,
|
||||||
case '>': h->endian = BIG; return;
|
case '>': h->endian = BIG; return;
|
||||||
case '<': h->endian = LITTLE; return;
|
case '<': h->endian = LITTLE; return;
|
||||||
case '!': {
|
case '!': {
|
||||||
int a = getnum(fmt, MAXALIGN);
|
int a = getnum(L, fmt, MAXALIGN);
|
||||||
if (!isp2(a))
|
if (!isp2(a))
|
||||||
luaL_error(L, "alignment %d is not a power of 2", a);
|
luaL_error(L, "alignment %d is not a power of 2", a);
|
||||||
h->align = a;
|
h->align = a;
|
||||||
|
|
Loading…
Reference in New Issue