From 302a9a3d4e0d1d2d014fbb869a269162083ae98c Mon Sep 17 00:00:00 2001
From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
Date: Wed, 25 Oct 2017 20:43:42 +0300
Subject: [PATCH] xrow: fix error in request_str

Check request fields on NULL before print.
---
 src/box/xrow.c        | 15 +++++++++++++--
 test/unit/xrow.cc     | 34 +++++++++++++++++++++++++++++++++-
 test/unit/xrow.result |  5 ++++-
 3 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/src/box/xrow.c b/src/box/xrow.c
index 20f996c7b1..f5fe878f8d 100644
--- a/src/box/xrow.c
+++ b/src/box/xrow.c
@@ -436,12 +436,23 @@ request_str(const struct request *request)
 	char *end = buf + TT_STATIC_BUF_LEN;
 	char *pos = buf;
 	pos += snprintf(pos, end - pos, "{type: '%s', lsn: %lld, "\
-			"space_id: %u, index_id: %u, tuple: ",
+			"space_id: %u, index_id: %u",
 			iproto_type_name(request->type),
 			(long long) request->header->lsn,
 			(unsigned) request->space_id,
 			(unsigned) request->index_id);
-	pos += mp_snprint(pos, end - pos, request->tuple);
+	if (request->key != NULL) {
+		pos += snprintf(pos, end - pos, ", key: ");
+		pos += mp_snprint(pos, end - pos, request->key);
+	}
+	if (request->tuple != NULL) {
+		pos += snprintf(pos, end - pos, ", tuple: ");
+		pos += mp_snprint(pos, end - pos, request->tuple);
+	}
+	if (request->ops != NULL) {
+		pos += snprintf(pos, end - pos, ", ops: ");
+		pos += mp_snprint(pos, end - pos, request->ops);
+	}
 	pos += snprintf(pos, end - pos, "}");
 	return buf;
 }
diff --git a/test/unit/xrow.cc b/test/unit/xrow.cc
index f14c806428..165a543cff 100644
--- a/test/unit/xrow.cc
+++ b/test/unit/xrow.cc
@@ -239,18 +239,50 @@ test_xrow_header_encode_decode()
 	check_plan();
 }
 
+void
+test_request_str()
+{
+	plan(1);
+	struct xrow_header header;
+	header.lsn = 100;
+	struct request request;
+	request.header = &header;
+	request.type = 1;
+	request.space_id = 512;
+	request.index_id = 1;
+
+	char buffer[2048];
+	request.key = buffer;
+	char *pos = mp_encode_array(buffer, 1);
+	pos = mp_encode_uint(pos, 200);
+
+	request.tuple = pos;
+	pos = mp_encode_array(pos, 1);
+	pos = mp_encode_uint(pos, 300);
+
+	request.ops = pos;
+	pos = mp_encode_array(pos, 1);
+	pos = mp_encode_uint(pos, 400);
+	is(strcmp("{type: 'SELECT', lsn: 100, space_id: 512, index_id: 1, "\
+		  "key: [200], tuple: [300], ops: [400]}",
+		  request_str(&request)), 0, "request_str");
+
+	check_plan();
+}
+
 int
 main(void)
 {
 	memory_init();
 	fiber_init(fiber_c_invoke);
-	plan(2);
+	plan(3);
 
 	random_init();
 
 	test_iproto_constants();
 	test_greeting();
 	test_xrow_header_encode_decode();
+	test_request_str();
 
 	random_free();
 	fiber_free();
diff --git a/test/unit/xrow.result b/test/unit/xrow.result
index 88500f75e6..5ee92ad7b1 100644
--- a/test/unit/xrow.result
+++ b/test/unit/xrow.result
@@ -1,4 +1,4 @@
-1..2
+1..3
     1..40
     ok 1 - round trip
     ok 2 - roundtrip.version_id
@@ -53,3 +53,6 @@ ok 1 - subtests
     ok 9 - decoded sync
     ok 10 - decoded bodycnt
 ok 2 - subtests
+    1..1
+    ok 1 - request_str
+ok 3 - subtests
-- 
GitLab