lua: honour size argument in recv() function
[project/uhttpd.git] / lua.c
diff --git a/lua.c b/lua.c
index 213490483e469f9c929b507db0afc9e0c8b5cf4a..abae88cb26c8db6dcb5ffadc3e445d79790fa088 100644 (file)
--- a/lua.c
+++ b/lua.c
@@ -46,13 +46,14 @@ static int uh_lua_recv(lua_State *L)
        int len;
        int r;
 
-       len = luaL_checknumber(L, 1);
+       len = luaL_optnumber(L, 1, LUAL_BUFFERSIZE);
        luaL_buffinit(L, &B);
        while(len > 0) {
                char *buf;
 
                buf = luaL_prepbuffer(&B);
-               r = read(STDIN_FILENO, buf, LUAL_BUFFERSIZE);
+               r = read(STDIN_FILENO, buf,
+                        len < LUAL_BUFFERSIZE ? len : LUAL_BUFFERSIZE);
                if (r < 0) {
                        if (errno == EWOULDBLOCK || errno == EAGAIN) {
                                pfd.revents = 0;
@@ -72,6 +73,7 @@ static int uh_lua_recv(lua_State *L)
 
                luaL_addsize(&B, r);
                data_len += r;
+               len -= r;
                if (r != LUAL_BUFFERSIZE)
                        break;
        }
@@ -222,6 +224,10 @@ static void lua_main(struct client *cl, struct path_info *pi, char *url)
                        pi->query = str + 1;
                path_len = str - url;
        }
+
+       if (prefix_len > 0 && conf.lua_prefix[prefix_len - 1] == '/')
+               prefix_len--;
+
        if (path_len > prefix_len) {
                lua_pushlstring(L, url + prefix_len,
                                path_len - prefix_len);