diff options
author | Guillaume Nault <g.nault@alphalink.fr> | 2014-04-08 23:06:41 +0200 |
---|---|---|
committer | Dmitry Kozlov <xeb@mail.ru> | 2014-04-11 06:47:42 +0400 |
commit | 635005576438e092415683179997d002dcbfe344 (patch) | |
tree | 184c03925618c639ac2a028e2a5f0170e595b3d7 /accel-pppd/ctrl | |
parent | 2b911b95edc395a88513f359845e0457a760ab14 (diff) | |
download | accel-ppp-635005576438e092415683179997d002dcbfe344.tar.gz accel-ppp-635005576438e092415683179997d002dcbfe344.zip |
l2tp: rework error handling in l2tp_tunnel_alloc
Use stacked error labels for better extensibility.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Diffstat (limited to 'accel-pppd/ctrl')
-rw-r--r-- | accel-pppd/ctrl/l2tp/l2tp.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c index 7807aa1..8c06cd4 100644 --- a/accel-pppd/ctrl/l2tp/l2tp.c +++ b/accel-pppd/ctrl/l2tp/l2tp.c @@ -1517,7 +1517,7 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer, if (!conn) { log_error("l2tp: impossible to allocate new tunnel:" " memory allocation failed\n"); - return NULL; + goto err; } memset(conn, 0, sizeof(*conn)); @@ -1529,22 +1529,21 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer, if (conn->hnd.fd < 0) { log_error("l2tp: impossible to allocate new tunnel:" " socket(PF_INET) failed: %s\n", strerror(errno)); - mempool_free(conn); - return NULL; + goto err_conn; } flag = fcntl(conn->hnd.fd, F_GETFD); if (flag < 0) { log_error("l2tp: impossible to allocate new tunnel:" " fcntl(F_GETFD) failed: %s\n", strerror(errno)); - goto out_err; + goto err_conn_fd; } flag = fcntl(conn->hnd.fd, F_SETFD, flag | FD_CLOEXEC); if (flag < 0) { log_error("l2tp: impossible to allocate new tunnel:" " fcntl(F_SETFD) failed: %s\n", strerror(errno)); - goto out_err; + goto err_conn_fd; } flag = 1; @@ -1553,12 +1552,12 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer, log_error("l2tp: impossible to allocate new tunnel:" " setsockopt(SO_REUSEADDR) failed: %s\n", strerror(errno)); - goto out_err; + goto err_conn_fd; } if (bind(conn->hnd.fd, host, sizeof(*host))) { log_error("l2tp: impossible to allocate new tunnel:" " bind() failed: %s\n", strerror(errno)); - goto out_err; + goto err_conn_fd; } memcpy(&conn->peer_addr, peer, sizeof(*peer)); @@ -1570,7 +1569,7 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer, sizeof(conn->peer_addr))) { log_error("l2tp: impossible to allocate new tunnel:" " connect() failed: %s\n", strerror(errno)); - goto out_err; + goto err_conn_fd; } if (!port_set) conn->peer_addr.sin_port = peer->sin_port; @@ -1579,26 +1578,26 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer, if (flag < 0) { log_error("l2tp: impossible to allocate new tunnel:" " fcntl(F_GETFL) failed: %s\n", strerror(errno)); - goto out_err; + goto err_conn_fd; } flag = fcntl(conn->hnd.fd, F_SETFL, flag | O_NONBLOCK); if (flag < 0) { log_error("l2tp: impossible to allocate new tunnel:" " fcntl(F_SETFL) failed: %s\n", strerror(errno)); - goto out_err; + goto err_conn_fd; } if (getsockname(conn->hnd.fd, &conn->host_addr, &hostaddrlen) < 0) { log_error("l2tp: impossible to allocate new tunnel:" " getsockname() failed: %s\n", strerror(errno)); - goto out_err; + goto err_conn_fd; } if (hostaddrlen != sizeof(conn->host_addr)) { log_error("l2tp: impossible to allocate new tunnel:" " inconsistent address length returned by" " getsockname(): %i bytes instead of %zu\n", hostaddrlen, sizeof(conn->host_addr)); - goto out_err; + goto err_conn_fd; } for (count = UINT16_MAX; count > 0; --count) { @@ -1607,7 +1606,7 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer, log_error("l2tp: impossible to allocate new tunnel:" " reading from urandom failed: %s\n", (rdlen < 0) ? strerror(errno) : "short read"); - goto out_err; + goto err_conn_fd; } if (conn->tid == 0) @@ -1627,7 +1626,7 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer, if (count == 0) { log_error("l2tp: impossible to allocate new tunnel:" " could not find any unused tunnel ID\n"); - goto out_err; + goto err_conn_fd; } conn->state = STATE_INIT; @@ -1655,9 +1654,11 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer, return conn; -out_err: +err_conn_fd: close(conn->hnd.fd); +err_conn: mempool_free(conn); +err: return NULL; } |