diff options
author | Mike Pall <mike> | 2012-05-03 19:04:44 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-05-03 19:04:44 +0200 |
commit | 53a285c0c3544ff5dea7c67b741c3c2d06d22b47 (patch) | |
tree | bbe5e5a6d385f872cae1f5b4ae52d98b3fd6c489 /src | |
parent | eec0d80d1b9767beef0c38168b772a2b49175268 (diff) | |
download | luajit-53a285c0c3544ff5dea7c67b741c3c2d06d22b47.tar.gz luajit-53a285c0c3544ff5dea7c67b741c3c2d06d22b47.tar.bz2 luajit-53a285c0c3544ff5dea7c67b741c3c2d06d22b47.zip |
Disable loading bytecode with an extra header (BOM or #!).
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_errmsg.h | 1 | ||||
-rw-r--r-- | src/lj_lex.c | 18 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/lj_errmsg.h b/src/lj_errmsg.h index 83c69ea8..d1db4386 100644 --- a/src/lj_errmsg.h +++ b/src/lj_errmsg.h | |||
@@ -139,6 +139,7 @@ ERRDEF(XFOR, LUA_QL("=") " or " LUA_QL("in") " expected") | |||
139 | /* Bytecode reader errors. */ | 139 | /* Bytecode reader errors. */ |
140 | ERRDEF(BCFMT, "cannot load incompatible bytecode") | 140 | ERRDEF(BCFMT, "cannot load incompatible bytecode") |
141 | ERRDEF(BCBAD, "cannot load malformed bytecode") | 141 | ERRDEF(BCBAD, "cannot load malformed bytecode") |
142 | ERRDEF(BCHEAD, "attempt to load bytecode with extra header") | ||
142 | 143 | ||
143 | #if LJ_HASFFI | 144 | #if LJ_HASFFI |
144 | /* FFI errors. */ | 145 | /* FFI errors. */ |
diff --git a/src/lj_lex.c b/src/lj_lex.c index d87a49dc..669d2dfe 100644 --- a/src/lj_lex.c +++ b/src/lj_lex.c | |||
@@ -411,6 +411,7 @@ static int llex(LexState *ls, TValue *tv) | |||
411 | /* Setup lexer state. */ | 411 | /* Setup lexer state. */ |
412 | int lj_lex_setup(lua_State *L, LexState *ls) | 412 | int lj_lex_setup(lua_State *L, LexState *ls) |
413 | { | 413 | { |
414 | int header = 0; | ||
414 | ls->L = L; | 415 | ls->L = L; |
415 | ls->fs = NULL; | 416 | ls->fs = NULL; |
416 | ls->n = 0; | 417 | ls->n = 0; |
@@ -430,6 +431,7 @@ int lj_lex_setup(lua_State *L, LexState *ls) | |||
430 | ls->n -= 2; | 431 | ls->n -= 2; |
431 | ls->p += 2; | 432 | ls->p += 2; |
432 | next(ls); | 433 | next(ls); |
434 | header = 1; | ||
433 | } | 435 | } |
434 | if (ls->current == '#') { /* Skip POSIX #! header line. */ | 436 | if (ls->current == '#') { /* Skip POSIX #! header line. */ |
435 | do { | 437 | do { |
@@ -437,8 +439,22 @@ int lj_lex_setup(lua_State *L, LexState *ls) | |||
437 | if (ls->current == END_OF_STREAM) return 0; | 439 | if (ls->current == END_OF_STREAM) return 0; |
438 | } while (!currIsNewline(ls)); | 440 | } while (!currIsNewline(ls)); |
439 | inclinenumber(ls); | 441 | inclinenumber(ls); |
442 | header = 1; | ||
440 | } | 443 | } |
441 | return (ls->current == LUA_SIGNATURE[0]); /* Bytecode dump? */ | 444 | if (ls->current == LUA_SIGNATURE[0]) { /* Bytecode dump. */ |
445 | if (header) { | ||
446 | /* | ||
447 | ** Loading bytecode with an extra header is disabled for security | ||
448 | ** reasons. This may circumvent the usual check for bytecode vs. | ||
449 | ** Lua code by looking at the first char. Since this is a potential | ||
450 | ** security violation no attempt is made to echo the chunkname either. | ||
451 | */ | ||
452 | setstrV(L, L->top++, lj_err_str(L, LJ_ERR_BCHEAD)); | ||
453 | lj_err_throw(L, LUA_ERRSYNTAX); | ||
454 | } | ||
455 | return 1; | ||
456 | } | ||
457 | return 0; | ||
442 | } | 458 | } |
443 | 459 | ||
444 | /* Cleanup lexer state. */ | 460 | /* Cleanup lexer state. */ |