From 63af8c53ef3422bd1cc1fb44d9bb2838a3bb897d Mon Sep 17 00:00:00 2001
From: Roman Tsisyk <roman@tsisyk.com>
Date: Thu, 6 Oct 2016 15:00:20 +0300
Subject: [PATCH] Initialize ClientError in main() instead of box_init()

diag_set(ClientError, ...) is needed for net.box and box.error()
which should work without box.cfg{}

Fixes #1814
---
 src/box/box.cc                | 3 ---
 src/box/error.cc              | 2 +-
 src/box/error.h               | 2 +-
 src/main.cc                   | 2 ++
 test/box-tap/net.box.result   | 3 ++-
 test/box-tap/net.box.test.lua | 4 +++-
 6 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/box/box.cc b/src/box/box.cc
index 6fc73fd4b6..34c22b4ef4 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -994,9 +994,6 @@ engine_init()
 static inline void
 box_init(void)
 {
-	error_init();
-
-
 	tuple_init(cfg_getd("slab_alloc_arena"),
 		   cfg_geti("slab_alloc_minimal"),
 		   cfg_geti("slab_alloc_maximal"),
diff --git a/src/box/error.cc b/src/box/error.cc
index 96822785e8..d7e2721a37 100644
--- a/src/box/error.cc
+++ b/src/box/error.cc
@@ -156,7 +156,7 @@ ErrorInjection::ErrorInjection(const char *file, unsigned line, const char *msg)
 }
 
 void
-error_init(void)
+box_error_init(void)
 {
 	error_factory->ClientError = BuildClientError;
 }
diff --git a/src/box/error.h b/src/box/error.h
index 82ac87211e..019b0d3d03 100644
--- a/src/box/error.h
+++ b/src/box/error.h
@@ -182,7 +182,7 @@ class ErrorInjection: public LoggedError {
 };
 
 void
-error_init(void);
+box_error_init(void);
 
 #endif /* defined(__cplusplus) */
 
diff --git a/src/main.cc b/src/main.cc
index b6a9dbce62..d59caae35d 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -61,6 +61,7 @@
 #include "tt_pthread.h"
 #include "lua/init.h"
 #include "box/box.h"
+#include "box/error.h"
 #include "scoped_guard.h"
 #include "random.h"
 #include "tt_uuid.h"
@@ -624,6 +625,7 @@ main(int argc, char **argv)
 	main_argv = argv;
 
 	exception_init();
+	box_error_init();
 
 	fiber_init(fiber_cxx_invoke);
 	/* Init iobuf library with default readahead */
diff --git a/test/box-tap/net.box.result b/test/box-tap/net.box.result
index 4eb7be3f9c..589113c3e8 100644
--- a/test/box-tap/net.box.result
+++ b/test/box-tap/net.box.result
@@ -1,6 +1,7 @@
 TAP version 13
-1..4
+1..5
 ok - instance created
 ok - instance started
 ok - connected to instance
 ok - space exists
+ok - error handling
diff --git a/test/box-tap/net.box.test.lua b/test/box-tap/net.box.test.lua
index 2bcafd4008..0c7fa3b121 100755
--- a/test/box-tap/net.box.test.lua
+++ b/test/box-tap/net.box.test.lua
@@ -7,7 +7,7 @@ local net_box = require('net.box')
 local test_run = require('test_run')
 local inspector = test_run.new()
 
-test:plan(4)
+test:plan(5)
 
 -- create tarantool instance
 test:is(
@@ -24,6 +24,8 @@ local uri = inspector:eval('second', 'box.cfg.listen')[1]
 local conn = net_box:new(uri)
 test:is(conn:is_connected(), true, 'connected to instance')
 test:is(conn.space ~= nil, true, 'space exists')
+-- gh-1814: Segfault if using `net.box` before `box.cfg` start
+test:ok(not pcall(function() conn.space._vspace:insert() end), "error handling")
 
 -- cleanup
 conn:close()
-- 
GitLab