To: vim_dev@googlegroups.com Subject: Patch 8.2.3244 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3244 Problem: Lua 5.3 print() with a long string crashes. Solution: Use a growarray instead of a Lua buffer. (Yegappan Lakshmanan, closes #8655) Files: src/if_lua.c, src/misc2.c, src/proto/misc2.pro *** ../vim-8.2.3243/src/if_lua.c 2021-07-28 21:48:55.841029431 +0200 --- src/if_lua.c 2021-07-29 20:21:17.070130835 +0200 *************** *** 1720,1730 **** static int luaV_print(lua_State *L) { ! int i, n = lua_gettop(L); // nargs ! const char *s; ! size_t l; ! luaL_Buffer b; ! luaL_buffinit(L, &b); lua_getglobal(L, "tostring"); for (i = 1; i <= n; i++) { --- 1720,1731 ---- static int luaV_print(lua_State *L) { ! int i, n = lua_gettop(L); // nargs ! const char *s; ! size_t l; ! garray_T msg_ga; ! ! ga_init2(&msg_ga, 1, 128); lua_getglobal(L, "tostring"); for (i = 1; i <= n; i++) { *************** *** 1735,1747 **** if (s == NULL) return luaL_error(L, "cannot convert to string"); if (i > 1) ! luaL_addchar(&b, ' '); // use space instead of tab ! luaV_addlstring(&b, s, l, 0); lua_pop(L, 1); } ! luaL_pushresult(&b); if (!got_int) luaV_msg(L); return 0; } --- 1736,1754 ---- if (s == NULL) return luaL_error(L, "cannot convert to string"); if (i > 1) ! ga_append(&msg_ga, ' '); // use space instead of tab ! ga_concat_len(&msg_ga, (char_u *)s, l); lua_pop(L, 1); } ! // Replace any "\n" with "\0" ! for (i = 0; i < msg_ga.ga_len; i++) ! if (((char *)msg_ga.ga_data)[i] == '\n') ! ((char *)msg_ga.ga_data)[i] = '\0'; ! lua_pushlstring(L, msg_ga.ga_data, msg_ga.ga_len); if (!got_int) luaV_msg(L); + + ga_clear(&msg_ga); return 0; } *** ../vim-8.2.3243/src/misc2.c 2021-07-27 21:17:28.483675842 +0200 --- src/misc2.c 2021-07-29 20:16:52.722766250 +0200 *************** *** 1566,1571 **** --- 1566,1587 ---- } /* + * Concatenate 'len' bytes from string 's' to a growarray. + * When "s" is NULL does not do anything. + */ + void + ga_concat_len(garray_T *gap, char_u *s, size_t len) + { + if (s == NULL || *s == NUL) + return; + if (ga_grow(gap, len) == OK) + { + mch_memmove((char *)gap->ga_data + gap->ga_len, s, (size_t)len); + gap->ga_len += len; + } + } + + /* * Append one byte to a growarray which contains bytes. */ void *** ../vim-8.2.3243/src/proto/misc2.pro 2021-07-27 21:17:28.483675842 +0200 --- src/proto/misc2.pro 2021-07-29 20:16:52.722766250 +0200 *************** *** 45,50 **** --- 45,51 ---- char_u *ga_concat_strings(garray_T *gap, char *sep); int ga_add_string(garray_T *gap, char_u *p); void ga_concat(garray_T *gap, char_u *s); + void ga_concat_len(garray_T *gap, char_u *s, size_t len); void ga_append(garray_T *gap, int c); void append_ga_line(garray_T *gap); int simplify_key(int key, int *modifiers); *** ../vim-8.2.3243/src/version.c 2021-07-29 19:18:29.587186625 +0200 --- src/version.c 2021-07-29 20:18:40.038508094 +0200 *************** *** 757,758 **** --- 757,760 ---- { /* Add new patch number below this line */ + /**/ + 3244, /**/ -- "Time flies like an arrow". So I put an arrow on my desk, now awaiting one of these time flies showing up. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///