|
|
@@ -340,12 +340,14 @@ gss_release_msg(struct gss_upcall_msg *gss_msg)
|
|
|
}
|
|
|
|
|
|
static struct gss_upcall_msg *
|
|
|
-__gss_find_upcall(struct rpc_pipe *pipe, kuid_t uid)
|
|
|
+__gss_find_upcall(struct rpc_pipe *pipe, kuid_t uid, const struct gss_auth *auth)
|
|
|
{
|
|
|
struct gss_upcall_msg *pos;
|
|
|
list_for_each_entry(pos, &pipe->in_downcall, list) {
|
|
|
if (!uid_eq(pos->uid, uid))
|
|
|
continue;
|
|
|
+ if (auth && pos->auth->service != auth->service)
|
|
|
+ continue;
|
|
|
atomic_inc(&pos->count);
|
|
|
dprintk("RPC: %s found msg %p\n", __func__, pos);
|
|
|
return pos;
|
|
|
@@ -365,7 +367,7 @@ gss_add_msg(struct gss_upcall_msg *gss_msg)
|
|
|
struct gss_upcall_msg *old;
|
|
|
|
|
|
spin_lock(&pipe->lock);
|
|
|
- old = __gss_find_upcall(pipe, gss_msg->uid);
|
|
|
+ old = __gss_find_upcall(pipe, gss_msg->uid, gss_msg->auth);
|
|
|
if (old == NULL) {
|
|
|
atomic_inc(&gss_msg->count);
|
|
|
list_add(&gss_msg->list, &pipe->in_downcall);
|
|
|
@@ -714,7 +716,7 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
|
|
|
err = -ENOENT;
|
|
|
/* Find a matching upcall */
|
|
|
spin_lock(&pipe->lock);
|
|
|
- gss_msg = __gss_find_upcall(pipe, uid);
|
|
|
+ gss_msg = __gss_find_upcall(pipe, uid, NULL);
|
|
|
if (gss_msg == NULL) {
|
|
|
spin_unlock(&pipe->lock);
|
|
|
goto err_put_ctx;
|