[tarantool-patches] [PATCH v2] box: fix long uri output in box.info()

Serge Petrenko sergepetrenko at tarantool.org
Tue Aug 21 09:27:47 MSK 2018


lua_pushapplier() had an inexplicably small buffer for uri representation.
Enlarged the buffer. Also uri_format() didn't ensure that its return value
was not greater than the length of string passed to it. Also fixed and
added a test case.

Closes #3630
---
https://github.com/tarantool/tarantool/issues/3630
https://github.com/tarantool/tarantool/tree/sp/gh-3630-long-uri-fix

Changes in v2:
  - fix uri_format() return value.
  - add a unit test for uri_format()

 src/box/lua/info.c   |  2 +-
 src/uri.c            |  3 ++-
 test/unit/uri.c      | 29 ++++++++++++++++++++++++++++-
 test/unit/uri.result |  9 ++++++++-
 4 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/src/box/lua/info.c b/src/box/lua/info.c
index d6697df9c..970c80c99 100644
--- a/src/box/lua/info.c
+++ b/src/box/lua/info.c
@@ -95,7 +95,7 @@ lbox_pushapplier(lua_State *L, struct applier *applier)
 			       applier->last_row_time);
 		lua_settable(L, -3);
 
-		char name[FIBER_NAME_MAX];
+		char name[APPLIER_SOURCE_MAXLEN];
 		int total = uri_format(name, sizeof(name), &applier->uri, false);
 
 		lua_pushstring(L, "peer");
diff --git a/src/uri.c b/src/uri.c
index 941e7bab9..77a1c88f6 100644
--- a/src/uri.c
+++ b/src/uri.c
@@ -6303,6 +6303,7 @@ int
 uri_format(char *str, int len, const struct uri *uri, bool write_password)
 {
 	int total = 0;
+	int maxlen = len - 1;
 	if (uri->scheme_len > 0) {
 		SNPRINT(total, snprintf, str, len, "%.*s://",
 			 (int)uri->scheme_len, uri->scheme);
@@ -6337,7 +6338,7 @@ uri_format(char *str, int len, const struct uri *uri, bool write_password)
 		SNPRINT(total, snprintf, str, len, "#%.*s",
 			(int)uri->fragment_len, uri->fragment);
 	}
-	return total;
+	return MIN(total, maxlen);
 }
 
 /* vim: set ft=ragel: */
diff --git a/test/unit/uri.c b/test/unit/uri.c
index b69f92726..c3c20b176 100644
--- a/test/unit/uri.c
+++ b/test/unit/uri.c
@@ -59,10 +59,35 @@ test_invalid()
 	return check_plan();
 }
 
+int
+test_format()
+{
+	plan(5);
+
+	struct uri uri;
+
+	char str[] = "aurithatslongerthan16symbols:3303";
+	char ret_str[16];
+	char long_str[64];
+	is(uri_parse(&uri, str), 0, "parse successful");
+	is(uri_format(ret_str, sizeof(ret_str), &uri, false),
+	   sizeof(ret_str) - 1, "uri_format returns correct length when"\
+	   " string is too long");
+	is(strncmp(ret_str, str, sizeof(ret_str) - 1), 0, "string is correct");
+	/*
+	 * SNPRINT used in uri_format doesn't count the
+	 * terminating zero. So expected length is sizeof(str) - 1.
+	 */
+	is(uri_format(long_str, sizeof(long_str), &uri, false),
+	   sizeof(str) - 1, "uri_format returns correct length when string fits");
+	is(strcmp(long_str, str), 0, "string is correct");
+	return check_plan();
+}
+
 int
 main(void)
 {
-	plan(63);
+	plan(64);
 
 	/* General */
 	test("host", NULL, NULL, NULL, "host", NULL, NULL, NULL, NULL, 0);
@@ -234,5 +259,7 @@ main(void)
 
 	test_invalid();
 
+	test_format();
+
 	return check_plan();
 }
diff --git a/test/unit/uri.result b/test/unit/uri.result
index 804560b69..7ca9ba2da 100644
--- a/test/unit/uri.result
+++ b/test/unit/uri.result
@@ -1,4 +1,4 @@
-1..63
+1..64
     1..19
     ok 1 - host: parse
     ok 2 - host: scheme
@@ -1305,3 +1305,10 @@ ok 62 - subtests
     ok 1 - empty is invalid
     ok 2 - :// is invalid
 ok 63 - subtests
+    1..5
+    ok 1 - parse successful
+    ok 2 - uri_format returns correct length when string is too long
+    ok 3 - string is correct
+    ok 4 - uri_format returns correct length when string fits
+    ok 5 - string is correct
+ok 64 - subtests
-- 
2.15.2 (Apple Git-101.1)





More information about the Tarantool-patches mailing list