diff options
| author | alnsn <alnsn@NetBSD.org> | 2017-05-28 22:37:36 +0000 |
|---|---|---|
| committer | alnsn <alnsn@NetBSD.org> | 2017-05-28 22:37:36 +0000 |
| commit | fcf223e1c8064d565336533ce9fabceba86c1a5e (patch) | |
| tree | 26d07b85d70920255a86ca7595e02c9b7a0cad11 /libexec/httpd | |
| parent | 229b875b994fd9e225466ffb79cde53dfcb358f6 (diff) | |
Cosmetic changes to Lua binding in bozohttpd.
- Don't use negative indicies to read arguments of Lua functions.
- On error, return nil, "error string".
- Use ssize_t for return values from bozo_read() and bozo_write().
- Prefer lstring especially when if saves you from appending NUL and
doing len + 1 which can potentially wraparound.
- Don't mix C allocations with Lua functions marked with "m" in the Lua
manual. Those functions may throw (longjump) and leak data allocated
by C function. In one case, I use luaL_Buffer, in the other case,
I rearranged calls a bit.
Diffstat (limited to 'libexec/httpd')
| -rw-r--r-- | libexec/httpd/lua-bozo.c | 93 |
1 files changed, 49 insertions, 44 deletions
diff --git a/libexec/httpd/lua-bozo.c b/libexec/httpd/lua-bozo.c index d57a1f7950a..d123659e11a 100644 --- a/libexec/httpd/lua-bozo.c +++ b/libexec/httpd/lua-bozo.c @@ -1,4 +1,4 @@ -/* $NetBSD: lua-bozo.c,v 1.14 2015/12/28 07:37:59 mrg Exp $ */ +/* $NetBSD: lua-bozo.c,v 1.15 2017/05/28 22:37:36 alnsn Exp $ */ /* * Copyright (c) 2013 Marc Balmer <marc@msys.ch> @@ -51,8 +51,8 @@ #define FORM "application/x-www-form-urlencoded" -static int -lua_flush(lua_State *L) +static bozohttpd_t * +httpd_instance(lua_State *L) { bozohttpd_t *httpd; @@ -61,6 +61,14 @@ lua_flush(lua_State *L) httpd = lua_touserdata(L, -1); lua_pop(L, 1); + return httpd; +} + +static int +lua_flush(lua_State *L) +{ + bozohttpd_t *httpd = httpd_instance(L); + bozo_flush(httpd, stdout); return 0; } @@ -68,63 +76,57 @@ lua_flush(lua_State *L) static int lua_print(lua_State *L) { - bozohttpd_t *httpd; - - lua_pushstring(L, "bozohttpd"); - lua_gettable(L, LUA_REGISTRYINDEX); - httpd = lua_touserdata(L, -1); - lua_pop(L, 1); + bozohttpd_t *httpd = httpd_instance(L); - bozo_printf(httpd, "%s\r\n", lua_tostring(L, -1)); + bozo_printf(httpd, "%s\r\n", lua_tostring(L, 1)); return 0; } static int lua_read(lua_State *L) { - bozohttpd_t *httpd; - int n, len; + bozohttpd_t *httpd = httpd_instance(L); + luaL_Buffer lbuf; char *data; + lua_Integer len; + ssize_t n; - lua_pushstring(L, "bozohttpd"); - lua_gettable(L, LUA_REGISTRYINDEX); - httpd = lua_touserdata(L, -1); - lua_pop(L, 1); + len = luaL_checkinteger(L, 1); + data = luaL_buffinitsize(L, &lbuf, (size_t)len); - len = luaL_checkinteger(L, -1); - data = bozomalloc(httpd, len + 1); - n = bozo_read(httpd, STDIN_FILENO, data, len); - if (n >= 0) { - data[n] = '\0'; - lua_pushstring(L, data); - } else + if ((n = bozo_read(httpd, STDIN_FILENO, data, len)) >= 0) { + luaL_pushresultsize(&lbuf, n); + return 1; + } else { lua_pushnil(L); - free(data); - return 1; + lua_pushstring(L, "bozo_read() call failed"); + return 2; + } } static int lua_register_handler(lua_State *L) { + bozohttpd_t *httpd = httpd_instance(L); lua_state_map_t *map; lua_handler_t *handler; - bozohttpd_t *httpd; + const char *name; + int ref; lua_pushstring(L, "lua_state_map"); lua_gettable(L, LUA_REGISTRYINDEX); map = lua_touserdata(L, -1); - lua_pushstring(L, "bozohttpd"); - lua_gettable(L, LUA_REGISTRYINDEX); - httpd = lua_touserdata(L, -1); - lua_pop(L, 2); + lua_pop(L, 1); + + name = luaL_checkstring(L, 1); - luaL_checkstring(L, 1); luaL_checktype(L, 2, LUA_TFUNCTION); + lua_pushvalue(L, 2); + ref = luaL_ref(L, LUA_REGISTRYINDEX); handler = bozomalloc(httpd, sizeof(lua_handler_t)); - - handler->name = bozostrdup(httpd, NULL, lua_tostring(L, 1)); - handler->ref = luaL_ref(L, LUA_REGISTRYINDEX); + handler->name = bozostrdup(httpd, NULL, name); + handler->ref = ref; SIMPLEQ_INSERT_TAIL(&map->handlers, handler, h_next); httpd->process_lua = 1; return 0; @@ -133,23 +135,26 @@ lua_register_handler(lua_State *L) static int lua_write(lua_State *L) { - bozohttpd_t *httpd; + bozohttpd_t *httpd = httpd_instance(L); const char *data; + size_t len; + ssize_t n; - lua_pushstring(L, "bozohttpd"); - lua_gettable(L, LUA_REGISTRYINDEX); - httpd = lua_touserdata(L, -1); - lua_pop(L, 1); - - data = luaL_checkstring(L, -1); - lua_pushinteger(L, bozo_write(httpd, STDIN_FILENO, data, strlen(data))); - return 1; + data = luaL_checklstring(L, 1, &len); + if ((n = bozo_write(httpd, STDIN_FILENO, data, len)) >= 0) { + lua_pushinteger(L, n); + return 1; + } else { + lua_pushnil(L); + lua_pushstring(L, "bozo_write() call failed"); + return 2; + } } static int luaopen_httpd(lua_State *L) { - struct luaL_Reg functions[] = { + static struct luaL_Reg functions[] = { { "flush", lua_flush }, { "print", lua_print }, { "read", lua_read }, |
