diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c
index 30999043a095a96bcb260c4a7087a69a28d3bfb8..5d63d5331d784900d9840bf9c367d63785bf56e2 100644
--- a/src/sbbs3/js_socket.c
+++ b/src/sbbs3/js_socket.c
@@ -2295,7 +2295,7 @@ JSObject* DLLCALL js_CreateSocketObjectWithoutParent(JSContext* cx, SOCKET sock,
 }
 
 static BOOL
-handle_addrs(char *host, struct sockaddr_in *addr4, struct sockaddr_in6 *addr6)
+handle_addrs(char *host, struct sockaddr_in *addr4, socklen_t *addr4len, struct sockaddr_in6 *addr6, socklen_t *addr6len)
 {
 	in_addr_t ia;
 	union xp_sockaddr ia6;
@@ -2326,17 +2326,17 @@ handle_addrs(char *host, struct sockaddr_in *addr4, struct sockaddr_in6 *addr6)
 
 	ia = inet_addr(host);
 	if (ia != INADDR_NONE) {
-		if (addr4->sin_len == 0) {
+		if (*addr4len == 0) {
 			addr4->sin_addr.s_addr = ia;
-			addr4->sin_len = sizeof(struct sockaddr_in);
+			*addr4len = sizeof(struct sockaddr_in);
 		}
 		return TRUE;
 	}
 
 	if (inet_ptoaddr(host, &ia6, sizeof(ia6)) != NULL) {
-		if (addr6->sin6_len == 0) {
+		if (addr6len == 0) {
 			addr6->sin6_addr = ia6.in6.sin6_addr;
-			addr6->sin6_len = sizeof(struct sockaddr_in6);
+			*addr6len = sizeof(struct sockaddr_in6);
 		}
 		return TRUE;
 	}
@@ -2347,18 +2347,18 @@ handle_addrs(char *host, struct sockaddr_in *addr4, struct sockaddr_in6 *addr6)
 	hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;
 	if((i = getaddrinfo(host, NULL, &hints, &res)) != 0)
 		return FALSE;
-	for(cur=res; cur && (addr4->sin_len == 0 || addr6->sin6_len == 0); cur=cur->ai_next) {
+	for(cur=res; cur && (*addr4len == 0 || *addr6len == 0); cur=cur->ai_next) {
 		switch (cur->ai_family) {
 			case AF_INET:
-				if (addr4->sin_len == 0) {
+				if (*addr4len == 0) {
 					addr4->sin_addr = ((struct sockaddr_in *)cur->ai_addr)->sin_addr;
-					addr4->sin_len = sizeof(struct sockaddr_in);
+					*addr4len = sizeof(struct sockaddr_in);
 				}
 				break;
 			case AF_INET6:
-				if (addr6->sin6_len == 0) {
+				if (*addr6len == 0) {
 					addr6->sin6_addr = ((struct sockaddr_in6 *)cur->ai_addr)->sin6_addr;
-					addr6->sin6_len = sizeof(struct sockaddr_in6);
+					*addr6len = sizeof(struct sockaddr_in6);
 				}
 				break;
 		}
@@ -2397,7 +2397,10 @@ js_connected_socket_constructor(JSContext *cx, uintN argc, jsval *arglist)
 	uint16_t bindport = 0;
 	struct sockaddr_in addr4;
 	struct sockaddr_in6 addr6;
+	socklen_t addr4len;
+	socklen_t addr6len;
 	struct sockaddr *addr;
+	socklen_t *addrlen;
 	BOOL sockbind = FALSE;
 	jsuint count;
 	int32 timeout = 10;
@@ -2451,12 +2454,12 @@ js_connected_socket_constructor(JSContext *cx, uintN argc, jsval *arglist)
 			memset(&addr4, 0, sizeof(addr4));
 			addr4.sin_family = AF_INET;
 			addr4.sin_addr.s_addr = INADDR_ANY;
-			addr4.sin_len = sizeof(addr4);
+			addr4len = sizeof(addr4);
 			addr4.sin_port = htons(bindport);
 			memset(&addr6, 0, sizeof(addr6));
 			addr6.sin6_family = AF_INET6;
 			addr6.sin6_addr = in6addr_any;
-			addr6.sin6_len = sizeof(addr6);
+			addr6len = sizeof(addr6);
 			addr6.sin6_port = htons(bindport);
 			sockbind = TRUE;
 		}
@@ -2472,8 +2475,8 @@ js_connected_socket_constructor(JSContext *cx, uintN argc, jsval *arglist)
 				addr6.sin6_port = htons(bindport);
 				sockbind = TRUE;
 			}
-			addr4.sin_len = 0;
-			addr6.sin6_len = 0;
+			addr4len = 0;
+			addr6len = 0;
 			if (JSVAL_IS_OBJECT(v)) {
 				ao = JSVAL_TO_OBJECT(v);
 				if (ao == NULL || !JS_IsArrayObject(cx, ao)) {
@@ -2492,7 +2495,7 @@ js_connected_socket_constructor(JSContext *cx, uintN argc, jsval *arglist)
 					JSVALUE_TO_MSTRING(cx, v, host, NULL);
 					HANDLE_PENDING(cx, host);
 					rc = JS_SUSPENDREQUEST(cx);
-					if (!handle_addrs(host, &addr4, &addr6)) {
+					if (!handle_addrs(host, &addr4, &addr4len, &addr6, &addr6len)) {
 						JS_RESUMEREQUEST(cx, rc);
 						JS_ReportError(cx, "Unparsable bindaddrs entry");
 						goto fail;
@@ -2505,7 +2508,7 @@ js_connected_socket_constructor(JSContext *cx, uintN argc, jsval *arglist)
 				JSVALUE_TO_MSTRING(cx, v, host, NULL);
 				HANDLE_PENDING(cx, host);
 				rc = JS_SUSPENDREQUEST(cx);
-				if (!handle_addrs(host, &addr4, &addr6)) {
+				if (!handle_addrs(host, &addr4, &addr4len, &addr6, &addr6len)) {
 					JS_RESUMEREQUEST(cx, rc);
 					JS_ReportError(cx, "Unparsable bindaddrs entry");
 					goto fail;
@@ -2561,16 +2564,18 @@ js_connected_socket_constructor(JSContext *cx, uintN argc, jsval *arglist)
 				switch(cur->ai_family) {
 					case PF_INET:
 						addr = (struct sockaddr *)&addr4;
+						addrlen = &addr4len;
 						break;
 					case PF_INET6:
 						addr = (struct sockaddr *)&addr6;
+						addrlen = &addr6len;
 						break;
 				}
 				if (addr == NULL)
 					continue;
-				if (addr->sa_len == 0)
+				if (*addrlen == 0)
 					continue;
-				if (bind(p->sock, addr, addr->sa_len) != 0) {
+				if (bind(p->sock, addr, *addrlen) != 0) {
 					lprintf(LOG_WARNING, "Unable to bind to local address");
 					closesocket(p->sock);
 					p->sock = INVALID_SOCKET;