diff options
author | Tom Gundersen <teg@jklm.no> | 2015-04-03 21:04:48 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2015-04-03 22:17:52 +0200 |
commit | 4df4fd1127df4b70f78d952a37a51a8c69e3243f (patch) | |
tree | d1adb5ab9590008d0ff17bffca8a757e6bb2ccdb | |
parent | aa20f49a1c5816e6e7e97f2e2ba209be47f3c0a3 (diff) |
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
-rw-r--r-- | src/libsystemd/sd-device/device-private.c | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c index 2add6bb0de..544b837b12 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); |