diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-12-07 16:59:52 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-12-07 16:59:52 -0200 |
commit | 76223730332cbda5d47c09f019ce721b91bd5be2 (patch) | |
tree | 375c159891df5faf827dde4175ce42b7aa503194 /ltable.c | |
parent | 46bc7f2bf7cf7f48c354fde6b9571b795bdd5b4d (diff) | |
download | lua-76223730332cbda5d47c09f019ce721b91bd5be2.tar.gz lua-76223730332cbda5d47c09f019ce721b91bd5be2.tar.bz2 lua-76223730332cbda5d47c09f019ce721b91bd5be2.zip |
using explicit tests for allocation overflow whenever possible
Diffstat (limited to 'ltable.c')
-rw-r--r-- | ltable.c | 38 |
1 files changed, 29 insertions, 9 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltable.c,v 2.126 2017/11/08 14:50:23 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 2.127 2017/11/23 19:29:04 roberto Exp roberto $ |
3 | ** Lua tables (hash) | 3 | ** Lua tables (hash) |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -40,21 +40,34 @@ | |||
40 | 40 | ||
41 | 41 | ||
42 | /* | 42 | /* |
43 | ** Maximum size of array part (MAXASIZE) is 2^MAXABITS. MAXABITS is | 43 | ** MAXABITS is the largest integer such that MAXASIZE fits in an |
44 | ** the largest integer such that MAXASIZE fits in an unsigned int. | 44 | ** unsigned int. |
45 | */ | 45 | */ |
46 | #define MAXABITS cast_int(sizeof(int) * CHAR_BIT - 1) | 46 | #define MAXABITS cast_int(sizeof(int) * CHAR_BIT - 1) |
47 | #define MAXASIZE (1u << MAXABITS) | 47 | |
48 | 48 | ||
49 | /* | 49 | /* |
50 | ** Maximum size of hash part is 2^MAXHBITS. MAXHBITS is the largest | 50 | ** MAXASIZE is the maximum size of the array part. It is the minimum |
51 | ** integer such that 2^MAXHBITS fits in a signed int. (Note that the | 51 | ** between 2^MAXABITS and the maximum size such that, measured in bytes, |
52 | ** maximum number of elements in a table, 2^MAXABITS + 2^MAXHBITS, still | 52 | ** it fits in a 'size_t'. |
53 | ** fits comfortably in an unsigned int.) | 53 | */ |
54 | #define MAXASIZE luaM_limitN(1u << MAXABITS, TValue) | ||
55 | |||
56 | /* | ||
57 | ** MAXHBITS is the largest integer such that 2^MAXHBITS fits in a | ||
58 | ** signed int. | ||
54 | */ | 59 | */ |
55 | #define MAXHBITS (MAXABITS - 1) | 60 | #define MAXHBITS (MAXABITS - 1) |
56 | 61 | ||
57 | 62 | ||
63 | /* | ||
64 | ** MAXHSIZE is the maximum size of the hash part. It is the minimum | ||
65 | ** between 2^MAXHBITS and the maximum size such that, measured in bytes, | ||
66 | ** it fits in a 'size_t'. | ||
67 | */ | ||
68 | #define MAXHSIZE luaM_limitN(1u << MAXHBITS, Node) | ||
69 | |||
70 | |||
58 | #define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) | 71 | #define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) |
59 | 72 | ||
60 | #define hashstr(t,str) hashpow2(t, (str)->hash) | 73 | #define hashstr(t,str) hashpow2(t, (str)->hash) |
@@ -353,6 +366,13 @@ static void setarrayvector (lua_State *L, Table *t, unsigned int size) { | |||
353 | } | 366 | } |
354 | 367 | ||
355 | 368 | ||
369 | /* | ||
370 | ** Creates an array for the hash part of a table with the given | ||
371 | ** size, or reuses the dummy node if size is zero. | ||
372 | ** The computation for size overflow is in two steps: the first | ||
373 | ** comparison ensures that the shift in the second one does not | ||
374 | ** overflow. | ||
375 | */ | ||
356 | static void setnodevector (lua_State *L, Table *t, unsigned int size) { | 376 | static void setnodevector (lua_State *L, Table *t, unsigned int size) { |
357 | if (size == 0) { /* no elements to hash part? */ | 377 | if (size == 0) { /* no elements to hash part? */ |
358 | t->node = cast(Node *, dummynode); /* use common 'dummynode' */ | 378 | t->node = cast(Node *, dummynode); /* use common 'dummynode' */ |
@@ -362,7 +382,7 @@ static void setnodevector (lua_State *L, Table *t, unsigned int size) { | |||
362 | else { | 382 | else { |
363 | int i; | 383 | int i; |
364 | int lsize = luaO_ceillog2(size); | 384 | int lsize = luaO_ceillog2(size); |
365 | if (lsize > MAXHBITS) | 385 | if (lsize > MAXHBITS || (1u << lsize) > MAXHSIZE) |
366 | luaG_runerror(L, "table overflow"); | 386 | luaG_runerror(L, "table overflow"); |
367 | size = twoto(lsize); | 387 | size = twoto(lsize); |
368 | t->node = luaM_newvector(L, size, Node); | 388 | t->node = luaM_newvector(L, size, Node); |