From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp59.i.mail.ru (smtp59.i.mail.ru [217.69.128.39]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 4A354469719 for ; Sat, 15 Feb 2020 12:31:59 +0300 (MSK) From: olegrok@tarantool.org Date: Sat, 15 Feb 2020 12:31:56 +0300 Message-Id: <20200215093156.32021-1-olegrok@tarantool.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH] lua: handle uri.format empty input properly List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org, v.shpilevoy@tarantool.org, alexander.turenko@tarantool.org Cc: Oleg Babin From: Oleg Babin After 7fd6c8096343ca254fec10c2ce8a8233ebe47028 (buffer: port static allocator to Lua) uri started to use static_allocator - cyclic buffer that also is used in several modules. However situation then uri.format output is zero-length string was not handled properly and ffi.string could return data that was previously written in static buffer because use as string terminator the first zero byte. To prevent such situation let's pass result length explicitly. Closes #4779 --- Issue: https://github.com/tarantool/tarantool/issues/4779 Branch: https://github.com/tarantool/tarantool/tree/olegrok/4779-uri-format-junk-output src/lua/uri.lua | 4 ++-- test/app-tap/uri.test.lua | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/lua/uri.lua b/src/lua/uri.lua index 5967c8bf2..e08e20675 100644 --- a/src/lua/uri.lua +++ b/src/lua/uri.lua @@ -77,8 +77,8 @@ local function format(uri, write_password) uribuf.fragment = uri.fragment uribuf.fragment_len = string.len(uri.fragment or '') local str = static_alloc('char', 1024) - builtin.uri_format(str, 1024, uribuf, write_password and 1 or 0) - return ffi.string(str) + local len = builtin.uri_format(str, 1024, uribuf, write_password and 1 or 0) + return ffi.string(str, len) end return { diff --git a/test/app-tap/uri.test.lua b/test/app-tap/uri.test.lua index 5405b0873..27efe6bc6 100755 --- a/test/app-tap/uri.test.lua +++ b/test/app-tap/uri.test.lua @@ -2,6 +2,8 @@ local tap = require('tap') local uri = require('uri') +local ffi = require('ffi') +local static_alloc = require('buffer').static_alloc local function test_parse(test) -- Tests for uri.parse() Lua bindings. @@ -64,8 +66,22 @@ local function test_format(test) test:is(uri.format(u, true), "user:password@localhost", "password kept") end +local function test_static_alloc(test) + -- gh-4779 uri.format returns junk output + local buffer_size = 12288 + local buf = static_alloc('char', buffer_size) + ffi.fill(buf, 512, string.byte('x')) + + local iterations = 10 + test:plan(iterations) + for _ = 1, iterations do + test:is(uri.format({}), '') + end +end + tap.test("uri", function(test) - test:plan(2) + test:plan(3) test:test("parse", test_parse) test:test("format", test_format) + test:test("static_alloc", test_static_alloc) end) -- 2.23.0