2012-10-10 23:44:22 +03:00
|
|
|
--- a/src/ldump.c
|
|
|
|
+++ b/src/ldump.c
|
|
|
|
@@ -67,12 +67,12 @@ static void DumpString(const TString* s,
|
2009-02-23 01:54:26 +02:00
|
|
|
{
|
|
|
|
if (s==NULL || getstr(s)==NULL)
|
|
|
|
{
|
|
|
|
- size_t size=0;
|
|
|
|
+ unsigned int size=0;
|
|
|
|
DumpVar(size,D);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
- size_t size=s->tsv.len+1; /* include trailing '\0' */
|
|
|
|
+ unsigned int size=s->tsv.len+1; /* include trailing '\0' */
|
|
|
|
DumpVar(size,D);
|
|
|
|
DumpBlock(getstr(s),size,D);
|
|
|
|
}
|
2012-10-10 23:44:22 +03:00
|
|
|
--- a/src/lundump.c
|
|
|
|
+++ b/src/lundump.c
|
|
|
|
@@ -25,6 +25,7 @@ typedef struct {
|
2009-02-23 01:54:26 +02:00
|
|
|
ZIO* Z;
|
|
|
|
Mbuffer* b;
|
|
|
|
const char* name;
|
|
|
|
+ int swap;
|
|
|
|
} LoadState;
|
|
|
|
|
|
|
|
#ifdef LUAC_TRUST_BINARIES
|
2012-10-10 23:44:22 +03:00
|
|
|
@@ -40,7 +41,6 @@ static void error(LoadState* S, const ch
|
2009-02-23 01:54:26 +02:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
-#define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size))
|
|
|
|
#define LoadByte(S) (lu_byte)LoadChar(S)
|
|
|
|
#define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x))
|
|
|
|
#define LoadVector(S,b,n,size) LoadMem(S,b,n,size)
|
2012-10-10 23:44:22 +03:00
|
|
|
@@ -51,6 +51,49 @@ static void LoadBlock(LoadState* S, void
|
2009-02-23 01:54:26 +02:00
|
|
|
IF (r!=0, "unexpected end");
|
|
|
|
}
|
|
|
|
|
|
|
|
+static void LoadMem (LoadState* S, void* b, int n, size_t size)
|
|
|
|
+{
|
|
|
|
+ LoadBlock(S,b,n*size);
|
|
|
|
+ if (S->swap)
|
|
|
|
+ {
|
|
|
|
+ char* p=(char*) b;
|
|
|
|
+ char c;
|
|
|
|
+ switch (size)
|
|
|
|
+ {
|
|
|
|
+ case 1:
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ while (n--)
|
|
|
|
+ {
|
|
|
|
+ c=p[0]; p[0]=p[1]; p[1]=c;
|
|
|
|
+ p+=2;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 4:
|
|
|
|
+ while (n--)
|
|
|
|
+ {
|
|
|
|
+ c=p[0]; p[0]=p[3]; p[3]=c;
|
|
|
|
+ c=p[1]; p[1]=p[2]; p[2]=c;
|
|
|
|
+ p+=4;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 8:
|
|
|
|
+ while (n--)
|
|
|
|
+ {
|
|
|
|
+ c=p[0]; p[0]=p[7]; p[7]=c;
|
|
|
|
+ c=p[1]; p[1]=p[6]; p[6]=c;
|
|
|
|
+ c=p[2]; p[2]=p[5]; p[5]=c;
|
|
|
|
+ c=p[3]; p[3]=p[4]; p[4]=c;
|
|
|
|
+ p+=8;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ IF(1, "bad size");
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static int LoadChar(LoadState* S)
|
|
|
|
{
|
|
|
|
char x;
|
2012-10-10 23:44:22 +03:00
|
|
|
@@ -82,7 +125,7 @@ static lua_Integer LoadInteger(LoadState
|
2009-02-23 01:54:26 +02:00
|
|
|
|
|
|
|
static TString* LoadString(LoadState* S)
|
|
|
|
{
|
|
|
|
- size_t size;
|
|
|
|
+ unsigned int size;
|
|
|
|
LoadVar(S,size);
|
|
|
|
if (size==0)
|
|
|
|
return NULL;
|
2012-10-10 23:44:22 +03:00
|
|
|
@@ -196,6 +239,7 @@ static void LoadHeader(LoadState* S)
|
2009-02-23 01:54:26 +02:00
|
|
|
char s[LUAC_HEADERSIZE];
|
|
|
|
luaU_header(h);
|
|
|
|
LoadBlock(S,s,LUAC_HEADERSIZE);
|
|
|
|
+ S->swap=(s[6]!=h[6]); s[6]=h[6];
|
|
|
|
IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header");
|
|
|
|
}
|
|
|
|
|
2012-10-10 23:44:22 +03:00
|
|
|
@@ -230,7 +274,7 @@ void luaU_header (char* h)
|
2009-02-23 01:54:26 +02:00
|
|
|
*h++=(char)LUAC_FORMAT;
|
|
|
|
*h++=(char)*(char*)&x; /* endianness */
|
|
|
|
*h++=(char)sizeof(int);
|
|
|
|
- *h++=(char)sizeof(size_t);
|
|
|
|
+ *h++=(char)sizeof(unsigned int);
|
|
|
|
*h++=(char)sizeof(Instruction);
|
|
|
|
*h++=(char)sizeof(lua_Number);
|
|
|
|
|