]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - include/linux/lockd/lockd.h
NLM: nlm_privileged_requester() doesn't recognize mapped loopback address
[mv-sheeva.git] / include / linux / lockd / lockd.h
index 8b57467375cca9c7f3fd5a3e71a776edda6e283d..80d7e8a8257d4e578f39d48c82800289847b9619 100644 (file)
@@ -112,16 +112,6 @@ static inline struct sockaddr *nlm_srcaddr(const struct nlm_host *host)
        return (struct sockaddr *)&host->h_srcaddr;
 }
 
-static inline struct sockaddr_in *nsm_addr_in(const struct nsm_handle *handle)
-{
-       return (struct sockaddr_in *)&handle->sm_addr;
-}
-
-static inline struct sockaddr *nsm_addr(const struct nsm_handle *handle)
-{
-       return (struct sockaddr *)&handle->sm_addr;
-}
-
 /*
  * Map an fl_owner_t into a unique 32-bit "pid"
  */
@@ -309,8 +299,14 @@ static inline int __nlm_privileged_request4(const struct sockaddr *sap)
 static inline int __nlm_privileged_request6(const struct sockaddr *sap)
 {
        const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
-       return (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LOOPBACK) &&
-                       (ntohs(sin6->sin6_port) < 1024);
+
+       if (ntohs(sin6->sin6_port) > 1023)
+               return 0;
+
+       if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_MAPPED)
+               return ipv4_is_loopback(sin6->sin6_addr.s6_addr32[3]);
+
+       return ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LOOPBACK;
 }
 #else  /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
 static inline int __nlm_privileged_request6(const struct sockaddr *sap)