From 06cc3fe2d1ad1acd7269bf2a3fed20a5431111ad Mon Sep 17 00:00:00 2001 From: Aadhavan Srinivasan Date: Fri, 24 Feb 2023 11:01:23 -0600 Subject: [PATCH] Fixed IPv6 bug (sockaddr size too small) when binding socket to address --- easysock.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/easysock.c b/easysock.c index fde9c00..38ecb15 100644 --- a/easysock.c +++ b/easysock.c @@ -51,11 +51,23 @@ void create_addr(int network, char* address, int port,struct sockaddr* dest) { int create_local (int network, char transport, char* address, int port,struct sockaddr* addr_struct) { int socket = create_socket(network,transport); - if (socket == -1) { - exit(-1); + if (socket < 0) { + printf("Something went wrong creating the socket: %s\n",strerror(errno)); } create_addr(network,address,port,addr_struct); - int addrlen = sizeof(*addr_struct); + int addrlen; + if (network == 4) { + addrlen = sizeof(struct sockaddr_in); + } else if (network == 6) { + addrlen = sizeof(struct sockaddr_in6); + } else { + exit(-7); + } + + /* The value of addrlen should be the size of the 'sockaddr'. + This should be set to the size of 'sockaddr_in' for IPv4, and 'sockaddr_in6' for IPv6. + See https://stackoverflow.com/questions/73707162/socket-bind-failed-with-invalid-argument-error-for-program-running-on-macos */ + int i = bind (socket,addr_struct,(socklen_t)addrlen); if (i < 0) { printf("Something went wrong: %s\n",strerror(errno)); @@ -73,7 +85,19 @@ int create_remote (int network,char transport,char* address,int port) { } struct sockaddr remote_addr_struct; create_addr(network,address,port,&remote_addr_struct); - int addrlen = sizeof(remote_addr_struct); + int addrlen; + if (network == 4) { + addrlen = sizeof(struct sockaddr_in); + } else if (network == 6) { + addrlen = sizeof(struct sockaddr_in6); + } else { + exit(-7); + } + + /* The value of addrlen should be the size of the 'sockaddr'. + This should be set to the size of 'sockaddr_in' for IPv4, and 'sockaddr_in6' for IPv6. + See https://stackoverflow.com/questions/73707162/socket-bind-failed-with-invalid-argument-error-for-program-running-on-macos */ + int i = connect(socket,&remote_addr_struct,(socklen_t)addrlen); if (i < 0) { printf("Something went wrong: %s\n",strerror(errno));