From 22a14b88f1fbf5bb6c3066afc30129f38ad060f8 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Sat, 4 Apr 2009 09:42:16 -0400 Subject: [PATCH] Make sure a valid handle and assuan context is available before trying to process a function. --- src/libpwmd.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/src/libpwmd.c b/src/libpwmd.c index 661873ca..a5ecad03 100644 --- a/src/libpwmd.c +++ b/src/libpwmd.c @@ -525,6 +525,9 @@ static gpg_error_t _do_pwmd_tcp_connect_async(pwm_t *pwm, const char *host, pwmd_tcp_conn_t *conn; gpg_error_t rc; + if (!pwm) + return GPG_ERR_INV_ARG; + rc = init_tcp_conn(&conn, host, port, identity, user, known_hosts, which == ASYNC_CMD_HOSTKEY ? 1 : 0); @@ -724,6 +727,9 @@ static gpg_error_t _do_pwmd_tcp_connect(pwm_t *pwm, const char *host, int port, pwmd_tcp_conn_t *conn; gpg_error_t rc; + if (!pwm) + return GPG_ERR_INV_ARG; + rc = init_tcp_conn(&conn, host, port, identity, user, known_hosts, get); if (rc) @@ -799,9 +805,6 @@ gpg_error_t pwmd_get_hostkey(pwm_t *pwm, const char *host, int port, char *hostkey; gpg_error_t rc; - if (!pwm) - return GPG_ERR_INV_ARG; - rc = _do_pwmd_tcp_connect(pwm, host, port, NULL, NULL, NULL, 1); if (rc) @@ -828,9 +831,14 @@ gpg_error_t pwmd_connect(pwm_t *pwm, const char *path) char *socketpath = NULL; assuan_context_t ctx; struct passwd pw; - char *pwbuf = _getpwuid(&pw); + char *pwbuf; gpg_error_t rc; + if (!pwm) + return GPG_ERR_INV_ARG; + + pwbuf = _getpwuid(&pw); + if (!pwbuf) return gpg_error_from_errno(errno); @@ -1001,6 +1009,9 @@ gpg_error_t pwmd_open_async(pwm_t *pwm, const char *filename) if (!pwm || !filename) return GPG_ERR_INV_ARG; + if (!pwm->ctx) + return GPG_ERR_INV_STATE; + if (pwm->cmd != ASYNC_CMD_OPEN) { gpg_error_t rc; @@ -1029,6 +1040,9 @@ gpg_error_t pwmd_save_async(pwm_t *pwm) if (!pwm) return GPG_ERR_INV_ARG; + if (!pwm->ctx) + return GPG_ERR_INV_STATE; + rc = send_pinentry_options(pwm); if (rc) @@ -1115,6 +1129,17 @@ pwmd_async_t pwmd_process(pwm_t *pwm, gpg_error_t *rc, char **result) *rc = GPG_ERR_INV_ARG; return ASYNC_DONE; } + else if (!pwm->ctx) { + switch (pwm->cmd) { + default: + *rc = GPG_ERR_INV_STATE; + return ASYNC_DONE; + case ASYNC_CMD_DNS: + case ASYNC_CMD_CONNECT: + case ASYNC_CMD_HOSTKEY: + break; + } + } /* When not in a command, this will let libassuan process status messages * by calling PWMD_OPTION_STATUS_FUNC. The client can poll the file @@ -1384,6 +1409,9 @@ gpg_error_t pwmd_inquire(pwm_t *pwm, const char *cmd, pwmd_inquire_cb_t fn, if (!pwm || !cmd || !fn) return GPG_ERR_INV_ARG; + if (!pwm->ctx) + return GPG_ERR_INV_STATE; + pwm->inquire_func = fn; pwm->inquire_data = data; return assuan_command(pwm, pwm->ctx, NULL, cmd); @@ -1691,6 +1719,9 @@ gpg_error_t pwmd_command_ap(pwm_t *pwm, char **result, const char *cmd, if (!pwm || !cmd) return GPG_ERR_INV_ARG; + if (!pwm->ctx) + return GPG_ERR_INV_STATE; + /* * C99 allows the dst pointer to be null which will calculate the length * of the would-be result and return it. @@ -1722,6 +1753,9 @@ gpg_error_t pwmd_command(pwm_t *pwm, char **result, const char *cmd, ...) if (!pwm || !cmd) return GPG_ERR_INV_ARG; + if (!pwm->ctx) + return GPG_ERR_INV_STATE; + if (result) *result = NULL; @@ -1887,6 +1921,9 @@ static gpg_error_t do_pwmd_open(pwm_t *pwm, const char *filename, int nb, if (!pwm || !filename || !*filename) return GPG_ERR_INV_ARG; + if (!pwm->ctx) + return GPG_ERR_INV_STATE; + pin_try = pwm->pinentry_tries - 1; /* @@ -2103,6 +2140,12 @@ gpg_error_t pwmd_open_async2(pwm_t *pwm, const char *filename) #else gpg_error_t rc; + if (!pwm || !filename) + return GPG_ERR_INV_ARG; + + if (!pwm->ctx) + return GPG_ERR_INV_STATE; + if (pwm->cmd != ASYNC_CMD_OPEN2) pwm->pin_try = 0; @@ -2185,6 +2228,9 @@ static gpg_error_t do_pwmd_save(pwm_t *pwm, int nb, int local_pinentry) if (!pwm) return GPG_ERR_INV_ARG; + if (!pwm->ctx) + return GPG_ERR_INV_STATE; + rc = pwmd_command(pwm, &result, "ISCACHED %s", pwm->filename); if (rc && rc != GPG_ERR_NOT_FOUND) @@ -2287,6 +2333,13 @@ gpg_error_t pwmd_save_async2(pwm_t *pwm) return GPG_ERR_NOT_IMPLEMENTED; #else gpg_error_t rc; + + if (!pwm) + return GPG_ERR_INV_ARG; + + if (!pwm->ctx) + return GPG_ERR_INV_STATE; + pwm->cmd = ASYNC_CMD_SAVE2; pwm->state = ASYNC_PROCESS; rc = do_pwmd_save(pwm, 1, 1); @@ -2448,7 +2501,7 @@ gpg_error_t pwmd_setopt(pwm_t *pwm, pwmd_option_t opt, ...) gpg_error_t pwmd_get_fd(pwm_t *pwm, int *fd) { - if (!pwm) + if (!pwm || !fd) return GPG_ERR_INV_ARG; if (pwm->fd == -1) @@ -2463,7 +2516,7 @@ gpg_error_t pwmd_get_async2_fd(pwm_t *pwm, int *fd) #ifndef WITH_PINENTRY return GPG_ERR_NOT_IMPLEMENTED; #else - if (!pwm) + if (!pwm || !fd) return GPG_ERR_INV_ARG; if (pwm->nb_fd == -1) -- 2.11.4.GIT