mirror of
https://github.com/samba-team/samba.git
synced 2025-02-05 21:57:51 +03:00
Fix Solaris by ensuring we use the IPv4 or IPv6 length
in any getnameinfo calls. Jeremy
This commit is contained in:
parent
8c73e19f51
commit
4d7badb0c4
@ -696,6 +696,16 @@ int get_interfaces(struct iface_struct *ifaces, int max_interfaces)
|
||||
#ifdef AUTOCONF_TEST
|
||||
/* this is the autoconf driver to test get_interfaces() */
|
||||
|
||||
static socklen_t calc_sa_size(struct sockaddr *psa)
|
||||
{
|
||||
socklen_t sl = sizeof(struct sockaddr_in);
|
||||
#if defined(HAVE_IPV6)
|
||||
if (psa->sa_family == AF_INET6) {
|
||||
salen = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
struct iface_struct ifaces[MAX_INTERFACES];
|
||||
@ -710,22 +720,23 @@ int get_interfaces(struct iface_struct *ifaces, int max_interfaces)
|
||||
for (i=0;i<total;i++) {
|
||||
char addr[INET6_ADDRSTRLEN];
|
||||
int ret;
|
||||
socklen_t sl;
|
||||
printf("%-10s ", ifaces[i].name);
|
||||
addr[0] = '\0';
|
||||
ret = getnameinfo((struct sockaddr *)&ifaces[i].ip,
|
||||
sizeof(ifaces[i].ip),
|
||||
calc_sa_size(&ifaces[i].ip),
|
||||
addr, sizeof(addr),
|
||||
NULL, 0, NI_NUMERICHOST);
|
||||
printf("IP=%s ", addr);
|
||||
addr[0] = '\0';
|
||||
ret = getnameinfo((struct sockaddr *)&ifaces[i].netmask,
|
||||
sizeof(ifaces[i].netmask),
|
||||
calc_sa_size(&ifaces[i].netmask),
|
||||
addr, sizeof(addr),
|
||||
NULL, 0, NI_NUMERICHOST);
|
||||
printf("NETMASK=%s ", addr);
|
||||
addr[0] = '\0';
|
||||
ret = getnameinfo((struct sockaddr *)&ifaces[i].bcast,
|
||||
sizeof(ifaces[i].bcast),
|
||||
calc_sa_size(&ifaces[i].bcast),
|
||||
addr, sizeof(addr),
|
||||
NULL, 0, NI_NUMERICHOST);
|
||||
printf("BCAST=%s\n", addr);
|
||||
|
@ -2545,3 +2545,27 @@ int sys_getpeereid( int s, uid_t *uid)
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
int sys_getnameinfo(const struct sockaddr *psa,
|
||||
socklen_t salen,
|
||||
char *host,
|
||||
size_t hostlen,
|
||||
char *service,
|
||||
size_t servlen,
|
||||
int flags)
|
||||
{
|
||||
/*
|
||||
* For Solaris we must make sure salen is the
|
||||
* correct length for the incoming sa_family.
|
||||
*/
|
||||
|
||||
if (salen == sizeof(struct sockaddr_storage)) {
|
||||
salen = sizeof(struct sockaddr_in);
|
||||
#if defined(HAVE_IPV6)
|
||||
if (psa->sa_family == AF_INET6) {
|
||||
salen = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return getnameinfo(psa, salen, host, hostlen, service, servlen, flags);
|
||||
}
|
||||
|
@ -495,7 +495,7 @@ bool is_address_any(const struct sockaddr_storage *psa)
|
||||
Print out an IPv4 or IPv6 address from a struct sockaddr_storage.
|
||||
****************************************************************************/
|
||||
|
||||
char *print_sockaddr_len(char *dest,
|
||||
static char *print_sockaddr_len(char *dest,
|
||||
size_t destlen,
|
||||
const struct sockaddr_storage *psa,
|
||||
socklen_t psalen)
|
||||
@ -503,7 +503,7 @@ char *print_sockaddr_len(char *dest,
|
||||
if (destlen > 0) {
|
||||
dest[0] = '\0';
|
||||
}
|
||||
(void)getnameinfo((const struct sockaddr *)psa,
|
||||
(void)sys_getnameinfo((const struct sockaddr *)psa,
|
||||
psalen,
|
||||
dest, destlen,
|
||||
NULL, 0,
|
||||
@ -519,7 +519,8 @@ char *print_sockaddr(char *dest,
|
||||
size_t destlen,
|
||||
const struct sockaddr_storage *psa)
|
||||
{
|
||||
return print_sockaddr_len(dest, destlen, psa, sizeof(*psa));
|
||||
return print_sockaddr_len(dest, destlen, psa,
|
||||
sizeof(struct sockaddr_storage));
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -131,7 +131,7 @@ static int net_lookup_ldap(int argc, const char **argv)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = getnameinfo((struct sockaddr *)&ss,
|
||||
ret = sys_getnameinfo((struct sockaddr *)&ss,
|
||||
sizeof(struct sockaddr_storage),
|
||||
h_name, sizeof(h_name),
|
||||
NULL, 0,
|
||||
|
Loading…
x
Reference in New Issue
Block a user