Skip to content

Commit

Permalink
pNFS: Clean up open coded xdr string decoding
Browse files Browse the repository at this point in the history
Use the existing xdr_stream_decode_string_dup() to safely decode into
kmalloced strings.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
  • Loading branch information
Trond Myklebust committed Dec 2, 2020
1 parent 4aceaae commit 9889981
Showing 1 changed file with 7 additions and 36 deletions.
43 changes: 7 additions & 36 deletions fs/nfs/pnfs_nfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1045,55 +1045,26 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags)
struct nfs4_pnfs_ds_addr *da = NULL;
char *buf, *portstr;
__be16 port;
int nlen, rlen;
ssize_t nlen, rlen;
int tmp[2];
__be32 *p;
char *netid;
size_t len;
char *startsep = "";
char *endsep = "";


/* r_netid */
p = xdr_inline_decode(xdr, 4);
if (unlikely(!p))
nlen = xdr_stream_decode_string_dup(xdr, &netid, XDR_MAX_NETOBJ,
gfp_flags);
if (unlikely(nlen < 0))
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 */
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 */
if (rlen > INET6_ADDRSTRLEN + IPV6_SCOPE_ID_LEN + 8) {
dprintk("%s: Invalid address, length %d\n", __func__,
rlen);
rlen = xdr_stream_decode_string_dup(xdr, &buf, INET6_ADDRSTRLEN +
IPV6_SCOPE_ID_LEN + 8, gfp_flags);
if (unlikely(rlen < 0))
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 '-' */
portstr = strrchr(buf, '.');
Expand Down

0 comments on commit 9889981

Please sign in to comment.