From 2b68728552d125644a522e7548d02af9ffd71713 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 17 Jun 2013 13:18:55 +0200 Subject: socket: Check if socket (non)blocking is working. --- src/connect.c | 25 ++++++++++++++++++++++--- src/socket.c | 21 ++++++++++++--------- 2 files changed, 34 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/connect.c b/src/connect.c index 3517f26..d581e2c 100644 --- a/src/connect.c +++ b/src/connect.c @@ -149,7 +149,13 @@ static int ssh_connect_ai_timeout(ssh_session session, const char *host, */ timeout_ms=timeout * 1000 + usec / 1000; - ssh_socket_set_nonblocking(s); + rc = ssh_socket_set_nonblocking(s); + if (rc < 0) { + ssh_set_error(session, SSH_FATAL, + "Failed to set socket non-blocking for %s:%d", host, port); + ssh_connect_socket_close(s); + return -1; + } ssh_log(session, SSH_LOG_RARE, "Trying to connect to host: %s:%d with " "timeout %d ms", host, port, timeout_ms); @@ -196,7 +202,14 @@ static int ssh_connect_ai_timeout(ssh_session session, const char *host, /* s is connected ? */ ssh_log(session, SSH_LOG_PACKET, "Socket connected with timeout\n"); - ssh_socket_set_blocking(s); + ret = ssh_socket_set_blocking(s); + if (ret < 0) { + ssh_set_error(session, SSH_FATAL, + "Failed to set socket as blocking connecting to %s:%d failed: %s", + host, port, strerror(errno)); + ssh_connect_socket_close(s); + return -1; + } leave_function(); return s; @@ -368,7 +381,13 @@ socket_t ssh_connect_host_nonblocking(ssh_session session, const char *host, continue; } } - ssh_socket_set_nonblocking(s); + + rc = ssh_socket_set_nonblocking(s); + if (rc < 0) { + ssh_set_error(session, SSH_FATAL, + "Failed to set socket non-blocking for %s:%d", host, port); + ssh_connect_socket_close(s); + } connect(s, itr->ai_addr, itr->ai_addrlen); break; diff --git a/src/socket.c b/src/socket.c index 93e8d5d..0f6c0a8 100644 --- a/src/socket.c +++ b/src/socket.c @@ -308,7 +308,10 @@ int ssh_socket_pollcallback(struct ssh_poll_handle_struct *p, socket_t fd, int r ssh_log(s->session,SSH_LOG_PACKET,"Received POLLOUT in connecting state"); s->state = SSH_SOCKET_CONNECTED; ssh_poll_set_events(p,POLLOUT | POLLIN); - ssh_socket_set_blocking(ssh_socket_get_fd_in(s)); + r = ssh_socket_set_blocking(ssh_socket_get_fd_in(s)); + if (r < 0) { + return -1; + } if(s->callbacks && s->callbacks->connected) s->callbacks->connected(SSH_SOCKET_CONNECTED_OK,0,s->callbacks->userdata); return 0; @@ -714,23 +717,23 @@ int ssh_socket_get_status(ssh_socket s) { } #ifdef _WIN32 -void ssh_socket_set_nonblocking(socket_t fd) { +int ssh_socket_set_nonblocking(socket_t fd) { u_long nonblocking = 1; - ioctlsocket(fd, FIONBIO, &nonblocking); + return ioctlsocket(fd, FIONBIO, &nonblocking); } -void ssh_socket_set_blocking(socket_t fd) { +int ssh_socket_set_blocking(socket_t fd) { u_long nonblocking = 0; - ioctlsocket(fd, FIONBIO, &nonblocking); + return ioctlsocket(fd, FIONBIO, &nonblocking); } #else /* _WIN32 */ -void ssh_socket_set_nonblocking(socket_t fd) { - fcntl(fd, F_SETFL, O_NONBLOCK); +int ssh_socket_set_nonblocking(socket_t fd) { + return fcntl(fd, F_SETFL, O_NONBLOCK); } -void ssh_socket_set_blocking(socket_t fd) { - fcntl(fd, F_SETFL, 0); +int ssh_socket_set_blocking(socket_t fd) { + return fcntl(fd, F_SETFL, 0); } #endif /* _WIN32 */ -- cgit