lua: honour size argument in recv() function
authorJo-Philipp Wich <jo@mein.io>
Wed, 24 Jan 2018 18:45:00 +0000 (19:45 +0100)
committerJo-Philipp Wich <jo@mein.io>
Wed, 24 Jan 2018 19:19:59 +0000 (20:19 +0100)
The existing implementation incorrectly attempted to read the entire stdin
instead of fetching at most the given amount of bytes.

While we're at it, also make the size argument optional and let it default
to Luas internal buffer size.

Suggested-by: Bryan Mayland <bmayland+lede@capnbry.net>
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
lua.c

diff --git a/lua.c b/lua.c
index 3efe22bd9e21a0d4d924698937f39243b18566d4..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;
        }