diff options
author | Björn Töpel <bjorn.topel@intel.com> | 2019-09-04 07:49:13 -0400 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-09-05 08:11:52 -0400 |
commit | 25dc18ff9b583a76fff00c7d9d14a40524653c45 (patch) | |
tree | 44b3cf7745546d08d882b8e09403bbe14d6fcf04 | |
parent | 42fddcc7c64b723a867c7b2f5f7505e244212f13 (diff) |
xsk: lock the control mutex in sock_diag interface
When accessing the members of an XDP socket, the control mutex should
be held. This commit fixes that.
Acked-by: Jonathan Lemon <jonathan.lemon@gmail.com>
Fixes: a36b38aa2af6 ("xsk: add sock_diag interface for AF_XDP")
Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r-- | net/xdp/xsk_diag.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/xdp/xsk_diag.c b/net/xdp/xsk_diag.c index 9986a759fe06..f59791ba43a0 100644 --- a/net/xdp/xsk_diag.c +++ b/net/xdp/xsk_diag.c | |||
@@ -97,6 +97,7 @@ static int xsk_diag_fill(struct sock *sk, struct sk_buff *nlskb, | |||
97 | msg->xdiag_ino = sk_ino; | 97 | msg->xdiag_ino = sk_ino; |
98 | sock_diag_save_cookie(sk, msg->xdiag_cookie); | 98 | sock_diag_save_cookie(sk, msg->xdiag_cookie); |
99 | 99 | ||
100 | mutex_lock(&xs->mutex); | ||
100 | if ((req->xdiag_show & XDP_SHOW_INFO) && xsk_diag_put_info(xs, nlskb)) | 101 | if ((req->xdiag_show & XDP_SHOW_INFO) && xsk_diag_put_info(xs, nlskb)) |
101 | goto out_nlmsg_trim; | 102 | goto out_nlmsg_trim; |
102 | 103 | ||
@@ -117,10 +118,12 @@ static int xsk_diag_fill(struct sock *sk, struct sk_buff *nlskb, | |||
117 | sock_diag_put_meminfo(sk, nlskb, XDP_DIAG_MEMINFO)) | 118 | sock_diag_put_meminfo(sk, nlskb, XDP_DIAG_MEMINFO)) |
118 | goto out_nlmsg_trim; | 119 | goto out_nlmsg_trim; |
119 | 120 | ||
121 | mutex_unlock(&xs->mutex); | ||
120 | nlmsg_end(nlskb, nlh); | 122 | nlmsg_end(nlskb, nlh); |
121 | return 0; | 123 | return 0; |
122 | 124 | ||
123 | out_nlmsg_trim: | 125 | out_nlmsg_trim: |
126 | mutex_unlock(&xs->mutex); | ||
124 | nlmsg_cancel(nlskb, nlh); | 127 | nlmsg_cancel(nlskb, nlh); |
125 | return -EMSGSIZE; | 128 | return -EMSGSIZE; |
126 | } | 129 | } |