[Tarantool-patches] [PATCH v1 2/2] sql: ignore \0 in string passed to Lua-function

Mergen Imeev imeevma at tarantool.org
Thu Apr 1 15:01:56 MSK 2021


Sorry, I found that '\0' in changelog file name was a bad idea. Quite a few
CI runs failed. I renamed this file and force-pushed this patch. Diff below.

On Thu, Apr 01, 2021 at 11:41:02AM +0300, Mergen Imeev via Tarantool-patches wrote:
> On Wed, Mar 31, 2021 at 10:25:23PM +0200, Vladislav Shpilevoy wrote:
> > Good job on the patch!
> Thank you! My answers and new patch below.
> 
> > 
> > See 2 comments below.
> > 
> > 1. Please, add a changelog file.
> Added.
> 
> > 
> > On 30.03.2021 13:21, Mergen Imeev via Tarantool-patches wrote:
> > > Prior to this patch string passed to user-defined Lua-function from SQL
> > > was cropped in case it contains '\0'. At the same time, it wasn't
> > > cropped if it is passed to the function from BOX. After this patch the
> > > string won't be cropped when passed from SQL if it contain '\0'.
> > > 
> > > Closes #5938
> > > ---
> > >  src/box/sql/func.c                            |  3 ++-
> > >  .../gh-5938-wrong-string-length.test.lua      | 19 ++++++++++++++++++-
> > >  2 files changed, 20 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/src/box/sql/func.c b/src/box/sql/func.c
> > > index c3c14bd22..7d5a55d3f 100644
> > > --- a/src/box/sql/func.c
> > > +++ b/src/box/sql/func.c
> > > @@ -120,7 +120,8 @@ port_vdbemem_dump_lua(struct port *base, struct lua_State *L, bool is_flat)
> > >  			lua_pushnumber(L, sql_value_double(param));
> > >  			break;
> > >  		case MP_STR:
> > > -			lua_pushstring(L, (const char *) sql_value_text(param));
> > > +			lua_pushlstring(L, (const char *) sql_value_text(param),
> > > +					(size_t) sql_value_bytes(param));
> > 
> > 2. Unary operators should not have a whitespace after them.
> Fixed.
> 
> > 
> > >  			break;
> > >  		case MP_BIN:
> > >  		case MP_ARRAY:
> 
> 
> New patch:
> 
> 
> commit 337a6cddd1d9e70c77e3ba48600b5d5ec9477dd7
> Author: Mergen Imeev <imeevma at gmail.com>
> Date:   Tue Mar 30 09:41:34 2021 +0300
> 
>     sql: ignore \0 in string passed to Lua-function
>     
>     Prior to this patch string passed to user-defined Lua-function from SQL
>     was cropped in case it contains '\0'. At the same time, it wasn't
>     cropped if it is passed to the function from BOX. After this patch the
>     string won't be cropped when passed from SQL if it contain '\0'.
>     
>     Closes #5938
> 
> diff --git "a/changelogs/unreleased/fix-crop-strings-by-\\0-in-user-functions.md" "b/changelogs/unreleased/fix-crop-strings-by-\\0-in-user-functions.md"
> new file mode 100644
> index 000000000..a0aa8a425
> --- /dev/null
> +++ "b/changelogs/unreleased/fix-crop-strings-by-\\0-in-user-functions.md"
> @@ -0,0 +1,4 @@
> +## bugfix/sql
> +
> +* Fixed cropping of a string if it contains '\0' when passing a string
> +  to user-defined Lua or C functions.
> diff --git a/src/box/sql/func.c b/src/box/sql/func.c
> index c3c14bd22..9b6179f3a 100644
> --- a/src/box/sql/func.c
> +++ b/src/box/sql/func.c
> @@ -120,7 +120,8 @@ port_vdbemem_dump_lua(struct port *base, struct lua_State *L, bool is_flat)
>  			lua_pushnumber(L, sql_value_double(param));
>  			break;
>  		case MP_STR:
> -			lua_pushstring(L, (const char *) sql_value_text(param));
> +			lua_pushlstring(L, (const char *)sql_value_text(param),
> +					(size_t)sql_value_bytes(param));
>  			break;
>  		case MP_BIN:
>  		case MP_ARRAY:
> diff --git a/test/sql-tap/gh-5938-wrong-string-length.test.lua b/test/sql-tap/gh-5938-wrong-string-length.test.lua
> index 943389e34..415fc7729 100755
> --- a/test/sql-tap/gh-5938-wrong-string-length.test.lua
> +++ b/test/sql-tap/gh-5938-wrong-string-length.test.lua
> @@ -3,7 +3,7 @@ local build_path = os.getenv("BUILDDIR")
>  package.cpath = build_path..'/test/sql-tap/?.so;'..build_path..'/test/sql-tap/?.dylib;'..package.cpath
>  
>  local test = require("sqltester")
> -test:plan(1)
> +test:plan(2)
>  
>  box.schema.func.create("gh-5938-wrong-string-length.ret_str", {
>      language = "C",
> @@ -25,4 +25,21 @@ test:do_execsql_test(
>          "This is a complete string","This is a cropped\0 string"
>      })
>  
> +box.schema.func.create("ret_str", {
> +    language = "Lua",
> +    body = [[function(str) return str end]],
> +    param_list = { "string" },
> +    returns = "string",
> +    exports = { "LUA", "SQL" },
> +    is_deterministic = true
> +})
> +
> +test:do_execsql_test(
> +    "gh-5938-2",
> +    [[
> +        SELECT "ret_str"(s) from t;
> +    ]], {
> +        "This is a complete string","This is a cropped\0 string"
> +    })
> +
>  test:finish_test()


Diff:


commit f13a1b4ddda6b6a26a7140fc67268f0ecf498a64
Author: Mergen Imeev <imeevma at gmail.com>
Date:   Thu Apr 1 13:39:12 2021 +0300

    Fix

diff --git "a/changelogs/unreleased/fix-crop-strings-by-\\0-in-user-functions.md" b/changelogs/unreleased/fix-string-cropping-in-user-functions.md
similarity index 100%
rename from "changelogs/unreleased/fix-crop-strings-by-\\0-in-user-functions.md"
rename to changelogs/unreleased/fix-string-cropping-in-user-functions.md


More information about the Tarantool-patches mailing list