mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
pNFS: Clean up open coded xdr string decoding
Use the existing xdr_stream_decode_string_dup() to safely decode into kmalloced strings. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
4aceaaea5e
commit
9889981349
1 changed files with 7 additions and 36 deletions
|
@ -1045,9 +1045,8 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags)
|
||||||
struct nfs4_pnfs_ds_addr *da = NULL;
|
struct nfs4_pnfs_ds_addr *da = NULL;
|
||||||
char *buf, *portstr;
|
char *buf, *portstr;
|
||||||
__be16 port;
|
__be16 port;
|
||||||
int nlen, rlen;
|
ssize_t nlen, rlen;
|
||||||
int tmp[2];
|
int tmp[2];
|
||||||
__be32 *p;
|
|
||||||
char *netid;
|
char *netid;
|
||||||
size_t len;
|
size_t len;
|
||||||
char *startsep = "";
|
char *startsep = "";
|
||||||
|
@ -1055,45 +1054,17 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags)
|
||||||
|
|
||||||
|
|
||||||
/* r_netid */
|
/* r_netid */
|
||||||
p = xdr_inline_decode(xdr, 4);
|
nlen = xdr_stream_decode_string_dup(xdr, &netid, XDR_MAX_NETOBJ,
|
||||||
if (unlikely(!p))
|
gfp_flags);
|
||||||
|
if (unlikely(nlen < 0))
|
||||||
goto out_err;
|
goto out_err;
|
||||||
nlen = be32_to_cpup(p++);
|
|
||||||
|
|
||||||
p = xdr_inline_decode(xdr, nlen);
|
|
||||||
if (unlikely(!p))
|
|
||||||
goto out_err;
|
|
||||||
|
|
||||||
netid = kmalloc(nlen+1, gfp_flags);
|
|
||||||
if (unlikely(!netid))
|
|
||||||
goto out_err;
|
|
||||||
|
|
||||||
netid[nlen] = '\0';
|
|
||||||
memcpy(netid, p, nlen);
|
|
||||||
|
|
||||||
/* r_addr: ip/ip6addr with port in dec octets - see RFC 5665 */
|
/* r_addr: ip/ip6addr with port in dec octets - see RFC 5665 */
|
||||||
p = xdr_inline_decode(xdr, 4);
|
|
||||||
if (unlikely(!p))
|
|
||||||
goto out_free_netid;
|
|
||||||
rlen = be32_to_cpup(p);
|
|
||||||
|
|
||||||
p = xdr_inline_decode(xdr, rlen);
|
|
||||||
if (unlikely(!p))
|
|
||||||
goto out_free_netid;
|
|
||||||
|
|
||||||
/* port is ".ABC.DEF", 8 chars max */
|
/* port is ".ABC.DEF", 8 chars max */
|
||||||
if (rlen > INET6_ADDRSTRLEN + IPV6_SCOPE_ID_LEN + 8) {
|
rlen = xdr_stream_decode_string_dup(xdr, &buf, INET6_ADDRSTRLEN +
|
||||||
dprintk("%s: Invalid address, length %d\n", __func__,
|
IPV6_SCOPE_ID_LEN + 8, gfp_flags);
|
||||||
rlen);
|
if (unlikely(rlen < 0))
|
||||||
goto out_free_netid;
|
goto out_free_netid;
|
||||||
}
|
|
||||||
buf = kmalloc(rlen + 1, gfp_flags);
|
|
||||||
if (!buf) {
|
|
||||||
dprintk("%s: Not enough memory\n", __func__);
|
|
||||||
goto out_free_netid;
|
|
||||||
}
|
|
||||||
buf[rlen] = '\0';
|
|
||||||
memcpy(buf, p, rlen);
|
|
||||||
|
|
||||||
/* replace port '.' with '-' */
|
/* replace port '.' with '-' */
|
||||||
portstr = strrchr(buf, '.');
|
portstr = strrchr(buf, '.');
|
||||||
|
|
Loading…
Add table
Reference in a new issue