forked from luck/tmp_suning_uos_patched
SUNRPC: Add helpers for decoding opaque and string types
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
d943f2dd8d
commit
0e779aa703
|
@ -253,6 +253,12 @@ xdr_stream_remaining(const struct xdr_stream *xdr)
|
|||
return xdr->nwords << 2;
|
||||
}
|
||||
|
||||
ssize_t xdr_stream_decode_opaque(struct xdr_stream *xdr, void *ptr,
|
||||
size_t size);
|
||||
ssize_t xdr_stream_decode_opaque_dup(struct xdr_stream *xdr, void **ptr,
|
||||
size_t maxlen, gfp_t gfp_flags);
|
||||
ssize_t xdr_stream_decode_string(struct xdr_stream *xdr, char *str,
|
||||
size_t size);
|
||||
ssize_t xdr_stream_decode_string_dup(struct xdr_stream *xdr, char **str,
|
||||
size_t maxlen, gfp_t gfp_flags);
|
||||
/**
|
||||
|
|
|
@ -1518,6 +1518,88 @@ xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(xdr_process_buf);
|
||||
|
||||
/**
|
||||
* xdr_stream_decode_opaque - Decode variable length opaque
|
||||
* @xdr: pointer to xdr_stream
|
||||
* @ptr: location to store opaque data
|
||||
* @size: size of storage buffer @ptr
|
||||
*
|
||||
* Return values:
|
||||
* On success, returns size of object stored in *@ptr
|
||||
* %-EBADMSG on XDR buffer overflow
|
||||
* %-EMSGSIZE on overflow of storage buffer @ptr
|
||||
*/
|
||||
ssize_t xdr_stream_decode_opaque(struct xdr_stream *xdr, void *ptr, size_t size)
|
||||
{
|
||||
ssize_t ret;
|
||||
void *p;
|
||||
|
||||
ret = xdr_stream_decode_opaque_inline(xdr, &p, size);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
memcpy(ptr, p, ret);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xdr_stream_decode_opaque);
|
||||
|
||||
/**
|
||||
* xdr_stream_decode_opaque_dup - Decode and duplicate variable length opaque
|
||||
* @xdr: pointer to xdr_stream
|
||||
* @ptr: location to store pointer to opaque data
|
||||
* @maxlen: maximum acceptable object size
|
||||
* @gfp_flags: GFP mask to use
|
||||
*
|
||||
* Return values:
|
||||
* On success, returns size of object stored in *@ptr
|
||||
* %-EBADMSG on XDR buffer overflow
|
||||
* %-EMSGSIZE if the size of the object would exceed @maxlen
|
||||
* %-ENOMEM on memory allocation failure
|
||||
*/
|
||||
ssize_t xdr_stream_decode_opaque_dup(struct xdr_stream *xdr, void **ptr,
|
||||
size_t maxlen, gfp_t gfp_flags)
|
||||
{
|
||||
ssize_t ret;
|
||||
void *p;
|
||||
|
||||
ret = xdr_stream_decode_opaque_inline(xdr, &p, maxlen);
|
||||
if (ret > 0) {
|
||||
*ptr = kmemdup(p, ret, gfp_flags);
|
||||
if (*ptr != NULL)
|
||||
return ret;
|
||||
ret = -ENOMEM;
|
||||
}
|
||||
*ptr = NULL;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xdr_stream_decode_opaque_dup);
|
||||
|
||||
/**
|
||||
* xdr_stream_decode_string - Decode variable length string
|
||||
* @xdr: pointer to xdr_stream
|
||||
* @str: location to store string
|
||||
* @size: size of storage buffer @str
|
||||
*
|
||||
* Return values:
|
||||
* On success, returns length of NUL-terminated string stored in *@str
|
||||
* %-EBADMSG on XDR buffer overflow
|
||||
* %-EMSGSIZE on overflow of storage buffer @str
|
||||
*/
|
||||
ssize_t xdr_stream_decode_string(struct xdr_stream *xdr, char *str, size_t size)
|
||||
{
|
||||
ssize_t ret;
|
||||
void *p;
|
||||
|
||||
ret = xdr_stream_decode_opaque_inline(xdr, &p, size);
|
||||
if (ret > 0) {
|
||||
memcpy(str, p, ret);
|
||||
str[ret] = '\0';
|
||||
return strlen(str);
|
||||
}
|
||||
*str = '\0';
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xdr_stream_decode_string);
|
||||
|
||||
/**
|
||||
* xdr_stream_decode_string_dup - Decode and duplicate variable length string
|
||||
* @xdr: pointer to xdr_stream
|
||||
|
|
Loading…
Reference in New Issue
Block a user