|
@@ -1315,6 +1315,14 @@ svcauth_gss_wrap_resp_priv(struct svc_rqst *rqstp)
|
|
|
inpages = resbuf->pages;
|
|
|
/* XXX: Would be better to write some xdr helper functions for
|
|
|
* nfs{2,3,4}xdr.c that place the data right, instead of copying: */
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If there is currently tail data, make sure there is
|
|
|
+ * room for the head, tail, and 2 * RPC_MAX_AUTH_SIZE in
|
|
|
+ * the page, and move the current tail data such that
|
|
|
+ * there is RPC_MAX_AUTH_SIZE slack space available in
|
|
|
+ * both the head and tail.
|
|
|
+ */
|
|
|
if (resbuf->tail[0].iov_base) {
|
|
|
BUG_ON(resbuf->tail[0].iov_base >= resbuf->head[0].iov_base
|
|
|
+ PAGE_SIZE);
|
|
@@ -1327,6 +1335,13 @@ svcauth_gss_wrap_resp_priv(struct svc_rqst *rqstp)
|
|
|
resbuf->tail[0].iov_len);
|
|
|
resbuf->tail[0].iov_base += RPC_MAX_AUTH_SIZE;
|
|
|
}
|
|
|
+ /*
|
|
|
+ * If there is no current tail data, make sure there is
|
|
|
+ * room for the head data, and 2 * RPC_MAX_AUTH_SIZE in the
|
|
|
+ * allotted page, and set up tail information such that there
|
|
|
+ * is RPC_MAX_AUTH_SIZE slack space available in both the
|
|
|
+ * head and tail.
|
|
|
+ */
|
|
|
if (resbuf->tail[0].iov_base == NULL) {
|
|
|
if (resbuf->head[0].iov_len + 2*RPC_MAX_AUTH_SIZE > PAGE_SIZE)
|
|
|
return -ENOMEM;
|