|
|
|
@ -648,6 +648,35 @@ void xdr_truncate_encode(struct xdr_stream *xdr, size_t len) |
|
|
|
|
} |
|
|
|
|
EXPORT_SYMBOL(xdr_truncate_encode); |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* xdr_restrict_buflen - decrease available buffer space |
|
|
|
|
* @xdr: pointer to xdr_stream |
|
|
|
|
* @newbuflen: new maximum number of bytes available |
|
|
|
|
* |
|
|
|
|
* Adjust our idea of how much space is available in the buffer. |
|
|
|
|
* If we've already used too much space in the buffer, returns -1. |
|
|
|
|
* If the available space is already smaller than newbuflen, returns 0 |
|
|
|
|
* and does nothing. Otherwise, adjusts xdr->buf->buflen to newbuflen |
|
|
|
|
* and ensures xdr->end is set at most offset newbuflen from the start |
|
|
|
|
* of the buffer. |
|
|
|
|
*/ |
|
|
|
|
int xdr_restrict_buflen(struct xdr_stream *xdr, int newbuflen) |
|
|
|
|
{ |
|
|
|
|
struct xdr_buf *buf = xdr->buf; |
|
|
|
|
int left_in_this_buf = (void *)xdr->end - (void *)xdr->p; |
|
|
|
|
int end_offset = buf->len + left_in_this_buf; |
|
|
|
|
|
|
|
|
|
if (newbuflen < 0 || newbuflen < buf->len) |
|
|
|
|
return -1; |
|
|
|
|
if (newbuflen > buf->buflen) |
|
|
|
|
return 0; |
|
|
|
|
if (newbuflen < end_offset) |
|
|
|
|
xdr->end = (void *)xdr->end + newbuflen - end_offset; |
|
|
|
|
buf->buflen = newbuflen; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
EXPORT_SYMBOL(xdr_restrict_buflen); |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* xdr_write_pages - Insert a list of pages into an XDR buffer for sending |
|
|
|
|
* @xdr: pointer to xdr_stream |
|
|
|
|