From 286e1777b13521785939ff83d2a4f72ac90ff2a2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 25 Dec 2018 12:56:48 +0900 Subject: [PATCH] libudev-util: make util_replace_whitespace() read only len characters This effectively reverts df8ba4fa0e8be1ff7899d08a4b6be0196c8405a0. Fixes #11264. --- src/libudev/libudev-util.c | 13 +++++++------ src/test/test-libudev.c | 27 +++++++++++++++++---------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/libudev/libudev-util.c b/src/libudev/libudev-util.c index f67ab40354121..7e21719fbf2c1 100644 --- a/src/libudev/libudev-util.c +++ b/src/libudev/libudev-util.c @@ -122,19 +122,20 @@ size_t util_path_encode(const char *src, char *dest, size_t size) { * * Note this may be called with 'str' == 'to', i.e. to replace whitespace * in-place in a buffer. This function can handle that situation. + * + * Note that only 'len' characters are read from 'str'. */ size_t util_replace_whitespace(const char *str, char *to, size_t len) { bool is_space = false; - const char *p = str; - size_t j; + size_t i, j; assert(str); assert(to); - p += strspn(p, WHITESPACE); + i = strspn(str, WHITESPACE); - for (j = 0; j < len && *p != '\0'; p++) { - if (isspace(*p)) { + for (j = 0; j < len && i < len && str[i] != '\0'; i++) { + if (isspace(str[i])) { is_space = true; continue; } @@ -146,7 +147,7 @@ size_t util_replace_whitespace(const char *str, char *to, size_t len) { to[j++] = '_'; is_space = false; } - to[j++] = *p; + to[j++] = str[i]; } to[j] = '\0'; diff --git a/src/test/test-libudev.c b/src/test/test-libudev.c index 10bf365035629..09fd466c55b51 100644 --- a/src/test/test-libudev.c +++ b/src/test/test-libudev.c @@ -364,16 +364,23 @@ static void test_util_replace_whitespace(void) { test_util_replace_whitespace_one_len("hoge hoge ", 1, "h"); test_util_replace_whitespace_one_len("hoge hoge ", 0, ""); - test_util_replace_whitespace_one_len(" hoge hoge ", 9, "hoge_hoge"); - test_util_replace_whitespace_one_len(" hoge hoge ", 8, "hoge_hog"); - test_util_replace_whitespace_one_len(" hoge hoge ", 7, "hoge_ho"); - test_util_replace_whitespace_one_len(" hoge hoge ", 6, "hoge_h"); - test_util_replace_whitespace_one_len(" hoge hoge ", 5, "hoge"); - test_util_replace_whitespace_one_len(" hoge hoge ", 4, "hoge"); - test_util_replace_whitespace_one_len(" hoge hoge ", 3, "hog"); - test_util_replace_whitespace_one_len(" hoge hoge ", 2, "ho"); - test_util_replace_whitespace_one_len(" hoge hoge ", 1, "h"); - test_util_replace_whitespace_one_len(" hoge hoge ", 0, ""); + test_util_replace_whitespace_one_len(" hoge hoge ", 16, "hoge_hoge"); + test_util_replace_whitespace_one_len(" hoge hoge ", 15, "hoge_hoge"); + test_util_replace_whitespace_one_len(" hoge hoge ", 14, "hoge_hog"); + test_util_replace_whitespace_one_len(" hoge hoge ", 13, "hoge_ho"); + test_util_replace_whitespace_one_len(" hoge hoge ", 12, "hoge_h"); + test_util_replace_whitespace_one_len(" hoge hoge ", 11, "hoge"); + test_util_replace_whitespace_one_len(" hoge hoge ", 10, "hoge"); + test_util_replace_whitespace_one_len(" hoge hoge ", 9, "hoge"); + test_util_replace_whitespace_one_len(" hoge hoge ", 8, "hoge"); + test_util_replace_whitespace_one_len(" hoge hoge ", 7, "hog"); + test_util_replace_whitespace_one_len(" hoge hoge ", 6, "ho"); + test_util_replace_whitespace_one_len(" hoge hoge ", 5, "h"); + test_util_replace_whitespace_one_len(" hoge hoge ", 4, ""); + test_util_replace_whitespace_one_len(" hoge hoge ", 3, ""); + test_util_replace_whitespace_one_len(" hoge hoge ", 2, ""); + test_util_replace_whitespace_one_len(" hoge hoge ", 1, ""); + test_util_replace_whitespace_one_len(" hoge hoge ", 0, ""); } static void test_util_resolve_subsys_kernel_one(const char *str, bool read_value, int retval, const char *expected) {