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