*(addr_buf + len) = '\0';
}
}
- } else
+ } else {
client_sockaddr(fd, &ss, &length);
-
- getnameinfo((struct sockaddr *)&ss, length,
- addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST);
+ getnameinfo((struct sockaddr *)&ss, length,
+ addr_buf, sizeof addr_buf, NULL, 0, NI_NUMERICHOST);
+ }
return addr_buf;
}
static char name_buf[100];
static char port_buf[100];
static int initialised;
- struct sockaddr_storage *ssp;
+ struct sockaddr_storage ss, *ssp;
+ struct sockaddr_in sin;
+#ifdef INET6
+ struct sockaddr_in6 sin6;
+#endif
socklen_t ss_len;
if (initialised) return name_buf;
/* daemon over --rsh mode */
char *addr = client_addr(fd);
- struct sockaddr_in sin;
#ifdef INET6
int dots = 0;
char *p;
- struct sockaddr_in6 sin6;
- for (p = addr; *p && (dots < 3); p++) {
+ for (p = addr; *p && (dots <= 3); p++) {
if (*p == '.')
dots++;
}
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
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;
}
} else {
- struct sockaddr_storage ss;
-
ss_len = sizeof ss;
ssp = &ss;
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",
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 {