Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/mit/lua/dist/src Apply bugfix #7 from lua.org/bugs....



details:   https://anonhg.NetBSD.org/src/rev/34b30844ea73
branches:  trunk
changeset: 323795:34b30844ea73
user:      mbalmer <mbalmer%NetBSD.org@localhost>
date:      Sun Jul 01 10:08:38 2018 +0000

description:
Apply bugfix #7 from lua.org/bugs.html: Memory-allocation error when resizing
a table can leave it in an inconsistent state.

diffstat:

 external/mit/lua/dist/src/ltable.c |  21 +++++++++++++++++++--
 1 files changed, 19 insertions(+), 2 deletions(-)

diffs (45 lines):

diff -r b4f4d20f66e0 -r 34b30844ea73 external/mit/lua/dist/src/ltable.c
--- a/external/mit/lua/dist/src/ltable.c        Sun Jul 01 09:53:54 2018 +0000
+++ b/external/mit/lua/dist/src/ltable.c        Sun Jul 01 10:08:38 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ltable.c,v 1.9 2017/04/26 13:17:33 mbalmer Exp $       */
+/*     $NetBSD: ltable.c,v 1.10 2018/07/01 10:08:38 mbalmer Exp $      */
 
 /*
 ** Id: ltable.c,v 2.118 2016/11/07 12:38:35 roberto Exp 
@@ -338,17 +338,34 @@
 }
 
 
+typedef struct {
+  Table *t;
+  unsigned int nhsize;
+} AuxsetnodeT;
+
+
+static void auxsetnode (lua_State *L, void *ud) {
+  AuxsetnodeT *asn = cast(AuxsetnodeT *, ud);
+  setnodevector(L, asn->t, asn->nhsize);
+}
+
+
 void luaH_resize (lua_State *L, Table *t, unsigned int nasize,
                                           unsigned int nhsize) {
   unsigned int i;
   int j;
+  AuxsetnodeT asn;
   unsigned int oldasize = t->sizearray;
   int oldhsize = allocsizenode(t);
   Node *nold = t->node;  /* save old hash ... */
   if (nasize > oldasize)  /* array part must grow? */
     setarrayvector(L, t, nasize);
   /* create new hash part with appropriate size */
-  setnodevector(L, t, nhsize);
+  asn.t = t; asn.nhsize = nhsize;
+  if (luaD_rawrunprotected(L, auxsetnode, &asn) != LUA_OK) {  /* mem. error? */
+    setarrayvector(L, t, oldasize);  /* array back to its original size */
+    luaD_throw(L, LUA_ERRMEM);  /* rethrow memory error */
+  }
   if (nasize < oldasize) {  /* array part must shrink? */
     t->sizearray = nasize;
     /* re-insert elements from vanishing slice */



Home | Main Index | Thread Index | Old Index