mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-26 20:38:12 +00:00
net/packet: convert po->auxdata to an atomic flag
[ Upstream commitfd53c297aa
] po->auxdata can be read while another thread is changing its value, potentially raising KCSAN splat. Convert it to PACKET_SOCK_AUXDATA flag. Fixes:8dc4194474
("[PACKET]: Add optional checksum computation for recvmsg") Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
1baa8c1be3
commit
c6eab3228d
3 changed files with 6 additions and 8 deletions
|
@ -3480,7 +3480,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
|||
memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, copy_len);
|
||||
}
|
||||
|
||||
if (pkt_sk(sk)->auxdata) {
|
||||
if (packet_sock_flag(pkt_sk(sk), PACKET_SOCK_AUXDATA)) {
|
||||
struct tpacket_auxdata aux;
|
||||
|
||||
aux.tp_status = TP_STATUS_USER;
|
||||
|
@ -3865,9 +3865,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
|||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
po->auxdata = !!val;
|
||||
release_sock(sk);
|
||||
packet_sock_flag_set(po, PACKET_SOCK_AUXDATA, val);
|
||||
return 0;
|
||||
}
|
||||
case PACKET_ORIGDEV:
|
||||
|
@ -4009,7 +4007,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
|
|||
|
||||
break;
|
||||
case PACKET_AUXDATA:
|
||||
val = po->auxdata;
|
||||
val = packet_sock_flag(po, PACKET_SOCK_AUXDATA);
|
||||
break;
|
||||
case PACKET_ORIGDEV:
|
||||
val = packet_sock_flag(po, PACKET_SOCK_ORIGDEV);
|
||||
|
|
|
@ -22,7 +22,7 @@ static int pdiag_put_info(const struct packet_sock *po, struct sk_buff *nlskb)
|
|||
pinfo.pdi_flags = 0;
|
||||
if (po->running)
|
||||
pinfo.pdi_flags |= PDI_RUNNING;
|
||||
if (po->auxdata)
|
||||
if (packet_sock_flag(po, PACKET_SOCK_AUXDATA))
|
||||
pinfo.pdi_flags |= PDI_AUXDATA;
|
||||
if (packet_sock_flag(po, PACKET_SOCK_ORIGDEV))
|
||||
pinfo.pdi_flags |= PDI_ORIGDEV;
|
||||
|
|
|
@ -117,8 +117,7 @@ struct packet_sock {
|
|||
struct mutex pg_vec_lock;
|
||||
unsigned long flags;
|
||||
unsigned int running; /* bind_lock must be held */
|
||||
unsigned int auxdata:1, /* writer must hold sock lock */
|
||||
has_vnet_hdr:1,
|
||||
unsigned int has_vnet_hdr:1, /* writer must hold sock lock */
|
||||
tp_loss:1,
|
||||
tp_tx_has_off:1;
|
||||
int pressure;
|
||||
|
@ -144,6 +143,7 @@ static struct packet_sock *pkt_sk(struct sock *sk)
|
|||
|
||||
enum packet_sock_flags {
|
||||
PACKET_SOCK_ORIGDEV,
|
||||
PACKET_SOCK_AUXDATA,
|
||||
};
|
||||
|
||||
static inline void packet_sock_flag_set(struct packet_sock *po,
|
||||
|
|
Loading…
Reference in a new issue