summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Wilgus <me.theuser@yahoo.com>2018-11-02 14:13:27 -0400
committerWilliam Wilgus <me.theuser@yahoo.com>2018-11-02 23:18:30 -0400
commitd9f9def505b367b9361ba96d33e6edf1687716fb (patch)
tree9fd2c48e10c8c193bb6f55fa077eddc237b717c2
parentf6e10b84882387e304467f22ea2f6126cbaa1264 (diff)
Lua fix failure to read lines longer than LUAL_BUFFERSIZE
Readline didn't handle lines longer than LUAL_BUFFERSIZE it now reads these in chunks. Change-Id: Iffe12447e5441ff6b479ce3de1d36df64c276183
-rw-r--r--apps/plugins/lua/liolib.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/apps/plugins/lua/liolib.c b/apps/plugins/lua/liolib.c
index 6744efedd5..fb6765492b 100644
--- a/apps/plugins/lua/liolib.c
+++ b/apps/plugins/lua/liolib.c
@@ -269,22 +269,19 @@ static int _read_line (lua_State *L, int *f) {
luaL_buffinit(L, &b);
for (;;) {
size_t l;
- off_t r;
char *p = luaL_prepbuffer(&b);
- r = rb->read_line(*f, p, LUAL_BUFFERSIZE);
- l = strlen(p);
-
- if (l == 0 || p[l-1] != '\n')
- luaL_addsize(&b, l);
- else {
- luaL_addsize(&b, l - 1); /* do not include `eol' */
+ off_t r = rb->read_line(*f, p, LUAL_BUFFERSIZE); /* does not include `eol' */
+ if (r <= 0) { /* eof? */
luaL_pushresult(&b); /* close buffer */
- return 1; /* read at least an `eol' */
- }
- if (r < LUAL_BUFFERSIZE) { /* eof? */
- luaL_pushresult(&b); /* close buffer */
- return (r > 0); /* check whether read something */
+ return (lua_objlen(L, -1) > 0); /* check whether read something */
}
+ l = strlen(p);
+ luaL_addsize(&b, l);
+ if(r >= LUAL_BUFFERSIZE - 1)
+ continue; /* more to read */
+
+ luaL_pushresult(&b); /* close buffer */
+ return 1; /* we read at least 1 character */
}
}