summaryrefslogtreecommitdiff
path: root/src/shared
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 /src/shared
parentaee7c185ecf69cc30ef24224d2415b283104ddd0 (diff)
parentf3149d57b6e4c9e9abd3525c5266e0e258e8572d (diff)
Merge pull request #2446 from keszybz/ask-password
Ask password unicode fix
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/ask-password-api.c14
1 files changed, 10 insertions, 4 deletions
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;
}