diff options
author | Kozlov Dmitry <xeb@mail.ru> | 2012-07-13 12:33:57 +0400 |
---|---|---|
committer | Kozlov Dmitry <xeb@mail.ru> | 2012-07-13 12:33:57 +0400 |
commit | 5c0f3b7e31f6b2eca56c462d5e39b98f59562b0b (patch) | |
tree | 61d6d15095486d519f9a0a7eb447b5f349cbc0b8 /accel-pppd/ctrl/l2tp | |
parent | 0575ad5069b4bf44ec62e4db172d2590ec7fb956 (diff) | |
parent | e04b9b2b35ed36ceb89d6991d2322210f6dd6abc (diff) | |
download | accel-ppp-5c0f3b7e31f6b2eca56c462d5e39b98f59562b0b.tar.gz accel-ppp-5c0f3b7e31f6b2eca56c462d5e39b98f59562b0b.zip |
Merge commit 'e04b9b2b35ed36ceb89d6991d2322210f6dd6abc'
* commit 'e04b9b2b35ed36ceb89d6991d2322210f6dd6abc':
L2TP: Close sockets opened by l2tp_connect() upon failure
Diffstat (limited to 'accel-pppd/ctrl/l2tp')
-rw-r--r-- | accel-pppd/ctrl/l2tp/l2tp.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c index e85876e9..bbce6c16 100644 --- a/accel-pppd/ctrl/l2tp/l2tp.c +++ b/accel-pppd/ctrl/l2tp/l2tp.c @@ -388,24 +388,22 @@ static int l2tp_connect(struct l2tp_conn_t *conn) conn->tunnel_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP); if (conn->tunnel_fd < 0) { log_ppp_error("l2tp: socket(AF_PPPOX): %s\n", strerror(errno)); - return -1; + goto out_err; } fcntl(conn->tunnel_fd, F_SETFD, fcntl(conn->tunnel_fd, F_GETFD) | FD_CLOEXEC); conn->ppp.fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP); if (conn->ppp.fd < 0) { - close(conn->tunnel_fd); - conn->tunnel_fd = -1; log_ppp_error("l2tp: socket(AF_PPPOX): %s\n", strerror(errno)); - return -1; + goto out_err; } fcntl(conn->ppp.fd, F_SETFD, fcntl(conn->ppp.fd, F_GETFD) | FD_CLOEXEC); if (connect(conn->tunnel_fd, (struct sockaddr *)&pppox_addr, sizeof(pppox_addr)) < 0) { log_ppp_error("l2tp: connect(tunnel): %s\n", strerror(errno)); - return -1; + goto out_err; } pppox_addr.pppol2tp.s_session = conn->sid; @@ -413,12 +411,12 @@ static int l2tp_connect(struct l2tp_conn_t *conn) if (connect(conn->ppp.fd, (struct sockaddr *)&pppox_addr, sizeof(pppox_addr)) < 0) { log_ppp_error("l2tp: connect(session): %s\n", strerror(errno)); - return -1; + goto out_err; } if (setsockopt(conn->ppp.fd, SOL_PPPOL2TP, PPPOL2TP_SO_LNSMODE, &arg, sizeof(arg))) { log_ppp_error("l2tp: setsockopt: %s\n", strerror(errno)); - return -1; + goto out_err; } conn->ppp.ses.chan_name = _strdup(inet_ntoa(conn->addr.sin_addr)); @@ -426,14 +424,25 @@ static int l2tp_connect(struct l2tp_conn_t *conn) triton_event_fire(EV_CTRL_STARTED, &conn->ppp.ses); if (establish_ppp(&conn->ppp)) - return -1; + goto out_err; __sync_sub_and_fetch(&stat_starting, 1); __sync_add_and_fetch(&stat_active, 1); conn->state = STATE_PPP; - + return 0; + +out_err: + if (conn->tunnel_fd >= 0) { + close(conn->tunnel_fd); + conn->tunnel_fd = -1; + } + if (conn->ppp.fd >= 0) { + close(conn->ppp.fd); + conn->ppp.fd = -1; + } + return -1; } static void l2tp_rtimeout(struct triton_timer_t *t) |