CVE-2025-39758
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
11/09/2025
Last modified:
15/09/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
RDMA/siw: Fix the sendmsg byte count in siw_tcp_sendpages<br />
<br />
Ever since commit c2ff29e99a76 ("siw: Inline do_tcp_sendpages()"),<br />
we have been doing this:<br />
<br />
static int siw_tcp_sendpages(struct socket *s, struct page **page, int offset,<br />
size_t size)<br />
[...]<br />
/* Calculate the number of bytes we need to push, for this page<br />
* specifically */<br />
size_t bytes = min_t(size_t, PAGE_SIZE - offset, size);<br />
/* If we can&#39;t splice it, then copy it in, as normal */<br />
if (!sendpage_ok(page[i]))<br />
msg.msg_flags &= ~MSG_SPLICE_PAGES;<br />
/* Set the bvec pointing to the page, with len $bytes */<br />
bvec_set_page(&bvec, page[i], bytes, offset);<br />
/* Set the iter to $size, aka the size of the whole sendpages (!!!) */<br />
iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);<br />
try_page_again:<br />
lock_sock(sk);<br />
/* Sendmsg with $size size (!!!) */<br />
rv = tcp_sendmsg_locked(sk, &msg, size);<br />
<br />
This means we&#39;ve been sending oversized iov_iters and tcp_sendmsg calls<br />
for a while. This has a been a benign bug because sendpage_ok() always<br />
returned true. With the recent slab allocator changes being slowly<br />
introduced into next (that disallow sendpage on large kmalloc<br />
allocations), we have recently hit out-of-bounds crashes, due to slight<br />
differences in iov_iter behavior between the MSG_SPLICE_PAGES and<br />
"regular" copy paths:<br />
<br />
(MSG_SPLICE_PAGES)<br />
skb_splice_from_iter<br />
iov_iter_extract_pages<br />
iov_iter_extract_bvec_pages<br />
uses i->nr_segs to correctly stop in its tracks before OoB&#39;ing everywhere<br />
skb_splice_from_iter gets a "short" read<br />
<br />
(!MSG_SPLICE_PAGES)<br />
skb_copy_to_page_nocache copy=iov_iter_count<br />
[...]<br />
copy_from_iter<br />
/* this doesn&#39;t help */<br />
if (unlikely(iter->count count;<br />
iterate_bvec<br />
... and we run off the bvecs<br />
<br />
Fix this by properly setting the iov_iter&#39;s byte count, plus sending the<br />
correct byte count to tcp_sendmsg_locked.
Impact
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/42ebc16d9d2563f1a1ce0f05b643ee68d54fabf8
- https://git.kernel.org/stable/c/5661fdd218c2799001b88c17acd19f4395e4488e
- https://git.kernel.org/stable/c/673cf582fd788af12cdacfb62a6a593083542481
- https://git.kernel.org/stable/c/c18646248fed07683d4cee8a8af933fc4fe83c0d
- https://git.kernel.org/stable/c/edf82bc8150570167a33a7d54627d66614cbf841



