]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
coredump: handle ENOBUFS and EMSGSIZE the same way
authorMichal Sekletar <msekleta@redhat.com>
Fri, 24 Oct 2025 10:55:20 +0000 (12:55 +0200)
committerLuca Boccassi <luca.boccassi@gmail.com>
Thu, 6 Nov 2025 21:26:42 +0000 (21:26 +0000)
Depending on the runtime configuration, e.g. sysctls
net.core.wmem_default= and net.core.rmem_default and on the actual
message size, sendmsg() can fail also with ENOBUFS. E.g. alloc_skb()
failure caused by net.core.[rw]mem_default=64MiB and huge fdinfo list
from process that has 90k opened FDs.

We should handle this case in the same way as EMSGSIZE and drop part of
the message.

(cherry picked from commit 28e62e684b631f928f1d857b04f45f0d34441675)

src/coredump/coredump.c

index 7fd96ac542eb52b7a92f4eaf6b44ebfab368cdf5..84adea609d2f1e8830a3063c8ea7745388195f50 100644 (file)
@@ -1294,7 +1294,7 @@ static int send_iovec(const struct iovec_wrapper *iovw, int input_fd, PidRef *pi
                         if (sendmsg(fd, &mh, MSG_NOSIGNAL) >= 0)
                                 break;
 
-                        if (errno == EMSGSIZE && mh.msg_iov[0].iov_len > 0) {
+                        if (IN_SET(errno, EMSGSIZE, ENOBUFS) && mh.msg_iov[0].iov_len > 0) {
                                 /* This field didn't fit? That's a pity. Given that this is
                                  * just metadata, let's truncate the field at half, and try
                                  * again. We append three dots, in order to show that this is