summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-08-18 14:48:43 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-08-18 14:48:43 -0300
commit75ea9ccbea7c4886f30da147fb67b693b2624c26 (patch)
tree171be7ee405be5a3a64771116752c74111357a86
parent5027298b46c1e436bc7a007554139a29f34c2971 (diff)
downloadlua-github-v5.3.tar.gz
Fixed bug of long strings in binary chunksv5.3.6v5.3
When "undumping" a long string, the function 'LoadVector' can call the reader function, which can run the garbage collector, which can collect the string being read. So, the string must be anchored during the call to 'LoadVector'. (This commit also fixes the identation in 'l_alloc'.)
-rw-r--r--lauxlib.c8
-rw-r--r--lundump.c10
2 files changed, 11 insertions, 7 deletions
diff --git a/lauxlib.c b/lauxlib.c
index 097c3cf3..ac68bd32 100644
--- a/lauxlib.c
+++ b/lauxlib.c
@@ -1013,10 +1013,10 @@ static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
}
else { /* cannot fail when shrinking a block */
void *newptr = realloc(ptr, nsize);
- if (newptr == NULL && ptr != NULL && nsize <= osize)
- return ptr; /* keep the original block */
- else /* no fail or not shrinking */
- return newptr; /* use the new block */
+ if (newptr == NULL && ptr != NULL && nsize <= osize)
+ return ptr; /* keep the original block */
+ else /* no fail or not shrinking */
+ return newptr; /* use the new block */
}
}
diff --git a/lundump.c b/lundump.c
index b75e10af..edf9eb8d 100644
--- a/lundump.c
+++ b/lundump.c
@@ -86,6 +86,7 @@ static lua_Integer LoadInteger (LoadState *S) {
static TString *LoadString (LoadState *S, Proto *p) {
+ lua_State *L = S->L;
size_t size = LoadByte(S);
TString *ts;
if (size == 0xFF)
@@ -95,13 +96,16 @@ static TString *LoadString (LoadState *S, Proto *p) {
else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */
char buff[LUAI_MAXSHORTLEN];
LoadVector(S, buff, size);
- ts = luaS_newlstr(S->L, buff, size);
+ ts = luaS_newlstr(L, buff, size);
}
else { /* long string */
- ts = luaS_createlngstrobj(S->L, size);
+ ts = luaS_createlngstrobj(L, size);
+ setsvalue2s(L, L->top, ts); /* anchor it ('loadVector' can GC) */
+ luaD_inctop(L);
LoadVector(S, getstr(ts), size); /* load directly in final place */
+ L->top--; /* pop string */
}
- luaC_objbarrier(S->L, p, ts);
+ luaC_objbarrier(L, p, ts);
return ts;
}