diff --git a/src/socket/socket_linux.cpp b/src/socket/socket_linux.cpp index 3d1b71a6e459d6bd461064f2eee4ef28a2a71d21..7989d7e18e219a334745bb24d61da0e059f3706f 100644 --- a/src/socket/socket_linux.cpp +++ b/src/socket/socket_linux.cpp @@ -36,7 +36,9 @@ bool ftl::net::internal::resolve_inet_address(const std::string &hostname, int p if (rc != 0 || addrs == nullptr) return false; address.len = (socklen_t) addrs->ai_addrlen; - memcpy(&address.addr, addrs->ai_addr, address.len); + if (address.len <= sizeof(address.addr)) { + memcpy(&address.addr, addrs->ai_addr, address.len); + } freeaddrinfo(addrs); return true; } @@ -70,7 +72,7 @@ ssize_t Socket::writev(const struct iovec *iov, int iovcnt) { } int Socket::bind(const SocketAddress &addr) { - auto retval = ::bind(fd_, &addr.addr, addr.len); + auto retval = ::bind(fd_, reinterpret_cast<const sockaddr*>(&addr.addr), addr.len); if (retval) { status_ = Socket::OPEN; } @@ -84,7 +86,7 @@ int Socket::listen(int backlog) { Socket Socket::accept(SocketAddress &addr) { addr.len = sizeof(SocketAddress); Socket socket; - int retval = ::accept(fd_, &(addr.addr), &(addr.len)); + int retval = ::accept(fd_, reinterpret_cast<sockaddr*>(&(addr.addr)), &(addr.len)); if (retval > 0) { socket.status_ = STATUS::OPEN; socket.fd_ = retval; @@ -99,7 +101,7 @@ Socket Socket::accept(SocketAddress &addr) { int Socket::connect(const SocketAddress& address) { int err = 0; if (status_ == STATUS::UNCONNECTED) { - err = ::connect(fd_, &address.addr, address.len); + err = ::connect(fd_, reinterpret_cast<const sockaddr*>(&address.addr), address.len); if (err == 0) { status_ = STATUS::OPEN; return 0; @@ -203,7 +205,7 @@ Socket ftl::net::internal::create_tcp_socket() { std::string ftl::net::internal::get_host(const SocketAddress& addr) { char hbuf[1024]; - int err = getnameinfo(&(addr.addr), addr.len, hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD); + int err = getnameinfo(reinterpret_cast<const sockaddr*>(&(addr.addr)), addr.len, hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD); if (err == 0) { return std::string(hbuf); } else if (err == EAI_NONAME) return ftl::net::internal::get_ip(addr); else diff --git a/src/socket/types.hpp b/src/socket/types.hpp index 66f5a356f0f664baf89867dfc578a2c7a27179ac..bf87834bb0718e326e8f281c5c5047c7c7e22dbc 100644 --- a/src/socket/types.hpp +++ b/src/socket/types.hpp @@ -27,6 +27,7 @@ typedef struct iovec { #else // Linux #include <sys/socket.h> +#include <netinet/in.h> #endif namespace ftl { @@ -45,7 +46,7 @@ typedef int socket_t; struct SocketAddress { socklen_t len = sizeof(struct sockaddr); - struct sockaddr addr; + struct sockaddr_in addr; }; #endif