summaryrefslogtreecommitdiff
path: root/pinentry-dmenu.c
diff options
context:
space:
mode:
authorMoritz Luedecke <ritze@skweez.net>2017-09-24 20:34:36 +0200
committerMoritz Luedecke <ritze@skweez.net>2017-09-24 20:34:36 +0200
commit07b14f1e91beb96591b210bc7b1cd75a516d646d (patch)
treea79759795031f2c1831eaead970b7dcaf5f11de8 /pinentry-dmenu.c
parent6a22ded419a9b22f6b05b4c9ef2655e83ecf9d35 (diff)
Don't delete the whole suffix when remove a symbol in the middle of the passphrase
Diffstat (limited to 'pinentry-dmenu.c')
-rw-r--r--pinentry-dmenu.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/pinentry-dmenu.c b/pinentry-dmenu.c
index 5bd0e1f..1f26ed9 100644
--- a/pinentry-dmenu.c
+++ b/pinentry-dmenu.c
@@ -125,8 +125,9 @@ nextrune(int cursor, int inc) {
static void
insert(const char *str, ssize_t n) {
int repeat;
+ size_t len = strlen(pin);
- if (strlen(pin) + n > pinentry->pin_len - 1) {
+ if (len + n > pinentry->pin_len - 1) {
repeat = (pin == pinentry->pin) ? 0 : 1;
if (!pinentry_setbufferlen(pinentry, 2 * pinentry->pin_len)) {
@@ -137,12 +138,16 @@ insert(const char *str, ssize_t n) {
pin = (repeat) ? pinentry->pin : pinentry->repeat_passphrase;
}
+ /* Move existing text out of the way, insert new text, and update cursor */
+ memmove(&pin[cursor + n], &pin[cursor],
+ pinentry->pin_len - cursor - MAX(n, 0));
+
if (n > 0) {
memcpy(&pin[cursor], str, n);
}
cursor += n;
- pin[cursor] = '\0';
+ pin[len + n] = '\0';
}
static void