From 4df4fd1127df4b70f78d952a37a51a8c69e3243f 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/libsystemd/sd-device/device-private.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c index 2add6bb..544b837 100644 --- a/src/libsystemd/sd-device/device-private.c +++ b/src/libsystemd/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.7.4