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