lua-users home
lua-l archive

Re: Why does LoadString return NULL for zero-length strings?

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


The attached patch fixes this glitch:
> assert(loadstring(('').dump(function()X''end):gsub('2円%z%z%zX','0円0円0円')))()
stdin:1: 1: bad string in precompiled chunk
Thanks for spotting it.
--lhf
--- lundump.c,orig	2008年04月04日 16:51:41.000000000 -0300
+++ lundump.c	2008年09月02日 08:10:19.000000000 -0300
@@ -73,12 +73,15 @@
 return x;
 }
 
-static TString* LoadString(LoadState* S)
+static TString* LoadString(LoadState* S, TString* p)
 {
 size_t size;
 LoadVar(S,size);
 if (size==0)
- return NULL;
+ {
+ IF (p==NULL, "bad string");
+ return p;
+ }
 else
 {
 char* s=luaZ_openspace(S->L,S->b,size);
@@ -120,7 +123,7 @@
 	setnvalue(o,LoadNumber(S));
 	break;
 case LUA_TSTRING:
-	setsvalue2n(S->L,o,LoadString(S));
+	setsvalue2n(S->L,o,LoadString(S,NULL));
 	break;
 default:
 	error(S,"bad constant");
@@ -147,7 +150,7 @@
 for (i=0; i<n; i++) f->locvars[i].varname=NULL;
 for (i=0; i<n; i++)
 {
- f->locvars[i].varname=LoadString(S);
+ f->locvars[i].varname=LoadString(S,NULL);
 f->locvars[i].startpc=LoadInt(S);
 f->locvars[i].endpc=LoadInt(S);
 }
@@ -155,7 +158,7 @@
 f->upvalues=luaM_newvector(S->L,n,TString*);
 f->sizeupvalues=n;
 for (i=0; i<n; i++) f->upvalues[i]=NULL;
- for (i=0; i<n; i++) f->upvalues[i]=LoadString(S);
+ for (i=0; i<n; i++) f->upvalues[i]=LoadString(S,NULL);
 }
 
 static Proto* LoadFunction(LoadState* S, TString* p)
@@ -164,7 +167,7 @@
 if (++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep");
 f=luaF_newproto(S->L);
 setptvalue2s(S->L,S->L->top,f); incr_top(S->L);
- f->source=LoadString(S); if (f->source==NULL) f->source=p;
+ f->source=LoadString(S,p);
 f->linedefined=LoadInt(S);
 f->lastlinedefined=LoadInt(S);
 f->nups=LoadByte(S);

AltStyle によって変換されたページ (->オリジナル) /