From 35ba0e8ad570c1a8a0a5c4ee25239d0bd74c3c7e Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Sun, 29 Mar 2009 09:38:24 -0400 Subject: [PATCH] Fixed pwmd_save_async2() when used with an SSH channel. Finishes commit 4270abf. --- src/libpwmd.c | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/libpwmd.c b/src/libpwmd.c index ea1b5be4..e30a28f5 100644 --- a/src/libpwmd.c +++ b/src/libpwmd.c @@ -1078,6 +1078,7 @@ static pwmd_async_t reset_async(pwm_t *pwm, int done) }; static gpg_error_t do_open_command(pwm_t *pwm, const char *filename, char *password); +static gpg_error_t do_save_command(pwm_t *pwm, char *password); pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) { fd_set fds; @@ -1215,7 +1216,11 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) if (n > 0) { pwmd_nb_status_t nb; +#ifdef WITH_LIBPTH + size_t len = pth_read(pwm->nb_fd, &nb, sizeof(nb)); +#else size_t len = read(pwm->nb_fd, &nb, sizeof(nb)); +#endif if (len != sizeof(nb)) { *rc = gpg_error_from_syserror(); @@ -1224,9 +1229,20 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) *rc = nb.error; - if (*rc) + if (*rc == EPWMD_BADKEY && pwm->cmd == ASYNC_CMD_SAVE2) { + reset_async(pwm, 0); + *rc = pwmd_save_async2(pwm); + return ASYNC_PROCESS; + } + else if (*rc) return reset_async(pwm, pwm->cmd == ASYNC_CMD_OPEN2 ? 1 : 0); + if (pwm->cmd == ASYNC_CMD_SAVE2) { + *rc = do_save_command(pwm, nb.password); + memset(&nb, 0, sizeof(pwmd_nb_status_t)); + return reset_async(pwm, 0); + } + if (pwm->cmd == ASYNC_CMD_OPEN2) { *rc = do_open_command(pwm, pwm->filename, nb.password); memset(&nb, 0, sizeof(pwmd_nb_status_t)); @@ -1246,8 +1262,6 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) return reset_async(pwm, *rc ? 1 : 0); } - - return reset_async(pwm, 0); } return pwm->state; @@ -2073,34 +2087,17 @@ static gpg_error_t do_pwmd_save(pwm_t *pwm, int nb) case 0: close(p[0]); pw.fd = p[0]; - - do { - password = NULL; - rc = do_save_getpin(pwm, &password); - } while (rc == EPWMD_BADKEY); - - if (rc) { - if (pwm->pctx) - pinentry_disconnect(pwm); - - pw.error = rc; -#ifdef WITH_LIBPTH - pth_write(p[1], &pw, sizeof(pw)); -#else - write(p[1], &pw, sizeof(pw)); -#endif - close(p[1]); - _exit(1); - } - - rc = do_save_command(pwm, password); + password = NULL; + pw.error = do_save_getpin(pwm, &password); pinentry_disconnect(pwm); - pw.error = rc; + snprintf(pw.password, sizeof(pw.password), "%s", + password); #ifdef WITH_LIBPTH pth_write(p[1], &pw, sizeof(pw)); #else write(p[1], &pw, sizeof(pw)); #endif + memset(&pw, 0, sizeof(pw)); close(p[1]); _exit(0); break; -- 2.11.4.GIT