From c07733f7e14a3a1ff86b0fa5595c88058a78f613 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Fri, 3 Apr 2015 21:04:48 +0200 Subject: [PATCH] sd-device: fix deserialization from netlink Use the standard FOREACH_WORD* macros. The current code was broken in the devlink case so the last one received was being dropped, causing https://bugs.freedesktop.org/show_bug.cgi?id=89894 --- src/libelogind/sd-device/device-private.c | 30 +++++++++++------------ 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/libelogind/sd-device/device-private.c b/src/libelogind/sd-device/device-private.c index 81b0b6dde..f6beef849 100644 --- a/src/libelogind/sd-device/device-private.c +++ b/src/libelogind/sd-device/device-private.c @@ -419,32 +419,30 @@ static int device_ammend(sd_device *device, const char *key, const char *value) if (r < 0) return log_debug_errno(r, "sd-device: could not set devgid to '%s': %m", value); } else if (streq(key, "DEVLINKS")) { - char *devlinks, *next; + const char *word, *state; + size_t l; - devlinks = strdupa(value); + FOREACH_WORD(word, l, value, state) { + char *devlink; - while ((next = strchr(devlinks, ' '))) { - next[0] = '\0'; + devlink = strndupa(word, l); - r = device_add_devlink(device, devlinks); + r = device_add_devlink(device, devlink); if (r < 0) - return log_debug_errno(r, "sd-device: could not add devlink '%s': %m", devlinks); - - devlinks = next + 1; + return log_debug_errno(r, "sd-device: could not add devlink '%s': %m", devlink); } } else if (streq(key, "TAGS")) { - char *tags, *next; + const char *word, *state; + size_t l; - tags = strdupa(value); + FOREACH_WORD_SEPARATOR(word, l, value, ":", state) { + char *tag; - while ((next = strchr(tags, ':'))) { - next[0] = '\0'; + tag = strndupa(word, l); - r = device_add_tag(device, tags); + r = device_add_tag(device, tag); if (r < 0) - return log_debug_errno(r, "sd-device: could not add tag '%s': %m", tags); - - tags = next + 1; + return log_debug_errno(r, "sd-device: could not add tag '%s': %m", tag); } } else { r = device_add_property_internal(device, key, value); -- 2.30.2