SUNRPC: Use unsigned string lengths in xdr_decode_string_inplace
XDR strings, opaques, and net objects should all use unsigned lengths. To wit, RFC 4506 says: 4.2. Unsigned Integer An XDR unsigned integer is a 32-bit datum that encodes a non-negative integer in the range [0,4294967295]. ... 4.11. String The standard defines a string of n (numbered 0 through n-1) ASCII bytes to be the number n encoded as an unsigned integer (as described above), and followed by the n bytes of the string. After this patch, xdr_decode_string_inplace now matches the other XDR string and array helpers that take a string length argument. See: xdr_encode_opaque_fixed, xdr_encode_opaque, xdr_encode_array Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Acked-By: NeilBrown <neilb@suse.de> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
parent
01b2969a85
commit
e5cff482c7
|
@ -112,7 +112,8 @@ struct xdr_buf {
|
||||||
__be32 *xdr_encode_opaque_fixed(__be32 *p, const void *ptr, unsigned int len);
|
__be32 *xdr_encode_opaque_fixed(__be32 *p, const void *ptr, unsigned int len);
|
||||||
__be32 *xdr_encode_opaque(__be32 *p, const void *ptr, unsigned int len);
|
__be32 *xdr_encode_opaque(__be32 *p, const void *ptr, unsigned int len);
|
||||||
__be32 *xdr_encode_string(__be32 *p, const char *s);
|
__be32 *xdr_encode_string(__be32 *p, const char *s);
|
||||||
__be32 *xdr_decode_string_inplace(__be32 *p, char **sp, int *lenp, int maxlen);
|
__be32 *xdr_decode_string_inplace(__be32 *p, char **sp, unsigned int *lenp,
|
||||||
|
unsigned int maxlen);
|
||||||
__be32 *xdr_encode_netobj(__be32 *p, const struct xdr_netobj *);
|
__be32 *xdr_encode_netobj(__be32 *p, const struct xdr_netobj *);
|
||||||
__be32 *xdr_decode_netobj(__be32 *p, struct xdr_netobj *);
|
__be32 *xdr_decode_netobj(__be32 *p, struct xdr_netobj *);
|
||||||
|
|
||||||
|
|
|
@ -96,11 +96,13 @@ xdr_encode_string(__be32 *p, const char *string)
|
||||||
EXPORT_SYMBOL(xdr_encode_string);
|
EXPORT_SYMBOL(xdr_encode_string);
|
||||||
|
|
||||||
__be32 *
|
__be32 *
|
||||||
xdr_decode_string_inplace(__be32 *p, char **sp, int *lenp, int maxlen)
|
xdr_decode_string_inplace(__be32 *p, char **sp,
|
||||||
|
unsigned int *lenp, unsigned int maxlen)
|
||||||
{
|
{
|
||||||
unsigned int len;
|
u32 len;
|
||||||
|
|
||||||
if ((len = ntohl(*p++)) > maxlen)
|
len = ntohl(*p++);
|
||||||
|
if (len > maxlen)
|
||||||
return NULL;
|
return NULL;
|
||||||
*lenp = len;
|
*lenp = len;
|
||||||
*sp = (char *) p;
|
*sp = (char *) p;
|
||||||
|
|
Loading…
Reference in New Issue