1
0
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:
Jeremy Allison 2007-11-02 10:25:34 -07:00
parent 8c73e19f51
commit 4d7badb0c4
4 changed files with 43 additions and 7 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -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));
}
/****************************************************************************

View File

@ -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,