@@ -1952,7 +1952,7 @@ static int netlink_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
1952
1952
struct scm_cookie scm ;
1953
1953
struct sock * sk = sock -> sk ;
1954
1954
struct netlink_sock * nlk = nlk_sk (sk );
1955
- size_t copied ;
1955
+ size_t copied , max_recvmsg_len ;
1956
1956
struct sk_buff * skb , * data_skb ;
1957
1957
int err , ret ;
1958
1958
@@ -1985,9 +1985,10 @@ static int netlink_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
1985
1985
#endif
1986
1986
1987
1987
/* Record the max length of recvmsg() calls for future allocations */
1988
- nlk -> max_recvmsg_len = max (nlk -> max_recvmsg_len , len );
1989
- nlk -> max_recvmsg_len = min_t (size_t , nlk -> max_recvmsg_len ,
1990
- SKB_WITH_OVERHEAD (32768 ));
1988
+ max_recvmsg_len = max (READ_ONCE (nlk -> max_recvmsg_len ), len );
1989
+ max_recvmsg_len = min_t (size_t , max_recvmsg_len ,
1990
+ SKB_WITH_OVERHEAD (32768 ));
1991
+ WRITE_ONCE (nlk -> max_recvmsg_len , max_recvmsg_len );
1991
1992
1992
1993
copied = data_skb -> len ;
1993
1994
if (len < copied ) {
@@ -2236,6 +2237,7 @@ static int netlink_dump(struct sock *sk)
2236
2237
struct netlink_ext_ack extack = {};
2237
2238
struct netlink_callback * cb ;
2238
2239
struct sk_buff * skb = NULL ;
2240
+ size_t max_recvmsg_len ;
2239
2241
struct module * module ;
2240
2242
int err = - ENOBUFS ;
2241
2243
int alloc_min_size ;
@@ -2258,8 +2260,9 @@ static int netlink_dump(struct sock *sk)
2258
2260
cb = & nlk -> cb ;
2259
2261
alloc_min_size = max_t (int , cb -> min_dump_alloc , NLMSG_GOODSIZE );
2260
2262
2261
- if (alloc_min_size < nlk -> max_recvmsg_len ) {
2262
- alloc_size = nlk -> max_recvmsg_len ;
2263
+ max_recvmsg_len = READ_ONCE (nlk -> max_recvmsg_len );
2264
+ if (alloc_min_size < max_recvmsg_len ) {
2265
+ alloc_size = max_recvmsg_len ;
2263
2266
skb = alloc_skb (alloc_size ,
2264
2267
(GFP_KERNEL & ~__GFP_DIRECT_RECLAIM ) |
2265
2268
__GFP_NOWARN | __GFP_NORETRY );
0 commit comments