Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 603178 Details for
Bug 711844
cannot automount NFSv4 over IPv6
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Patch - fix ipv6 proximity calculation
autofs-5.0.7-fix-ipv6-proximity-calculation.patch (text/plain), 7.06 KB, created by
Ian Kent
on 2012-08-09 06:15:49 UTC
(
hide
)
Description:
Patch - fix ipv6 proximity calculation
Filename:
MIME Type:
Creator:
Ian Kent
Created:
2012-08-09 06:15:49 UTC
Size:
7.06 KB
patch
obsolete
>autofs-5.0.7 - fix ipv6 proximity calculation > >From: Ian Kent <ikent@redhat.com> > >The socket based ioctl used to get interface information only >return IPv4 information. Change get_proximity() function to use >getifaddrs(3) instead. >--- > > CHANGELOG | 1 > modules/replicated.c | 157 +++++++++++++-------------------------------------- > 2 files changed, 42 insertions(+), 116 deletions(-) > > >--- autofs-5.0.6.orig/CHANGELOG >+++ autofs-5.0.6/CHANGELOG >@@ -18,6 +18,7 @@ > - fix ipv6 rpc calls. > - fix ipv6 configure check. > - fix nfs4 contacts portmap. >+- fix ipv6 proximity calculation. > > 28/06/2011 autofs-5.0.6 > ----------------------- >--- autofs-5.0.6.orig/modules/replicated.c >+++ autofs-5.0.6/modules/replicated.c >@@ -52,6 +52,7 @@ > #include <net/if.h> > #include <netinet/in.h> > #include <netdb.h> >+#include <ifaddrs.h> > > #include "rpc_subs.h" > #include "replicated.h" >@@ -110,58 +111,18 @@ void seed_random(void) > return; > } > >-static int alloc_ifreq(struct ifconf *ifc, int sock) >-{ >- int ret, lastlen = ifc_last_len, len = ifc_buf_len; >- char err_buf[MAX_ERR_BUF], *buf; >- >- while (1) { >- buf = malloc(len); >- if (!buf) { >- char *estr = strerror_r(errno, err_buf, MAX_ERR_BUF); >- logerr("malloc: %s", estr); >- return 0; >- } >- >- ifc->ifc_len = len; >- ifc->ifc_req = (struct ifreq *) buf; >- >- ret = ioctl(sock, SIOCGIFCONF, ifc); >- if (ret == -1) { >- char *estr = strerror_r(errno, err_buf, MAX_ERR_BUF); >- logerr("ioctl: %s", estr); >- free(buf); >- return 0; >- } >- >- if (ifc->ifc_len <= lastlen) >- break; >- >- lastlen = ifc->ifc_len; >- len += MAX_IFC_BUF; >- free(buf); >- } >- >- if (lastlen != ifc_last_len) { >- ifc_last_len = lastlen; >- ifc_buf_len = len; >- } >- >- return 1; >-} >- > static unsigned int get_proximity(struct sockaddr *host_addr) > { >+ struct ifaddrs *ifa = NULL; >+ struct ifaddrs *this; > struct sockaddr_in *addr, *msk_addr, *if_addr; > struct sockaddr_in6 *addr6, *msk6_addr, *if6_addr; > struct in_addr *hst_addr; > struct in6_addr *hst6_addr; > int addr_len; >- char buf[MAX_ERR_BUF], *ptr; >- struct ifconf ifc; >- struct ifreq *ifr, nmptr; >- int sock, ret, i; >+ char buf[MAX_ERR_BUF]; > uint32_t mask, ha, ia, *mask6, *ha6, *ia6; >+ int ret; > > addr = NULL; > addr6 = NULL; >@@ -170,13 +131,14 @@ static unsigned int get_proximity(struct > mask6 = NULL; > ha6 = NULL; > ia6 = NULL; >+ ha = 0; > > switch (host_addr->sa_family) { > case AF_INET: > addr = (struct sockaddr_in *) host_addr; > hst_addr = (struct in_addr *) &addr->sin_addr; > ha = ntohl((uint32_t) hst_addr->s_addr); >- addr_len = sizeof(hst_addr); >+ addr_len = sizeof(*hst_addr); > break; > > case AF_INET6: >@@ -186,7 +148,7 @@ static unsigned int get_proximity(struct > addr6 = (struct sockaddr_in6 *) host_addr; > hst6_addr = (struct in6_addr *) &addr6->sin6_addr; > ha6 = &hst6_addr->s6_addr32[0]; >- addr_len = sizeof(hst6_addr); >+ addr_len = sizeof(*hst6_addr); > break; > #endif > >@@ -194,36 +156,27 @@ static unsigned int get_proximity(struct > return PROXIMITY_ERROR; > } > >- sock = open_sock(AF_INET, SOCK_DGRAM, 0); >- if (sock < 0) { >+ ret = getifaddrs(&ifa); >+ if (ret) { > char *estr = strerror_r(errno, buf, MAX_ERR_BUF); >- logerr("socket creation failed: %s", estr); >- return PROXIMITY_ERROR; >- } >- >- if (!alloc_ifreq(&ifc, sock)) { >- close(sock); >+ logerr("getifaddrs: %s", estr); > return PROXIMITY_ERROR; > } > >- /* For each interface */ >- >- /* Is the address a local interface */ >- i = 0; >- ptr = (char *) &ifc.ifc_buf[0]; >- >- while (ptr < (char *) ifc.ifc_req + ifc.ifc_len) { >- ifr = (struct ifreq *) ptr; >+ this = ifa; >+ while (this) { >+ if (this->ifa_flags & IFF_POINTOPOINT || >+ this->ifa_addr->sa_data == NULL) { >+ this = this->ifa_next; >+ continue; >+ } > >- switch (ifr->ifr_addr.sa_family) { >+ switch (this->ifa_addr->sa_family) { > case AF_INET: >- if (host_addr->sa_family == AF_INET6) >- break; >- if_addr = (struct sockaddr_in *) &ifr->ifr_addr; >+ if_addr = (struct sockaddr_in *) this->ifa_addr; > ret = memcmp(&if_addr->sin_addr, hst_addr, addr_len); > if (!ret) { >- close(sock); >- free(ifc.ifc_req); >+ freeifaddrs(ifa); > return PROXIMITY_LOCAL; > } > break; >@@ -232,57 +185,39 @@ static unsigned int get_proximity(struct > #ifndef WITH_LIBTIRPC > return PROXIMITY_UNSUPPORTED; > #else >- if (host_addr->sa_family == AF_INET) >- break; >- >- if6_addr = (struct sockaddr_in6 *) &ifr->ifr_addr; >+ if6_addr = (struct sockaddr_in6 *) this->ifa_addr; > ret = memcmp(&if6_addr->sin6_addr, hst6_addr, addr_len); > if (!ret) { >- close(sock); >- free(ifc.ifc_req); >+ freeifaddrs(ifa); > return PROXIMITY_LOCAL; > } > #endif >- > default: > break; > } >- >- i++; >- ptr = (char *) &ifc.ifc_req[i]; >+ this = this->ifa_next; > } > >- i = 0; >- ptr = (char *) &ifc.ifc_buf[0]; >- >- while (ptr < (char *) ifc.ifc_req + ifc.ifc_len) { >- ifr = (struct ifreq *) ptr; >- >- nmptr = *ifr; >- ret = ioctl(sock, SIOCGIFNETMASK, &nmptr); >- if (ret == -1) { >- char *estr = strerror_r(errno, buf, MAX_ERR_BUF); >- logerr("ioctl: %s", estr); >- close(sock); >- free(ifc.ifc_req); >- return PROXIMITY_ERROR; >+ this = ifa; >+ while (this) { >+ if (this->ifa_flags & IFF_POINTOPOINT || >+ this->ifa_addr->sa_data == NULL) { >+ this = this->ifa_next; >+ continue; > } > >- switch (ifr->ifr_addr.sa_family) { >+ switch (this->ifa_addr->sa_family) { > case AF_INET: >- if (host_addr->sa_family == AF_INET6) >- break; >- if_addr = (struct sockaddr_in *) &ifr->ifr_addr; >+ if_addr = (struct sockaddr_in *) this->ifa_addr; > ia = ntohl((uint32_t) if_addr->sin_addr.s_addr); > >- /* Is the address within a localiy attached subnet */ >+ /* Is the address within a localy attached subnet */ > >- msk_addr = (struct sockaddr_in *) &nmptr.ifr_netmask; >+ msk_addr = (struct sockaddr_in *) this->ifa_netmask; > mask = ntohl((uint32_t) msk_addr->sin_addr.s_addr); > > if ((ia & mask) == (ha & mask)) { >- close(sock); >- free(ifc.ifc_req); >+ freeifaddrs(ifa); > return PROXIMITY_SUBNET; > } > >@@ -304,8 +239,7 @@ static unsigned int get_proximity(struct > break; > > if ((ia & mask) == (ha & mask)) { >- close(sock); >- free(ifc.ifc_req); >+ freeifaddrs(ifa); > return PROXIMITY_NET; > } > break; >@@ -314,37 +248,28 @@ static unsigned int get_proximity(struct > #ifndef WITH_LIBTIRPC > return PROXIMITY_UNSUPPORTED; > #else >- if (host_addr->sa_family == AF_INET) >- break; >- >- if6_addr = (struct sockaddr_in6 *) &ifr->ifr_addr; >+ if6_addr = (struct sockaddr_in6 *) this->ifa_addr; > ia6 = &if6_addr->sin6_addr.s6_addr32[0]; > > /* Is the address within the network of the interface */ > >- msk6_addr = (struct sockaddr_in6 *) &nmptr.ifr_netmask; >+ msk6_addr = (struct sockaddr_in6 *) this->ifa_netmask; > mask6 = &msk6_addr->sin6_addr.s6_addr32[0]; > > if (ipv6_mask_cmp(ha6, ia6, mask6)) { >- close(sock); >- free(ifc.ifc_req); >+ freeifaddrs(ifa); > return PROXIMITY_SUBNET; > } > > /* How do we define "local network" in ipv6? */ > #endif >- break; >- > default: > break; > } >- >- i++; >- ptr = (char *) &ifc.ifc_req[i]; >+ this = this->ifa_next; > } > >- close(sock); >- free(ifc.ifc_req); >+ freeifaddrs(ifa); > > return PROXIMITY_OTHER; > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 711844
:
503836
|
503837
|
603173
|
603174
|
603175
|
603177
| 603178