From: Zbigniew Jędrzejewski-Szmek Date: Thu, 6 Feb 2020 08:32:16 +0000 (+0100) Subject: shared/ask-password-api: return "error" when dialogue is cancelled X-Git-Tag: v245-rc2~81^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=72c08a471c9ccb65209b72ea539acefe17c33245;p=thirdparty%2Fsystemd.git shared/ask-password-api: return "error" when dialogue is cancelled test-ask-password-api would crash if ^D was pressed. If think the callers generally expect a non-empty strv as reply. Let's return an error if we have nothing to return. Also modernize test-ask-password-api a bit. --- diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c index 7f6775f4a13..a6c83e181a0 100644 --- a/src/shared/ask-password-api.c +++ b/src/shared/ask-password-api.c @@ -658,11 +658,15 @@ int ask_password_tty( goto finish; skipped: - if (keyname) - (void) add_to_keyring_and_log(keyname, flags, l); - - *ret = TAKE_PTR(l); - r = 0; + if (strv_isempty(l)) + r = log_debug_errno(SYNTHETIC_ERRNO(ECANCELED), "Password query was cancelled."); + else { + if (keyname) + (void) add_to_keyring_and_log(keyname, flags, l); + + *ret = TAKE_PTR(l); + r = 0; + } finish: if (ttyfd >= 0 && reset_tty) { diff --git a/src/test/test-ask-password-api.c b/src/test/test-ask-password-api.c index fa91869cf5b..13a1064b457 100644 --- a/src/test/test-ask-password-api.c +++ b/src/test/test-ask-password-api.c @@ -1,24 +1,26 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -#include "alloc-util.h" #include "ask-password-api.h" -#include "log.h" #include "strv.h" +#include "tests.h" -static void ask_password(void) { +static void test_ask_password(void) { int r; _cleanup_strv_free_ char **ret = NULL; r = ask_password_tty(-1, "hello?", "da key", 0, 0, NULL, &ret); - assert(r >= 0); - assert(strv_length(ret) == 1); - - log_info("Got %s", *ret); + if (r == -ECANCELED) + assert_se(ret == NULL); + else { + assert_se(r >= 0); + assert_se(strv_length(ret) == 1); + log_info("Got \"%s\"", *ret); + } } int main(int argc, char **argv) { - log_parse_environment(); + test_setup_logging(LOG_DEBUG); - ask_password(); + test_ask_password(); return EXIT_SUCCESS; }