]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
iovec-util: rename iovec_increment() -> iovec_inc_many() 41700/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 18 Apr 2026 23:10:14 +0000 (08:10 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 19 Apr 2026 07:17:47 +0000 (16:17 +0900)
Also,
- use iovec_inc() in the loop,
- do not return true when input is NULL or all iovec are empty.

src/basic/iovec-util.c
src/basic/iovec-util.h
src/basic/log.c
src/fuzz/fuzz-varlink.c
src/libsystemd/sd-daemon/sd-daemon.c
src/resolve/resolved-dns-stream.c
src/test/test-iovec-util.c

index cd2c1a736e8286300a8a9ff24f36b01a184d4cd8..dab734b9010f176c72c6157b522a24c99357e6c7 100644 (file)
@@ -30,29 +30,30 @@ size_t iovec_total_size(const struct iovec *iovec, size_t n) {
         return sum;
 }
 
-bool iovec_increment(struct iovec *iovec, size_t n, size_t k) {
+bool iovec_inc_many(struct iovec *iovec, size_t n, size_t k) {
         assert(iovec || n == 0);
 
         /* Returns true if there is nothing else to send (bytes written cover all of the iovec),
          * false if there's still work to do. */
 
+        bool have = false;
         FOREACH_ARRAY(j, iovec, n) {
-                size_t sub;
-
                 if (j->iov_len == 0)
                         continue;
                 if (k == 0)
                         return false;
 
-                sub = MIN(j->iov_len, k);
-                j->iov_len -= sub;
-                j->iov_base = (uint8_t*) j->iov_base + sub;
+                size_t sub = MIN(j->iov_len, k);
+                iovec_inc(j, sub);
                 k -= sub;
+
+                have = have || iovec_is_set(j);
         }
 
         assert(k == 0); /* Anything else would mean that we wrote more bytes than available,
                          * or the kernel reported writing more bytes than sent. */
-        return true;
+
+        return !have;
 }
 
 struct iovec* iovec_make_string(struct iovec *iovec, const char *s) {
index 21aad9edfc196b9a49d65aff59df2eab6d963121..c8261861a0ff787bd25d23ade417c17eee261ebe 100644 (file)
@@ -11,7 +11,7 @@ extern const struct iovec iovec_empty;    /* Points to an empty, but valid (i.e.
 
 size_t iovec_total_size(const struct iovec *iovec, size_t n) _nonnull_if_nonzero_(1, 2);
 
-bool iovec_increment(struct iovec *iovec, size_t n, size_t k) _nonnull_if_nonzero_(1, 2);
+bool iovec_inc_many(struct iovec *iovec, size_t n, size_t k) _nonnull_if_nonzero_(1, 2);
 
 struct iovec* iovec_make_string(struct iovec *iovec, const char *s);
 
index 473d0bd70f5a038ce6569d2e56fd2d5d36fee564..d8b441bfadf21b03bec7ee3550c2998bd0128fb8 100644 (file)
@@ -557,7 +557,7 @@ static int write_to_syslog(
                 if (!syslog_is_stream)
                         break;
 
-                if (iovec_increment(iovec, ELEMENTSOF(iovec), n))
+                if (iovec_inc_many(iovec, ELEMENTSOF(iovec), n))
                         break;
         }
 
index fb1584a2ea6bfcf131c758f0e7f2fdaa78de8326..7bd7e5ab920e916e1f8852680d9376f673a93e17 100644 (file)
@@ -41,7 +41,7 @@ static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userd
                         else
                                 assert_se(errno == EAGAIN);
                 } else
-                        iovec_increment(iov, 1, n);
+                        iovec_inc(iov, n);
         }
 
         if (revents & EPOLLIN) {
index 2937ac569c32160635812a34bffd88e0b5b02d5c..da5242c3b799d93e29616d1caa56887dd5dae8eb 100644 (file)
@@ -621,7 +621,7 @@ static int pid_notify_with_fds_internal(
                         msghdr.msg_control = NULL;
                         msghdr.msg_controllen = 0;
                 }
-        } while (!iovec_increment(msghdr.msg_iov, msghdr.msg_iovlen, n));
+        } while (!iovec_inc_many(msghdr.msg_iov, msghdr.msg_iovlen, n));
 
         if (address.sockaddr.sa.sa_family == AF_VSOCK && IN_SET(type, SOCK_STREAM, SOCK_SEQPACKET)) {
                 /* For AF_VSOCK, we need to close the socket to signal the end of the message. */
index e10605538a124bca378a7a373562892c084ab206..b1d1b0069c0284e3e1eddd35139e60668d924eba 100644 (file)
@@ -347,7 +347,7 @@ static int on_stream_io(sd_event_source *es, int fd, uint32_t revents, void *use
                         IOVEC_MAKE(DNS_PACKET_DATA(s->write_packet), s->write_packet->size),
                 };
 
-                iovec_increment(iov, ELEMENTSOF(iov), s->n_written);
+                iovec_inc_many(iov, ELEMENTSOF(iov), s->n_written);
 
                 ssize_t ss = dns_stream_writev(s, iov, ELEMENTSOF(iov), 0);
                 if (ss < 0) {
index 68255071e861d983846482a60c8d47f43113f221..bd73be1ea76e67fa66a67d3f3559855ea7cdc56e 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 
 #include "iovec-util.h"
+#include "iovec-wrapper.h"
 #include "memory-util.h"
 #include "tests.h"
 
@@ -38,6 +39,59 @@ TEST(iovec_inc) {
         ASSERT_FALSE(iovec_is_set(iovec_inc(&empty, 1)));
 }
 
+TEST(iovec_inc_many) {
+        ASSERT_TRUE(iovec_inc_many(NULL, 0, 0));
+        ASSERT_TRUE(iovec_inc_many(&(struct iovec) {}, 0, 0));
+        ASSERT_TRUE(iovec_inc_many(&(struct iovec) {}, 1, 0));
+
+        _cleanup_(iovw_done) struct iovec_wrapper iovw = {};
+        ASSERT_OK(iovw_put_iov(&iovw, &IOVEC_MAKE_STRING("aaa")));
+        ASSERT_OK(iovw_put_iov(&iovw, &IOVEC_MAKE_STRING("bbb")));
+        ASSERT_OK(iovw_put_iov(&iovw, &IOVEC_MAKE_STRING("ccc")));
+
+        ASSERT_FALSE(iovec_inc_many(iovw.iovec, iovw.count, 0));
+        ASSERT_TRUE(iovec_equal(&iovw.iovec[0], &IOVEC_MAKE_STRING("aaa")));
+        ASSERT_TRUE(iovec_equal(&iovw.iovec[1], &IOVEC_MAKE_STRING("bbb")));
+        ASSERT_TRUE(iovec_equal(&iovw.iovec[2], &IOVEC_MAKE_STRING("ccc")));
+
+        ASSERT_FALSE(iovec_inc_many(iovw.iovec, iovw.count, 1));
+        ASSERT_TRUE(iovec_equal(&iovw.iovec[0], &IOVEC_MAKE_STRING("aa")));
+        ASSERT_TRUE(iovec_equal(&iovw.iovec[1], &IOVEC_MAKE_STRING("bbb")));
+        ASSERT_TRUE(iovec_equal(&iovw.iovec[2], &IOVEC_MAKE_STRING("ccc")));
+
+        ASSERT_FALSE(iovec_inc_many(iovw.iovec, iovw.count, 3));
+        ASSERT_FALSE(iovec_is_set(&iovw.iovec[0]));
+        ASSERT_NULL(iovw.iovec[0].iov_base);
+        ASSERT_EQ(iovw.iovec[0].iov_len, 0u);
+        ASSERT_TRUE(iovec_equal(&iovw.iovec[1], &IOVEC_MAKE_STRING("bb")));
+        ASSERT_TRUE(iovec_equal(&iovw.iovec[2], &IOVEC_MAKE_STRING("ccc")));
+
+        ASSERT_FALSE(iovec_inc_many(iovw.iovec, iovw.count, 4));
+        ASSERT_NULL(iovw.iovec[0].iov_base);
+        ASSERT_EQ(iovw.iovec[0].iov_len, 0u);
+        ASSERT_NULL(iovw.iovec[1].iov_base);
+        ASSERT_EQ(iovw.iovec[1].iov_len, 0u);
+        ASSERT_TRUE(iovec_equal(&iovw.iovec[2], &IOVEC_MAKE_STRING("c")));
+
+        ASSERT_TRUE(iovec_inc_many(iovw.iovec, iovw.count, 1));
+        ASSERT_NULL(iovw.iovec[0].iov_base);
+        ASSERT_EQ(iovw.iovec[0].iov_len, 0u);
+        ASSERT_NULL(iovw.iovec[1].iov_base);
+        ASSERT_EQ(iovw.iovec[1].iov_len, 0u);
+        ASSERT_NULL(iovw.iovec[2].iov_base);
+        ASSERT_EQ(iovw.iovec[2].iov_len, 0u);
+
+        ASSERT_TRUE(iovec_inc_many(iovw.iovec, iovw.count, 0));
+        ASSERT_NULL(iovw.iovec[0].iov_base);
+        ASSERT_EQ(iovw.iovec[0].iov_len, 0u);
+        ASSERT_NULL(iovw.iovec[1].iov_base);
+        ASSERT_EQ(iovw.iovec[1].iov_len, 0u);
+        ASSERT_NULL(iovw.iovec[2].iov_base);
+        ASSERT_EQ(iovw.iovec[2].iov_len, 0u);
+
+        ASSERT_SIGNAL(iovec_inc_many(iovw.iovec, iovw.count, 1), SIGABRT);
+}
+
 TEST(iovec_memcmp) {
         struct iovec iov1 = CONST_IOVEC_MAKE_STRING("abcdef"), iov2 = IOVEC_MAKE_STRING("bcdefg"), empty = {};