diff options
author | Daniel Willmann <daniel@totalueberwachung.de> | 2011-08-05 12:22:35 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2012-09-11 15:20:55 +0200 |
commit | 5e95f45af0e96c9f79d053de55a1cbd689496883 (patch) | |
tree | 16d1ea7f246c1e4cc3a48dde22e5f15ce38c0101 /openbsc/src/libctrl | |
parent | 5ff06af6f560b9e906d6c320325ae84f3602f397 (diff) |
ctrl: Improve error handling if controlif setup fails
Diffstat (limited to 'openbsc/src/libctrl')
-rw-r--r-- | openbsc/src/libctrl/control_if.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/openbsc/src/libctrl/control_if.c b/openbsc/src/libctrl/control_if.c index 350e8e1ca..8842d3c2f 100644 --- a/openbsc/src/libctrl/control_if.c +++ b/openbsc/src/libctrl/control_if.c @@ -642,23 +642,27 @@ struct ctrl_handle *controlif_setup(struct gsm_network *gsmnet, uint16_t port) ctrl->gsmnet = gsmnet; ctrl_node_vec = vector_init(5); - if (!ctrl_node_vec) { - talloc_free(ctrl); - return NULL; - } + if (!ctrl_node_vec) + goto err; /* Listen for control connections */ ret = make_sock(&ctrl->listen_fd, IPPROTO_TCP, INADDR_LOOPBACK, port, 0, listen_fd_cb, ctrl); - if (ret < 0) { - talloc_free(ctrl); - vector_free(ctrl_node_vec); - ctrl_node_vec = NULL; - return NULL; - } + if (ret < 0) + goto err_vec; - ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_rate_ctr); - ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_counter); + ret = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_rate_ctr); + if (ret) + goto err_vec; + ret = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_counter); + if (ret) + goto err_vec; return ctrl; +err_vec: + vector_free(ctrl_node_vec); + ctrl_node_vec = NULL; +err: + talloc_free(ctrl); + return NULL; } |