Fix some more socket bugs

- The functions that return a sockaddr now do so the same way the Linux
  Kernel does across platforms, e.g. getpeername(), accept4()

- Socket system calls on Windows will now only check for interrupts when
  a blocking operation needs to be performed.

- Write tests for recvfrom() system call
This commit is contained in:
Justine Tunney 2023-07-23 16:31:10 -07:00
parent ac92f25296
commit 0ba3199915
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
49 changed files with 347 additions and 352 deletions

View file

@ -20,6 +20,7 @@
#include "libc/sock/sock.h"
#include "libc/sock/struct/sockaddr.h"
#include "libc/sock/struct/sockaddr6.h"
#include "libc/str/str.h"
#include "libc/sysv/consts/af.h"
#include "libc/sysv/consts/ipproto.h"
#include "libc/sysv/consts/limits.h"
@ -91,3 +92,29 @@ TEST(ipv6, test) {
ASSERT_TRUE(WIFEXITED(ws));
ASSERT_EQ(0, WEXITSTATUS(ws));
}
TEST(getsockname, defaultsToZero) {
struct sockaddr_in addr;
uint32_t addrsize = sizeof(struct sockaddr_in);
memset(&addr, -1, sizeof(addr));
ASSERT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP));
ASSERT_SYS(0, 0, getsockname(3, (struct sockaddr *)&addr, &addrsize));
ASSERT_EQ(sizeof(struct sockaddr_in), addrsize);
ASSERT_EQ(AF_INET, addr.sin_family);
ASSERT_EQ(0, addr.sin_addr.s_addr);
ASSERT_EQ(0, addr.sin_port);
EXPECT_SYS(0, 0, close(3));
}
TEST(getsockname, copiesSafely_givesFullSize) {
struct sockaddr_in addr;
uint32_t addrsize = 2;
memset(&addr, -1, sizeof(addr));
ASSERT_SYS(0, 3, socket(AF_INET, SOCK_STREAM, IPPROTO_TCP));
ASSERT_SYS(0, 0, getsockname(3, (struct sockaddr *)&addr, &addrsize));
ASSERT_EQ(sizeof(struct sockaddr_in), addrsize);
ASSERT_EQ(AF_INET, addr.sin_family);
ASSERT_EQ(0xffffffff, addr.sin_addr.s_addr);
ASSERT_EQ(0xffff, addr.sin_port);
EXPECT_SYS(0, 0, close(3));
}