Commit 87d918d6 authored by J. Bruce Fields's avatar J. Bruce Fields Committed by Trond Myklebust

rpc: gss: fix a kmap_atomic race in krb5 code

This code is never called from interrupt context; it's always run by either
a user thread or rpciod.  So KM_SKB_SUNRPC_DATA is inappropriate here.

Thanks to Aimé Le Rouzic for capturing an oops which showed the kernel
taking an interrupt while we were in this piece of code, resulting in a
nested kmap_atomic(.,KM_SKB_SUNRPC_DATA) call from
xdr_partial_copy_from_skb().
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 8fc7500b
...@@ -57,9 +57,9 @@ gss_krb5_remove_padding(struct xdr_buf *buf, int blocksize) ...@@ -57,9 +57,9 @@ gss_krb5_remove_padding(struct xdr_buf *buf, int blocksize)
>>PAGE_CACHE_SHIFT; >>PAGE_CACHE_SHIFT;
int offset = (buf->page_base + len - 1) int offset = (buf->page_base + len - 1)
& (PAGE_CACHE_SIZE - 1); & (PAGE_CACHE_SIZE - 1);
ptr = kmap_atomic(buf->pages[last], KM_SKB_SUNRPC_DATA); ptr = kmap_atomic(buf->pages[last], KM_USER0);
pad = *(ptr + offset); pad = *(ptr + offset);
kunmap_atomic(ptr, KM_SKB_SUNRPC_DATA); kunmap_atomic(ptr, KM_USER0);
goto out; goto out;
} else } else
len -= buf->page_len; len -= buf->page_len;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment