Skip to content

Commit 867ceac

Browse files
committed
Merge: core-net: stable backport for 9.5 phase 2
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/4662 JIRA: https://issues.redhat.com/browse/RHEL-46610 Tested: LNST A bunch of stable backports from upstream, addressing critical issues in core networking Signed-off-by: Paolo Abeni <pabeni@redhat.com> Approved-by: Sabrina Dubroca <sdubroca@redhat.com> Approved-by: Davide Caratti <dcaratti@redhat.com> Approved-by: Marcelo Ricardo Leitner <mleitner@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Lucas Zampieri <lzampier@redhat.com>
2 parents 4dc19da + 6a527ad commit 867ceac

File tree

3 files changed

+34
-11
lines changed

3 files changed

+34
-11
lines changed

net/core/datagram.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -434,15 +434,23 @@ static int __skb_datagram_iter(const struct sk_buff *skb, int offset,
434434

435435
end = start + skb_frag_size(frag);
436436
if ((copy = end - offset) > 0) {
437-
struct page *page = skb_frag_page(frag);
438-
u8 *vaddr = kmap(page);
437+
u32 p_off, p_len, copied;
438+
struct page *p;
439+
u8 *vaddr;
439440

440441
if (copy > len)
441442
copy = len;
442-
n = INDIRECT_CALL_1(cb, simple_copy_to_iter,
443-
vaddr + skb_frag_off(frag) + offset - start,
444-
copy, data, to);
445-
kunmap(page);
443+
444+
n = 0;
445+
skb_frag_foreach_page(frag,
446+
skb_frag_off(frag) + offset - start,
447+
copy, p, p_off, p_len, copied) {
448+
vaddr = kmap_local_page(p);
449+
n += INDIRECT_CALL_1(cb, simple_copy_to_iter,
450+
vaddr + p_off, p_len, data, to);
451+
kunmap_local(vaddr);
452+
}
453+
446454
offset += n;
447455
if (n != copy)
448456
goto short_copy;

net/core/net_namespace.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,15 @@ DEFINE_COOKIE(net_cookie);
6868

6969
static struct net_generic *net_alloc_generic(void)
7070
{
71+
unsigned int gen_ptrs = READ_ONCE(max_gen_ptrs);
72+
unsigned int generic_size;
7173
struct net_generic *ng;
72-
unsigned int generic_size = offsetof(struct net_generic, ptr[max_gen_ptrs]);
74+
75+
generic_size = offsetof(struct net_generic, ptr[gen_ptrs]);
7376

7477
ng = kzalloc(generic_size, GFP_KERNEL);
7578
if (ng)
76-
ng->s.len = max_gen_ptrs;
79+
ng->s.len = gen_ptrs;
7780

7881
return ng;
7982
}
@@ -669,11 +672,16 @@ EXPORT_SYMBOL_GPL(__put_net);
669672
* get_net_ns - increment the refcount of the network namespace
670673
* @ns: common namespace (net)
671674
*
672-
* Returns the net's common namespace.
675+
* Returns the net's common namespace or ERR_PTR() if ref is zero.
673676
*/
674677
struct ns_common *get_net_ns(struct ns_common *ns)
675678
{
676-
return &get_net(container_of(ns, struct net, ns))->ns;
679+
struct net *net;
680+
681+
net = maybe_get_net(container_of(ns, struct net, ns));
682+
if (net)
683+
return &net->ns;
684+
return ERR_PTR(-EINVAL);
677685
}
678686
EXPORT_SYMBOL_GPL(get_net_ns);
679687

@@ -1242,7 +1250,11 @@ static int register_pernet_operations(struct list_head *list,
12421250
if (error < 0)
12431251
return error;
12441252
*ops->id = error;
1245-
max_gen_ptrs = max(max_gen_ptrs, *ops->id + 1);
1253+
/* This does not require READ_ONCE as writers already hold
1254+
* pernet_ops_rwsem. But WRITE_ONCE is needed to protect
1255+
* net_alloc_generic.
1256+
*/
1257+
WRITE_ONCE(max_gen_ptrs, max(max_gen_ptrs, *ops->id + 1));
12461258
}
12471259
error = __register_pernet_operations(list, ops);
12481260
if (error) {

net/core/sock.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3631,6 +3631,9 @@ void sk_common_release(struct sock *sk)
36313631

36323632
sk->sk_prot->unhash(sk);
36333633

3634+
if (sk->sk_socket)
3635+
sk->sk_socket->sk = NULL;
3636+
36343637
/*
36353638
* In this point socket cannot receive new packets, but it is possible
36363639
* that some packets are in flight because some CPU runs receiver and

0 commit comments

Comments
 (0)