Commit e6236f78 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6

* 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6:
  SUNRPC: Address buffer overrun in rpc_uaddr2sockaddr()
  NFSv4: Fix a cache validation bug which causes getcwd() to return ENOENT
parents 308efab5 1e360a60
...@@ -2767,7 +2767,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, ...@@ -2767,7 +2767,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
.pages = &page, .pages = &page,
.pgbase = 0, .pgbase = 0,
.count = count, .count = count,
.bitmask = NFS_SERVER(dentry->d_inode)->cache_consistency_bitmask, .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask,
}; };
struct nfs4_readdir_res res; struct nfs4_readdir_res res;
struct rpc_message msg = { struct rpc_message msg = {
......
...@@ -306,24 +306,25 @@ EXPORT_SYMBOL_GPL(rpc_sockaddr2uaddr); ...@@ -306,24 +306,25 @@ EXPORT_SYMBOL_GPL(rpc_sockaddr2uaddr);
* @sap: buffer into which to plant socket address * @sap: buffer into which to plant socket address
* @salen: size of buffer * @salen: size of buffer
* *
* @uaddr does not have to be '\0'-terminated, but strict_strtoul() and
* rpc_pton() require proper string termination to be successful.
*
* Returns the size of the socket address if successful; otherwise * Returns the size of the socket address if successful; otherwise
* zero is returned. * zero is returned.
*/ */
size_t rpc_uaddr2sockaddr(const char *uaddr, const size_t uaddr_len, size_t rpc_uaddr2sockaddr(const char *uaddr, const size_t uaddr_len,
struct sockaddr *sap, const size_t salen) struct sockaddr *sap, const size_t salen)
{ {
char *c, buf[RPCBIND_MAXUADDRLEN]; char *c, buf[RPCBIND_MAXUADDRLEN + sizeof('\0')];
unsigned long portlo, porthi; unsigned long portlo, porthi;
unsigned short port; unsigned short port;
if (uaddr_len > sizeof(buf)) if (uaddr_len > RPCBIND_MAXUADDRLEN)
return 0; return 0;
memcpy(buf, uaddr, uaddr_len); memcpy(buf, uaddr, uaddr_len);
buf[uaddr_len] = '\n'; buf[uaddr_len] = '\0';
buf[uaddr_len + 1] = '\0';
c = strrchr(buf, '.'); c = strrchr(buf, '.');
if (unlikely(c == NULL)) if (unlikely(c == NULL))
return 0; return 0;
...@@ -332,9 +333,7 @@ size_t rpc_uaddr2sockaddr(const char *uaddr, const size_t uaddr_len, ...@@ -332,9 +333,7 @@ size_t rpc_uaddr2sockaddr(const char *uaddr, const size_t uaddr_len,
if (unlikely(portlo > 255)) if (unlikely(portlo > 255))
return 0; return 0;
c[0] = '\n'; *c = '\0';
c[1] = '\0';
c = strrchr(buf, '.'); c = strrchr(buf, '.');
if (unlikely(c == NULL)) if (unlikely(c == NULL))
return 0; return 0;
...@@ -345,8 +344,7 @@ size_t rpc_uaddr2sockaddr(const char *uaddr, const size_t uaddr_len, ...@@ -345,8 +344,7 @@ size_t rpc_uaddr2sockaddr(const char *uaddr, const size_t uaddr_len,
port = (unsigned short)((porthi << 8) | portlo); port = (unsigned short)((porthi << 8) | portlo);
c[0] = '\0'; *c = '\0';
if (rpc_pton(buf, strlen(buf), sap, salen) == 0) if (rpc_pton(buf, strlen(buf), sap, salen) == 0)
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment