From c9f0e1ce5fbec130fca3189ef3c74712a8253ffd Mon Sep 17 00:00:00 2001 From: "Amitanand.Chikorde" Date: Wed, 26 Aug 2020 15:31:49 +0530 Subject: [PATCH 1/3] sd-bus: drop unnecessary free() As `e->message` here is always NULL. --- src/libsystemd/sd-bus/bus-error.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c index 63f5097161..0530ebe179 100644 --- a/src/libsystemd/sd-bus/bus-error.c +++ b/src/libsystemd/sd-bus/bus-error.c @@ -536,7 +536,6 @@ _public_ int sd_bus_error_set_errnofv(sd_bus_error *e, int error, const char *fo free(m); } else { - free((char*) e->message); e->message = m; return -error; } From caf4ba83d528ea06a3b668e716a60ece46a6ec84 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 4 Sep 2020 12:02:46 +0900 Subject: [PATCH 2/3] sd-bus: use _cleanup_free_ macro in sd_bus_error_set_errnofv() No functional change. --- src/libsystemd/sd-bus/bus-error.c | 32 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c index 0530ebe179..e7a93d3a5a 100644 --- a/src/libsystemd/sd-bus/bus-error.c +++ b/src/libsystemd/sd-bus/bus-error.c @@ -484,7 +484,6 @@ _public_ int sd_bus_error_set_errno(sd_bus_error *e, int error) { _public_ int sd_bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_list ap) { PROTECT_ERRNO; - int r; if (error < 0) error = -error; @@ -515,33 +514,30 @@ _public_ int sd_bus_error_set_errnofv(sd_bus_error *e, int error, const char *fo } if (format) { - char *m; + _cleanup_free_ char *m = NULL; /* Then, let's try to fill in the supplied message */ errno = error; /* Make sure that %m resolves to the specified error */ - r = vasprintf(&m, format, ap); - if (r >= 0) { + if (vasprintf(&m, format, ap) < 0) + goto fail; - if (e->_need_free <= 0) { - char *t; + if (e->_need_free <= 0) { + char *t; - t = strdup(e->name); - if (t) { - e->_need_free = 1; - e->name = t; - e->message = m; - return -error; - } + t = strdup(e->name); + if (!t) + goto fail; - free(m); - } else { - e->message = m; - return -error; - } + e->_need_free = 1; + e->name = t; } + + e->message = TAKE_PTR(m); + return -error; } +fail: /* If that didn't work, use strerror() for the message */ bus_error_strerror(e, error); return -error; From aea4660af8cd7cf78fe096df3ef40b80d12b8766 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 4 Sep 2020 12:17:22 +0900 Subject: [PATCH 3/3] test: add tests for sd_bus_error_set_errnof() --- src/libsystemd/sd-bus/test-bus-error.c | 75 ++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/libsystemd/sd-bus/test-bus-error.c b/src/libsystemd/sd-bus/test-bus-error.c index 52d30c85ad..14e3c9c40d 100644 --- a/src/libsystemd/sd-bus/test-bus-error.c +++ b/src/libsystemd/sd-bus/test-bus-error.c @@ -213,12 +213,87 @@ static void test_errno_mapping_custom(void) { assert_se(sd_bus_error_add_map(test_errors_bad2) == -EINVAL); } +static void test_sd_bus_error_set_errnof(void) { + _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; + _cleanup_free_ char *str = NULL; + + assert_se(sd_bus_error_set_errnof(NULL, 0, NULL) == 0); + assert_se(sd_bus_error_set_errnof(NULL, ENOANO, NULL) == -ENOANO); + + assert_se(sd_bus_error_set_errnof(&error, 0, NULL) == 0); + assert_se(!bus_error_is_dirty(&error)); + + assert_se(sd_bus_error_set_errnof(&error, EACCES, NULL) == -EACCES); + assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_ACCESS_DENIED)); + errno = EACCES; + assert_se(asprintf(&str, "%m") >= 0); + assert_se(streq(error.message, str)); + assert_se(error._need_free == 0); + + str = mfree(str); + sd_bus_error_free(&error); + + assert_se(sd_bus_error_set_errnof(&error, ENOANO, NULL) == -ENOANO); + assert_se(sd_bus_error_has_name(&error, "System.Error.ENOANO")); + errno = ENOANO; + assert_se(asprintf(&str, "%m") >= 0); + assert_se(streq(error.message, str)); + assert_se(error._need_free == 1); + + str = mfree(str); + sd_bus_error_free(&error); + + assert_se(sd_bus_error_set_errnof(&error, 100000, NULL) == -100000); + assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_FAILED)); + errno = 100000; + assert_se(asprintf(&str, "%m") >= 0); + assert_se(streq(error.message, str)); + assert_se(error._need_free == 1); + + str = mfree(str); + sd_bus_error_free(&error); + + assert_se(sd_bus_error_set_errnof(NULL, 0, "hoge %s: %m", "foo") == 0); + assert_se(sd_bus_error_set_errnof(NULL, ENOANO, "hoge %s: %m", "foo") == -ENOANO); + + assert_se(sd_bus_error_set_errnof(&error, 0, "hoge %s: %m", "foo") == 0); + assert_se(!bus_error_is_dirty(&error)); + + assert_se(sd_bus_error_set_errnof(&error, EACCES, "hoge %s: %m", "foo") == -EACCES); + assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_ACCESS_DENIED)); + errno = EACCES; + assert_se(asprintf(&str, "hoge %s: %m", "foo") >= 0); + assert_se(streq(error.message, str)); + assert_se(error._need_free == 1); + + str = mfree(str); + sd_bus_error_free(&error); + + assert_se(sd_bus_error_set_errnof(&error, ENOANO, "hoge %s: %m", "foo") == -ENOANO); + assert_se(sd_bus_error_has_name(&error, "System.Error.ENOANO")); + errno = ENOANO; + assert_se(asprintf(&str, "hoge %s: %m", "foo") >= 0); + assert_se(streq(error.message, str)); + assert_se(error._need_free == 1); + + str = mfree(str); + sd_bus_error_free(&error); + + assert_se(sd_bus_error_set_errnof(&error, 100000, "hoge %s: %m", "foo") == -100000); + assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_FAILED)); + errno = 100000; + assert_se(asprintf(&str, "hoge %s: %m", "foo") >= 0); + assert_se(streq(error.message, str)); + assert_se(error._need_free == 1); +} + int main(int argc, char *argv[]) { dump_mapping_table(); test_error(); test_errno_mapping_standard(); test_errno_mapping_custom(); + test_sd_bus_error_set_errnof(); return 0; }