From 592815d8132d9540a8646f9f351bc8a1153f51b2 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Thu, 26 Mar 2009 19:44:58 -0400 Subject: [PATCH] Don't close the TCP FD when an async command completes. --- src/libpwmd.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/libpwmd.c b/src/libpwmd.c index 88ebd472..0a84c1a2 100644 --- a/src/libpwmd.c +++ b/src/libpwmd.c @@ -1048,7 +1048,7 @@ gpg_error_t pwmd_pending_line(pwm_t *pwm) return assuan_pending_line(pwm->ctx) ? 0 : GPG_ERR_NO_DATA; } -static pwmd_async_t reset_async(pwm_t *pwm) +static pwmd_async_t reset_async(pwm_t *pwm, int done) { pwm->state = ASYNC_INIT; pwm->cmd = ASYNC_CMD_NONE; @@ -1062,7 +1062,7 @@ static pwmd_async_t reset_async(pwm_t *pwm) } #endif #ifdef WITH_TCP - if (pwm->tcp_conn && pwm->tcp_conn->fd != -1) { + if (done && pwm->tcp_conn && pwm->tcp_conn->fd != -1) { close(pwm->tcp_conn->fd); pwm->tcp_conn->fd = -1; } @@ -1096,7 +1096,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) /* Fixes pwmd_open/save_async2() when there is a cached or new file. */ if (pwm->state == ASYNC_DONE) { - reset_async(pwm); + reset_async(pwm, 0); return ASYNC_DONE; } @@ -1111,7 +1111,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) if (pwm->tcp_conn->rc) { *rc = pwm->tcp_conn->rc; - reset_async(pwm); + reset_async(pwm, 1); return ASYNC_DONE; } @@ -1151,7 +1151,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) return pwm->state; else if (n == -1) { *rc = gpg_error_from_syserror(); - reset_async(pwm); + reset_async(pwm, 1); return ASYNC_DONE; } @@ -1159,13 +1159,13 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) if (ret || n) { *rc = ret ? gpg_error_from_syserror() : gpg_error_from_errno(n); - reset_async(pwm); + reset_async(pwm, 1); return ASYNC_DONE; } } else if (pwm->tcp_conn->rc) { *rc = pwm->tcp_conn->rc; - reset_async(pwm); + reset_async(pwm, 1); return ASYNC_DONE; } @@ -1183,7 +1183,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) } } - return reset_async(pwm); + return reset_async(pwm, *rc ? 1 : 0); } #endif @@ -1191,7 +1191,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) if (pwm->cmd == ASYNC_CMD_OPEN2 || pwm->cmd == ASYNC_CMD_SAVE2) { if (pwm->nb_fd == -1) { *rc = GPG_ERR_INV_STATE; - return reset_async(pwm); + return reset_async(pwm, 1); } FD_ZERO(&fds); @@ -1203,7 +1203,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) #endif if (n == -1) { *rc = gpg_error_from_syserror(); - return reset_async(pwm); + return reset_async(pwm, pwm->cmd == ASYNC_CMD_OPEN2 ? 1 : 0); } if (n > 0) { @@ -1211,7 +1211,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) size_t len = read(pwm->nb_fd, &nb, sizeof(nb)); *rc = nb.error; - return reset_async(pwm); + return reset_async(pwm, pwm->cmd == ASYNC_CMD_OPEN2 ? 1 : 0); } return pwm->state; @@ -1220,7 +1220,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) if (pwm->fd < 0) { *rc = GPG_ERR_INV_STATE; - return reset_async(pwm); + return reset_async(pwm, 1); } /* This is for the non-blocking OPEN and SAVE commands. */ @@ -1234,7 +1234,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) if (n == -1) { *rc = gpg_error_from_syserror(); - return reset_async(pwm); + return reset_async(pwm, 0); } if (n > 0) { @@ -1242,7 +1242,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) *rc = parse_assuan_line(pwm); if (*rc) - return reset_async(pwm); + return reset_async(pwm, 0); } } @@ -1250,7 +1250,7 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) *rc = parse_assuan_line(pwm); if (*rc) - return reset_async(pwm); + return reset_async(pwm, 0); /* For pinentry retries. */ if (pwm->is_open_cmd && gpg_err_code(*rc) == EPWMD_BADKEY && @@ -1260,10 +1260,10 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) } if (*rc) - return reset_async(pwm); + return reset_async(pwm, 1); if (pwm->state == ASYNC_DONE) { - reset_async(pwm); + reset_async(pwm, 0); return ASYNC_DONE; } @@ -1913,7 +1913,7 @@ gpg_error_t pwmd_open_async2(pwm_t *pwm, const char *filename) rc = do_pwmd_open(pwm, filename, 1); if (rc) - reset_async(pwm); + reset_async(pwm, 1); return rc; #endif @@ -2090,7 +2090,7 @@ gpg_error_t pwmd_save_async2(pwm_t *pwm) rc = do_pwmd_save(pwm, 1); if (rc) - reset_async(pwm); + reset_async(pwm, 0); return rc; #endif -- 2.11.4.GIT