]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-netlink: allow sd_netlink_message_read() to be used for union types
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 23 Jun 2022 10:56:34 +0000 (12:56 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 30 Jun 2022 08:35:27 +0000 (10:35 +0200)
Before, sd_netlink_message_read() expected to fill a buffer completely,
and would return -EIO if the attribute being read was shorter than the
buffer. This means that the function can be used to "peek" into attributes
(by specifying a short buffer to just read part of the attribute), but
cannot be used to read something into a union without knowing beforehand
which specific field in the union is being filled. That latter operation
seems more useful (messages are short, so we don't really need to do partial
reads), so let's allow reads that don't fill the output buffer completely.

src/libsystemd/sd-netlink/netlink-message.c

index dafc16f258c43af8e6ad3c49af4ce9ee3c289f40..34b4c23bd546732877637222c3840180508a9a83 100644 (file)
@@ -741,11 +741,11 @@ _public_ int sd_netlink_message_read(sd_netlink_message *m, unsigned short type,
         if (r < 0)
                 return r;
 
-        if ((size_t) r < size)
-                return -EIO;
+        if ((size_t) r > size)
+                return -ENOBUFS;
 
         if (data)
-                memcpy(data, attr_data, size);
+                memcpy(data, attr_data, r);
 
         return r;
 }