X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/3b5f6214a6b9422bb320e0f954cc93477f4b0e23..ac7aa92290cf67c4e9541c02e10b9f232928c588:/clientname.c diff --git a/clientname.c b/clientname.c index 95dadd52..5dbaaf97 100644 --- a/clientname.c +++ b/clientname.c @@ -130,7 +130,7 @@ char *client_name(int fd) ssp = (struct sockaddr_storage *) &sin6; ss_len = sizeof sin6; memset(ssp, 0, ss_len); - inet_pton(AF_INET6, addr, &sin6.sin6_addr.s6_addr); + inet_pton(AF_INET6, addr, &sin6.sin6_addr); sin6.sin6_family = AF_INET6; } else #endif @@ -138,7 +138,7 @@ char *client_name(int fd) ssp = (struct sockaddr_storage *) &sin; ss_len = sizeof sin; memset(ssp, 0, ss_len); - inet_pton(AF_INET, addr, &sin.sin_addr.s_addr); + inet_pton(AF_INET, addr, &sin.sin_addr); sin.sin_family = AF_INET; } @@ -169,6 +169,8 @@ void client_sockaddr(int fd, struct sockaddr_storage *ss, socklen_t *ss_len) { + memset(ss, 0, sizeof(*ss)); + if (getpeername(fd, (struct sockaddr *) ss, ss_len)) { /* FIXME: Can we really not continue? */ rprintf(FERROR, RSYNC_NAME ": getpeername on fd%d failed: %s\n", @@ -193,7 +195,7 @@ void client_sockaddr(int fd, memset(sin, 0, sizeof(*sin)); sin->sin_family = AF_INET; *ss_len = sizeof(struct sockaddr_in); -#ifdef HAVE_SOCKADDR_LEN +#if HAVE_SOCKADDR_SIN_LEN sin->sin_len = *ss_len; #endif sin->sin_port = sin6.sin6_port; @@ -272,9 +274,23 @@ int compare_addrinfo_sockaddr(const struct addrinfo *ai, sin1 = (const struct sockaddr_in6 *) ss; sin2 = (const struct sockaddr_in6 *) ai->ai_addr; - - return memcmp(&sin1->sin6_addr, &sin2->sin6_addr, - sizeof sin1->sin6_addr); + + if (ai->ai_addrlen < sizeof(struct sockaddr_in6)) { + rprintf(FERROR, + "%s: too short sockaddr_in6; length=%d\n", + fn, ai->ai_addrlen); + return 1; + } + + if (memcmp(&sin1->sin6_addr, &sin2->sin6_addr, + sizeof sin1->sin6_addr)) + return 1; + +#ifdef HAVE_SOCKADDR_IN6_SCOPE_ID + if (sin1->sin6_scope_id != sin2->sin6_scope_id) + return 1; +#endif + return 0; } #endif /* INET6 */ else {