Skip to content
Snippets Groups Projects
Commit b504373f authored by Nicolas Pope's avatar Nicolas Pope
Browse files

Merge branch 'bug/#2' into 'main'

#3 Check socket address size

See merge request nicolaspope/beyond-protocol!16
parents 64bcf49b 3a5f0ecc
No related branches found
No related tags found
No related merge requests found
...@@ -36,7 +36,9 @@ bool ftl::net::internal::resolve_inet_address(const std::string &hostname, int p ...@@ -36,7 +36,9 @@ bool ftl::net::internal::resolve_inet_address(const std::string &hostname, int p
if (rc != 0 || addrs == nullptr) return false; if (rc != 0 || addrs == nullptr) return false;
address.len = (socklen_t) addrs->ai_addrlen; 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); freeaddrinfo(addrs);
return true; return true;
} }
...@@ -70,7 +72,7 @@ ssize_t Socket::writev(const struct iovec *iov, int iovcnt) { ...@@ -70,7 +72,7 @@ ssize_t Socket::writev(const struct iovec *iov, int iovcnt) {
} }
int Socket::bind(const SocketAddress &addr) { 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) { if (retval) {
status_ = Socket::OPEN; status_ = Socket::OPEN;
} }
...@@ -84,7 +86,7 @@ int Socket::listen(int backlog) { ...@@ -84,7 +86,7 @@ int Socket::listen(int backlog) {
Socket Socket::accept(SocketAddress &addr) { Socket Socket::accept(SocketAddress &addr) {
addr.len = sizeof(SocketAddress); addr.len = sizeof(SocketAddress);
Socket socket; Socket socket;
int retval = ::accept(fd_, &(addr.addr), &(addr.len)); int retval = ::accept(fd_, reinterpret_cast<sockaddr*>(&(addr.addr)), &(addr.len));
if (retval > 0) { if (retval > 0) {
socket.status_ = STATUS::OPEN; socket.status_ = STATUS::OPEN;
socket.fd_ = retval; socket.fd_ = retval;
...@@ -99,7 +101,7 @@ Socket Socket::accept(SocketAddress &addr) { ...@@ -99,7 +101,7 @@ Socket Socket::accept(SocketAddress &addr) {
int Socket::connect(const SocketAddress& address) { int Socket::connect(const SocketAddress& address) {
int err = 0; int err = 0;
if (status_ == STATUS::UNCONNECTED) { 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) { if (err == 0) {
status_ = STATUS::OPEN; status_ = STATUS::OPEN;
return 0; return 0;
...@@ -203,7 +205,7 @@ Socket ftl::net::internal::create_tcp_socket() { ...@@ -203,7 +205,7 @@ Socket ftl::net::internal::create_tcp_socket() {
std::string ftl::net::internal::get_host(const SocketAddress& addr) { std::string ftl::net::internal::get_host(const SocketAddress& addr) {
char hbuf[1024]; 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); } if (err == 0) { return std::string(hbuf); }
else if (err == EAI_NONAME) return ftl::net::internal::get_ip(addr); else if (err == EAI_NONAME) return ftl::net::internal::get_ip(addr);
else else
......
...@@ -27,6 +27,7 @@ typedef struct iovec { ...@@ -27,6 +27,7 @@ typedef struct iovec {
#else #else
// Linux // Linux
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h>
#endif #endif
namespace ftl { namespace ftl {
...@@ -45,7 +46,7 @@ typedef int socket_t; ...@@ -45,7 +46,7 @@ typedef int socket_t;
struct SocketAddress { struct SocketAddress {
socklen_t len = sizeof(struct sockaddr); socklen_t len = sizeof(struct sockaddr);
struct sockaddr addr; struct sockaddr_in addr;
}; };
#endif #endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment