Line data Source code
1 :
2 : /*
3 : * Copyright (C) Xiaozhe Wang (chaoslawful)
4 : * Copyright (C) Yichun Zhang (agentzh)
5 : */
6 :
7 :
8 : #ifndef DDEBUG
9 : #define DDEBUG 0
10 : #endif
11 : #include "ddebug.h"
12 :
13 :
14 : #include "ngx_http_lua_exception.h"
15 : #include "ngx_http_lua_util.h"
16 :
17 :
18 : /* longjmp mark for restoring nginx execution after Lua VM crashing */
19 : jmp_buf ngx_http_lua_exception;
20 :
21 : /**
22 : * Override default Lua panic handler, output VM crash reason to nginx error
23 : * log, and restore execution to the nearest jmp-mark.
24 : *
25 : * @param L Lua state pointer
26 : * @retval Long jump to the nearest jmp-mark, never returns.
27 : * @note nginx request pointer should be stored in Lua thread's globals table
28 : * in order to make logging working.
29 : * */
30 : int
31 0 : ngx_http_lua_atpanic(lua_State *L)
32 : {
33 : #ifdef NGX_LUA_ABORT_AT_PANIC
34 0 : abort();
35 : #else
36 : u_char *s = NULL;
37 : size_t len = 0;
38 :
39 : if (lua_type(L, -1) == LUA_TSTRING) {
40 : s = (u_char *) lua_tolstring(L, -1, &len);
41 : }
42 :
43 : if (s == NULL) {
44 : s = (u_char *) "unknown reason";
45 : len = sizeof("unknown reason") - 1;
46 : }
47 :
48 : ngx_log_stderr(0, "lua atpanic: Lua VM crashed, reason: %*s", len, s);
49 : ngx_quit = 1;
50 :
51 : /* restore nginx execution */
52 : NGX_LUA_EXCEPTION_THROW(1);
53 :
54 : /* impossible to reach here */
55 : #endif
56 : }
57 :
58 : /* vi:set ft=c ts=4 sw=4 et fdm=marker: */
|