From 4537becd9f2e2084a7d5a072156a6754e8cbc861 Mon Sep 17 00:00:00 2001 From: Jack Lloyd <jack@randombit.net> Date: Fri, 6 Dec 2019 11:03:51 -0500 Subject: Fix warnings in CLI socket operations Need to disable tls_client and tls_server here, at least temporarily. tls_client clearly never worked, because select on stdin doesn't work in Winsock. tls_server seems like it would work but has warnings that don't make any sense with certain versions of VC. --- src/cli/socket_utils.h | 24 ++++++++++++++++++++++++ src/cli/tls_client.cpp | 19 +++++++++---------- src/cli/tls_server.cpp | 40 +++++++++++++++++++++------------------- 3 files changed, 54 insertions(+), 29 deletions(-) diff --git a/src/cli/socket_utils.h b/src/cli/socket_utils.h index 7856f5508..d52b5a0e7 100644 --- a/src/cli/socket_utils.h +++ b/src/cli/socket_utils.h @@ -16,7 +16,14 @@ #include <winsock2.h> #include <WS2tcpip.h> +typedef SOCKET socket_type; + +inline socket_type invalid_socket() { return INVALID_SOCKET; } + typedef size_t ssize_t; +typedef int sendrecv_len_type; + +inline void close_socket(socket_type s) { ::closesocket(s); } #define STDIN_FILENO _fileno(stdin) @@ -42,6 +49,12 @@ inline void stop_sockets() ::WSACleanup(); } +inline std::string err_to_string(int e) + { + // TODO use strerror_s here + return "Error code " + std::to_string(e); + } + inline int close(int fd) { return ::closesocket(fd); @@ -69,9 +82,20 @@ inline int send(int s, const uint8_t* buf, size_t len, int flags) #include <errno.h> #include <fcntl.h> +typedef int socket_type; +typedef size_t sendrecv_len_type; + +inline socket_type invalid_socket() { return -1; } +inline void close_socket(socket_type s) { ::close(s); } + inline void init_sockets() {} inline void stop_sockets() {} +inline std::string err_to_string(int e) + { + return std::strerror(e); + } + #endif #if !defined(MSG_NOSIGNAL) diff --git a/src/cli/tls_client.cpp b/src/cli/tls_client.cpp index 4df8b61cc..9541f8fbc 100644 --- a/src/cli/tls_client.cpp +++ b/src/cli/tls_client.cpp @@ -8,8 +8,7 @@ #include "cli.h" -#if defined(BOTAN_HAS_TLS) && defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) && \ - (defined(BOTAN_TARGET_OS_HAS_SOCKETS) || defined(BOTAN_TARGET_OS_HAS_WINSOCK2)) +#if defined(BOTAN_HAS_TLS) && defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) && defined(BOTAN_TARGET_OS_HAS_SOCKETS) #include <botan/tls_client.h> #include <botan/tls_policy.h> @@ -195,7 +194,7 @@ class TLS_Client final : public Command, public Botan::TLS::Callbacks struct timeval timeout = { 1, 0 }; - ::select(m_sockfd + 1, &readfds, nullptr, nullptr, &timeout); + ::select(static_cast<int>(m_sockfd + 1), &readfds, nullptr, nullptr, &timeout); if(FD_ISSET(m_sockfd, &readfds)) { @@ -210,7 +209,7 @@ class TLS_Client final : public Command, public Botan::TLS::Callbacks } else if(got == -1) { - output() << "Socket error: " << errno << " " << std::strerror(errno) << "\n"; + output() << "Socket error: " << errno << " " << err_to_string(errno) << "\n"; continue; } @@ -230,7 +229,7 @@ class TLS_Client final : public Command, public Botan::TLS::Callbacks } else if(got == -1) { - output() << "Stdin error: " << errno << " " << std::strerror(errno) << "\n"; + output() << "Stdin error: " << errno << " " << err_to_string(errno) << "\n"; continue; } @@ -265,7 +264,7 @@ class TLS_Client final : public Command, public Botan::TLS::Callbacks } private: - int connect_to_host(const std::string& host, uint16_t port, bool tcp) + socket_type connect_to_host(const std::string& host, uint16_t port, bool tcp) { addrinfo hints; Botan::clear_mem(&hints, 1); @@ -278,18 +277,18 @@ class TLS_Client final : public Command, public Botan::TLS::Callbacks throw CLI_Error("getaddrinfo failed for " + host); } - int fd = 0; + socket_type fd = 0; for(rp = res; rp != nullptr; rp = rp->ai_next) { fd = ::socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); - if(fd == -1) + if(fd == invalid_socket()) { continue; } - if(::connect(fd, rp->ai_addr, rp->ai_addrlen) != 0) + if(::connect(fd, rp->ai_addr, static_cast<socklen_t>(rp->ai_addrlen)) != 0) { ::close(fd); continue; @@ -427,7 +426,7 @@ class TLS_Client final : public Command, public Botan::TLS::Callbacks } } - int m_sockfd = -1; + socket_type m_sockfd = invalid_socket(); }; BOTAN_REGISTER_COMMAND("tls_client", TLS_Client); diff --git a/src/cli/tls_server.cpp b/src/cli/tls_server.cpp index 8b6a60ea4..c39061e64 100644 --- a/src/cli/tls_server.cpp +++ b/src/cli/tls_server.cpp @@ -10,7 +10,7 @@ #include "sandbox.h" #if defined(BOTAN_HAS_TLS) && defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) && \ - (defined(BOTAN_TARGET_OS_HAS_SOCKETS) || defined(BOTAN_TARGET_OS_HAS_WINSOCK2)) + defined(BOTAN_TARGET_OS_HAS_SOCKETS) #if defined(SO_USER_COOKIE) #define SOCKET_ID 1 @@ -22,6 +22,7 @@ #include <botan/tls_policy.h> #include <botan/hex.h> #include <botan/internal/os_utils.h> +#include <botan/mem_ops.h> #include <list> #include <fstream> @@ -91,7 +92,7 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks return; } - int server_fd = make_server_socket(port); + socket_type server_fd = make_server_socket(port); size_t clients_served = 0; while(true) @@ -119,7 +120,8 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks peek_len = sizeof(dummy); #endif - if(::recvfrom(server_fd, static_cast<char*>(peek_buf), peek_len, MSG_PEEK, reinterpret_cast<struct sockaddr*>(&from), &from_len) != 0) + if(::recvfrom(server_fd, static_cast<char*>(peek_buf), static_cast<sendrecv_len_type>(peek_len), + MSG_PEEK, reinterpret_cast<struct sockaddr*>(&from), &from_len) != 0) { throw CLI_Error("Could not peek next packet"); } @@ -158,11 +160,11 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks try { uint8_t buf[4 * 1024] = { 0 }; - ssize_t got = ::read(m_socket, buf, sizeof(buf)); + ssize_t got = ::recv(m_socket, Botan::cast_uint8_ptr_to_char(buf), sizeof(buf), 0); if(got == -1) { - error_output() << "Error in socket read - " << std::strerror(errno) << std::endl; + error_output() << "Error in socket read - " << err_to_string(errno) << std::endl; break; } @@ -196,8 +198,8 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks error_output() << "Connection problem: " << e.what() << std::endl; if(m_is_tcp) { - ::close(m_socket); - m_socket = -1; + close_socket(m_socket); + m_socket = invalid_socket(); } } } @@ -209,20 +211,20 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks if(m_is_tcp) { - ::close(m_socket); - m_socket = -1; + close_socket(m_socket); + m_socket = invalid_socket(); } } - ::close(server_fd); + close_socket(server_fd); } private: - int make_server_socket(uint16_t port) + socket_type make_server_socket(uint16_t port) { const int type = m_is_tcp ? SOCK_STREAM : SOCK_DGRAM; - int fd = ::socket(PF_INET, type, 0); - if(fd == -1) + socket_type fd = ::socket(PF_INET, type, 0); + if(fd == invalid_socket()) { throw CLI_Error("Unable to acquire socket"); } @@ -237,7 +239,7 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks if(::bind(fd, reinterpret_cast<struct sockaddr*>(&socket_info), sizeof(struct sockaddr)) != 0) { - ::close(fd); + close_socket(fd); throw CLI_Error("server bind failed"); } @@ -245,7 +247,7 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks { if(::listen(fd, 100) != 0) { - ::close(fd); + close_socket(fd); throw CLI_Error("listen failed"); } } @@ -301,11 +303,11 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks { if(m_is_tcp) { - ssize_t sent = ::send(m_socket, buf, length, MSG_NOSIGNAL); + ssize_t sent = ::send(m_socket, buf, static_cast<sendrecv_len_type>(length), MSG_NOSIGNAL); if(sent == -1) { - error_output() << "Error writing to socket - " << std::strerror(errno) << std::endl; + error_output() << "Error writing to socket - " << err_to_string(errno) << std::endl; } else if(sent != static_cast<ssize_t>(length)) { @@ -316,7 +318,7 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks { while(length) { - ssize_t sent = ::send(m_socket, buf, length, MSG_NOSIGNAL); + ssize_t sent = ::send(m_socket, buf, static_cast<sendrecv_len_type>(length), MSG_NOSIGNAL); if(sent == -1) { @@ -347,7 +349,7 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks return "echo/0.1"; } - int m_socket = -1; + socket_type m_socket = invalid_socket(); bool m_is_tcp = false; uint32_t m_socket_id = 0; std::string m_line_buf; -- cgit v1.2.3