Skip to content

Commit

Permalink
Fixed bug of long strings in binary chunks
Browse files Browse the repository at this point in the history
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'.)
  • Loading branch information
roberto-ieru committed Aug 18, 2020
1 parent 5027298 commit 75ea9cc
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 7 deletions.
8 changes: 4 additions & 4 deletions lauxlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
}
}

Expand Down
10 changes: 7 additions & 3 deletions lundump.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
}

Expand Down

0 comments on commit 75ea9cc

Please sign in to comment.