From: Yu Watanabe Date: Sat, 26 Jun 2021 01:40:07 +0000 (+0900) Subject: sd-device: allow to read sysattr which contains embedded NUL X-Git-Tag: v249-rc3~30^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=70160c6eeee07ac6aa817826d13e8eff9563ce1e;p=thirdparty%2Fsystemd.git sd-device: allow to read sysattr which contains embedded NUL This effectively reverts the commit 2a394d0bf2f0afd8b9ed5faeb33f23459e3c6504. But drop trailing '\r' of the read value, as sd_device_set_sysattr_value() drops it. Fixes #20025. --- diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index 0d04e16818a..388128bf330 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -2022,13 +2022,17 @@ _public_ int sd_device_get_sysattr_value(sd_device *device, const char *sysattr, /* skip non-readable files */ return -EPERM; else { - /* read attribute value */ - r = read_full_virtual_file(path, &value, NULL); + size_t size; + + /* Read attribute value, Some attributes contain embedded '\0'. So, it is necessary to + * also get the size of the result. See issue #20025. */ + r = read_full_virtual_file(path, &value, &size); if (r < 0) return r; /* drop trailing newlines */ - delete_trailing_chars(value, "\n"); + while (size > 0 && strchr(NEWLINE, value[--size])) + value[size] = '\0'; } /* Unfortunately, we need to return 'const char*' instead of 'char*'. Hence, failure in caching