mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-18 20:04:16 +08:00
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
This commit is contained in:
commit
e6236f781c
@ -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);
|
|||||||
* @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,
|
|||||||
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,
|
|||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user