Disable loading bytecode with an extra header (BOM or #!).

This commit is contained in:
Mike Pall 2012-05-03 19:04:44 +02:00
parent eec0d80d1b
commit 53a285c0c3
2 changed files with 18 additions and 1 deletions

View File

@ -139,6 +139,7 @@ ERRDEF(XFOR, LUA_QL("=") " or " LUA_QL("in") " expected")
/* Bytecode reader errors. */ /* Bytecode reader errors. */
ERRDEF(BCFMT, "cannot load incompatible bytecode") ERRDEF(BCFMT, "cannot load incompatible bytecode")
ERRDEF(BCBAD, "cannot load malformed bytecode") ERRDEF(BCBAD, "cannot load malformed bytecode")
ERRDEF(BCHEAD, "attempt to load bytecode with extra header")
#if LJ_HASFFI #if LJ_HASFFI
/* FFI errors. */ /* FFI errors. */

View File

@ -411,6 +411,7 @@ static int llex(LexState *ls, TValue *tv)
/* Setup lexer state. */ /* Setup lexer state. */
int lj_lex_setup(lua_State *L, LexState *ls) int lj_lex_setup(lua_State *L, LexState *ls)
{ {
int header = 0;
ls->L = L; ls->L = L;
ls->fs = NULL; ls->fs = NULL;
ls->n = 0; ls->n = 0;
@ -430,6 +431,7 @@ int lj_lex_setup(lua_State *L, LexState *ls)
ls->n -= 2; ls->n -= 2;
ls->p += 2; ls->p += 2;
next(ls); next(ls);
header = 1;
} }
if (ls->current == '#') { /* Skip POSIX #! header line. */ if (ls->current == '#') { /* Skip POSIX #! header line. */
do { do {
@ -437,8 +439,22 @@ int lj_lex_setup(lua_State *L, LexState *ls)
if (ls->current == END_OF_STREAM) return 0; if (ls->current == END_OF_STREAM) return 0;
} while (!currIsNewline(ls)); } while (!currIsNewline(ls));
inclinenumber(ls); inclinenumber(ls);
header = 1;
} }
return (ls->current == LUA_SIGNATURE[0]); /* Bytecode dump? */ if (ls->current == LUA_SIGNATURE[0]) { /* Bytecode dump. */
if (header) {
/*
** Loading bytecode with an extra header is disabled for security
** reasons. This may circumvent the usual check for bytecode vs.
** Lua code by looking at the first char. Since this is a potential
** security violation no attempt is made to echo the chunkname either.
*/
setstrV(L, L->top++, lj_err_str(L, LJ_ERR_BCHEAD));
lj_err_throw(L, LUA_ERRSYNTAX);
}
return 1;
}
return 0;
} }
/* Cleanup lexer state. */ /* Cleanup lexer state. */