Libc: gracefully handle invalid socketaddr arguments

Ref #2682
This commit is contained in:
Ehmry - 2018-02-22 13:40:26 +01:00 committed by Christian Helmuth
parent e4328de251
commit 96579a72e0

View File

@ -527,8 +527,13 @@ extern "C" int socket_fs_bind(int libc_fd, sockaddr const *addr, socklen_t addrl
return Errno(EAFNOSUPPORT); return Errno(EAFNOSUPPORT);
} }
Sockaddr_string addr_string(host_string(*(sockaddr_in *)addr), Sockaddr_string addr_string;
port_string(*(sockaddr_in *)addr));
try {
addr_string = Sockaddr_string(host_string(*(sockaddr_in *)addr),
port_string(*(sockaddr_in *)addr));
}
catch (Address_conversion_failed) { return Errno(EINVAL); }
try { try {
int const len = strlen(addr_string.base()); int const len = strlen(addr_string.base());
@ -562,8 +567,12 @@ extern "C" int socket_fs_connect(int libc_fd, sockaddr const *addr, socklen_t ad
/* TODO ECONNREFUSED */ /* TODO ECONNREFUSED */
/* TODO maybe EALREADY, EINPROGRESS, ETIMEDOUT */ /* TODO maybe EALREADY, EINPROGRESS, ETIMEDOUT */
Sockaddr_string addr_string(host_string(*(sockaddr_in const *)addr), Sockaddr_string addr_string;
port_string(*(sockaddr_in const *)addr)); try {
addr_string = Sockaddr_string(host_string(*(sockaddr_in const *)addr),
port_string(*(sockaddr_in const *)addr));
}
catch (Address_conversion_failed) { return Errno(EINVAL); }
int const len = strlen(addr_string.base()); int const len = strlen(addr_string.base());
int const n = write(context->connect_fd(), addr_string.base(), len); int const n = write(context->connect_fd(), addr_string.base(), len);
@ -658,12 +667,15 @@ static ssize_t do_sendto(Libc::File_descriptor *fd,
try { try {
if (dest_addr) { if (dest_addr) {
Sockaddr_string addr_string(host_string(*(sockaddr_in const *)dest_addr), try {
port_string(*(sockaddr_in const *)dest_addr)); Sockaddr_string addr_string(host_string(*(sockaddr_in const *)dest_addr),
port_string(*(sockaddr_in const *)dest_addr));
int const len = strlen(addr_string.base()); int const len = strlen(addr_string.base());
int const n = write(context->remote_fd(), addr_string.base(), len); int const n = write(context->remote_fd(), addr_string.base(), len);
if (n != len) return Errno(EIO); if (n != len) return Errno(EIO);
}
catch (Address_conversion_failed) { return Errno(EINVAL); }
} }
lseek(context->data_fd(), 0, 0); lseek(context->data_fd(), 0, 0);