summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2016-01-26 23:42:38 +0100
committerLennart Poettering <lennart@poettering.net>2016-01-26 23:42:38 +0100
commit47889a8367aa791efc9e83b619ec1fec53e218b0 (patch)
treee4a1053b98e80e92817106c008732b6e6befa1ab
parentaee7c185ecf69cc30ef24224d2415b283104ddd0 (diff)
parentf3149d57b6e4c9e9abd3525c5266e0e258e8572d (diff)
Merge pull request #2446 from keszybz/ask-password
Ask password unicode fix
-rw-r--r--Makefile.am9
-rw-r--r--src/shared/ask-password-api.c14
-rw-r--r--src/test/test-ask-password-api.c40
3 files changed, 58 insertions, 5 deletions
diff --git a/Makefile.am b/Makefile.am
index f933b5228e..73d2375bf9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1418,7 +1418,8 @@ manual_tests += \
test-ipcrm \
test-btrfs \
test-acd \
- test-ipv4ll-manual
+ test-ipv4ll-manual \
+ test-ask-password-api
if HAVE_LIBIPTC
manual_tests += \
@@ -1874,6 +1875,12 @@ test_rlimit_util_SOURCES = \
test_rlimit_util_LDADD = \
libshared.la
+test_ask_password_api_SOURCES = \
+ src/test/test-ask-password-api.c
+
+test_ask_password_api_LDADD = \
+ libshared.la
+
BUILT_SOURCES += \
src/test/test-hashmap-ordered.c
diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c
index 8de1445a96..716899f659 100644
--- a/src/shared/ask-password-api.c
+++ b/src/shared/ask-password-api.c
@@ -59,6 +59,7 @@
#include "terminal-util.h"
#include "time-util.h"
#include "umask-util.h"
+#include "utf8.h"
#include "util.h"
#define KEYRING_TIMEOUT_USEC ((5 * USEC_PER_MINUTE) / 2)
@@ -213,8 +214,8 @@ int ask_password_tty(
char **ret) {
struct termios old_termios, new_termios;
- char passphrase[LINE_MAX], *x;
- size_t p = 0;
+ char passphrase[LINE_MAX + 1] = {}, *x;
+ size_t p = 0, codepoint = 0;
int r;
_cleanup_close_ int ttyfd = -1, notify = -1;
struct pollfd pollfd[2];
@@ -378,8 +379,13 @@ int ask_password_tty(
passphrase[p++] = c;
- if (!(flags & ASK_PASSWORD_SILENT) && ttyfd >= 0)
- loop_write(ttyfd, (flags & ASK_PASSWORD_ECHO) ? &c : "*", 1, false);
+ if (!(flags & ASK_PASSWORD_SILENT) && ttyfd >= 0) {
+ n = utf8_encoded_valid_unichar(passphrase + codepoint);
+ if (n >= 0) {
+ codepoint = p;
+ loop_write(ttyfd, (flags & ASK_PASSWORD_ECHO) ? &c : "*", 1, false);
+ }
+ }
dirty = true;
}
diff --git a/src/test/test-ask-password-api.c b/src/test/test-ask-password-api.c
new file mode 100644
index 0000000000..d81f32b632
--- /dev/null
+++ b/src/test/test-ask-password-api.c
@@ -0,0 +1,40 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/***
+ This file is part of systemd.
+
+ Copyright 2016 Zbigniew Jędrzejewski-Szmek
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "alloc-util.h"
+#include "ask-password-api.h"
+#include "log.h"
+
+static void ask_password(void) {
+ int r;
+ _cleanup_free_ char *ret;
+
+ r = ask_password_tty("hello?", "da key", 0, 0, NULL, &ret);
+ assert(r >= 0);
+
+ log_info("Got %s", ret);
+}
+
+int main(int argc, char **argv) {
+ log_parse_environment();
+
+ ask_password();
+}