forked from Minki/linux
0ad95472bf
Commit cb7323fffa
("lockd: create and use per-net NSM
RPC clients on MON/UNMON requests") introduced per-net
NSM RPC clients. Unfortunately this doesn't make any sense
without per-net nsm_handle.
E.g. the following scenario could happen
Two hosts (X and Y) in different namespaces (A and B) share
the same nsm struct.
1. nsm_monitor(host_X) called => NSM rpc client created,
nsm->sm_monitored bit set.
2. nsm_mointor(host-Y) called => nsm->sm_monitored already set,
we just exit. Thus in namespace B ln->nsm_clnt == NULL.
3. host X destroyed => nsm->sm_count decremented to 1
4. host Y destroyed => nsm_unmonitor() => nsm_mon_unmon() => NULL-ptr
dereference of *ln->nsm_clnt
So this could be fixed by making per-net nsm_handles list,
instead of global. Thus different net namespaces will not be able
share the same nsm_handle.
Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
24 lines
427 B
C
24 lines
427 B
C
#ifndef __LOCKD_NETNS_H__
|
|
#define __LOCKD_NETNS_H__
|
|
|
|
#include <linux/fs.h>
|
|
#include <net/netns/generic.h>
|
|
|
|
struct lockd_net {
|
|
unsigned int nlmsvc_users;
|
|
unsigned long next_gc;
|
|
unsigned long nrhosts;
|
|
|
|
struct delayed_work grace_period_end;
|
|
struct lock_manager lockd_manager;
|
|
|
|
spinlock_t nsm_clnt_lock;
|
|
unsigned int nsm_users;
|
|
struct rpc_clnt *nsm_clnt;
|
|
struct list_head nsm_handles;
|
|
};
|
|
|
|
extern int lockd_net_id;
|
|
|
|
#endif
|