diff --git a/src/box/iproto.cc b/src/box/iproto.cc index 1b7ee72cf2e31ca861bddf5b67de678443d2ab11..40154d7fe3b7f2e5234137360b61eda53ec8a0d2 100644 --- a/src/box/iproto.cc +++ b/src/box/iproto.cc @@ -1230,8 +1230,8 @@ iproto_connection_resume(struct iproto_connection *con) */ if (iproto_enqueue_batch(con, con->p_ibuf) != 0) { struct error *e = box_error_last(); - iproto_write_error(&con->io, e, ::schema_version, 0); error_log(e); + iproto_write_error(&con->io, e, ::schema_version, 0); iproto_connection_close(con); } } @@ -1317,9 +1317,9 @@ iproto_connection_on_input(ev_loop *loop, struct ev_io *watcher, if (iproto_enqueue_batch(con, in) != 0) diag_raise(); } catch (Exception *e) { + e->log(); /* Best effort at sending the error message to the client. */ iproto_write_error(io, e, ::schema_version, 0); - e->log(); iproto_connection_close(con); } } diff --git a/test/box-luatest/gh_6890_iproto_error_use_after_free_test.lua b/test/box-luatest/gh_6890_iproto_error_use_after_free_test.lua new file mode 100644 index 0000000000000000000000000000000000000000..4da08b1ca777b8f7d54583406e423c98965a6142 --- /dev/null +++ b/test/box-luatest/gh_6890_iproto_error_use_after_free_test.lua @@ -0,0 +1,31 @@ +local msgpack = require('msgpack') +local server = require('test.luatest_helpers.server') +local socket = require('socket') +local uri = require('uri') +local t = require('luatest') +local g = t.group() + +g.before_all(function() + g.server = server:new({alias = 'master'}) + g.server:start() +end) + +g.after_all(function() + g.server:drop() +end) + +g.test_iproto_error_use_after_free = function() + -- Connect to the server. + local u = uri.parse(g.server.net_box_uri) + local s = socket.tcp_connect(u.host, u.service) + t.assert_is_not(s, nil) + -- Skip the greeting. + t.assert_equals(#s:read(128), 128) + -- Send an invalid request and immediately close the socket so that + -- the server fails to send the error back. + local d = msgpack.encode('foo') + t.assert_equals(s:write(d), #d) + s:close() + -- Check that the server logs the proper error. + t.assert(g.server:grep_log('ER_INVALID_MSGPACK')) +end