From 62df736f6980e022ff473c7b67fa28d524003005 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Sat, 13 Nov 2010 09:32:37 -0500 Subject: [PATCH] Fix for commit ac5ef61. Use a pth_mutex_t when building with libpth support. --- src/ssh.c | 78 +++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/src/ssh.c b/src/ssh.c index 6ca6b2b2..fba9a552 100644 --- a/src/ssh.c +++ b/src/ssh.c @@ -42,7 +42,15 @@ #include "misc.h" #include "ssh.h" +#ifdef WITH_LIBPTH +static pth_mutex_t ssh_mutex = PTH_MUTEX_INIT; +#define LOCK_SSH_MUTEX pth_mutex_acquire(&ssh_mutex, FALSE, NULL); +#define UNLOCK_SSH_MUTEX pth_mutex_release(&ssh_mutex); +#else static pthread_mutex_t ssh_mutex = PTHREAD_MUTEX_INITIALIZER; +#define LOCK_SSH_MUTEX pthread_mutex_lock(&ssh_mutex); +#define UNLOCK_SSH_MUTEX pthread_mutex_unlock(&ssh_mutex); +#endif static gpg_error_t ssh_connect_finalize(pwm_t *pwm); @@ -51,7 +59,7 @@ static void ssh_deinit(pwmd_tcp_conn_t *conn) if (!conn) return; - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX if (conn->agent) { libssh2_agent_free(conn->agent); @@ -75,7 +83,7 @@ static void ssh_deinit(pwmd_tcp_conn_t *conn) conn->session = NULL; conn->channel = NULL; - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX _free_ssh_conn(conn); } @@ -91,9 +99,9 @@ static int read_hook(assuan_context_t ctx, assuan_fd_t fd, void *data, *ret = recv((int)fd, data, len, 0); #endif else { - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX *ret = libssh2_channel_read(pwm->tcp_conn->channel, data, len); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX } return *ret >= 0 ? 1 : 0; @@ -111,9 +119,9 @@ static int write_hook(assuan_context_t ctx, assuan_fd_t fd, const void *data, *ret = send((int)fd, data, len, 0); #endif else { - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX *ret = libssh2_channel_write(pwm->tcp_conn->channel, data, len); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX } return *ret >= 0 ? 1 : 0; @@ -485,20 +493,20 @@ gpg_error_t _setup_ssh_agent(pwm_t *pwm) { int n; - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX if (pwm->tcp_conn->state != SSH_AGENT) { n = libssh2_agent_connect(pwm->tcp_conn->agent); if (n) { - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX return GPG_ERR_NO_AGENT; } n = libssh2_agent_list_identities(pwm->tcp_conn->agent); if (n) { - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX return GPG_ERR_BAD_PUBKEY; } @@ -507,11 +515,11 @@ gpg_error_t _setup_ssh_agent(pwm_t *pwm) &pwm->tcp_conn->agent_identity, pwm->tcp_conn->agent_identity_prev); if (n > 0) { - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX return GPG_ERR_BAD_PUBKEY; } else if (n < 0) { - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX return GPG_ERR_AGENT; } } @@ -523,7 +531,7 @@ gpg_error_t _setup_ssh_agent(pwm_t *pwm) if (!n) break; else if (n == LIBSSH2_ERROR_EAGAIN) { - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX return GPG_ERR_EAGAIN; } @@ -533,16 +541,16 @@ gpg_error_t _setup_ssh_agent(pwm_t *pwm) pwm->tcp_conn->agent_identity_prev); if (n > 0) { - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX return GPG_ERR_BAD_PUBKEY; } else if (n < 0) { - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX return GPG_ERR_AGENT; } } - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX return _setup_ssh_channel(pwm); } @@ -555,11 +563,11 @@ gpg_error_t _setup_ssh_auth(pwm_t *pwm) if (pwm->use_agent) return _setup_ssh_agent(pwm); - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX n = libssh2_userauth_publickey_fromfile(pwm->tcp_conn->session, pwm->tcp_conn->username, pwm->tcp_conn->identity_pub, pwm->tcp_conn->identity, NULL); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX if (n == LIBSSH2_ERROR_EAGAIN) return GPG_ERR_EAGAIN; @@ -578,11 +586,11 @@ gpg_error_t _setup_ssh_authlist(pwm_t *pwm) int n; pwm->tcp_conn->state = SSH_AUTHLIST; - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX userauth = libssh2_userauth_list(pwm->tcp_conn->session, pwm->tcp_conn->username, strlen(pwm->tcp_conn->username)); n = libssh2_session_last_errno(pwm->tcp_conn->session); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX if (!userauth && n == LIBSSH2_ERROR_EAGAIN) return GPG_ERR_EAGAIN; @@ -610,10 +618,10 @@ static void add_knownhost(pwm_t *pwm, const char *host, const char *key, buf = pwmd_strdup(host); char *tbuf = pwmd_strdup_printf("%li", time(NULL)); - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX libssh2_knownhost_addc(pwm->tcp_conn->kh, buf, NULL, key, len, tbuf, strlen(tbuf), type, dst); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX pwmd_free(tbuf); pwmd_free(buf); } @@ -627,9 +635,9 @@ static gpg_error_t check_known_hosts(pwm_t *pwm) int n; struct libssh2_knownhost *kh; - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX key = libssh2_session_hostkey(pwm->tcp_conn->session, &len, &type); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX while (!libssh2_knownhost_get(pwm->tcp_conn->kh, &kh, NULL)) libssh2_knownhost_del(pwm->tcp_conn->kh, kh); @@ -754,9 +762,9 @@ static gpg_error_t verify_hostkey(pwm_t *pwm) char *buf; if (!pwm->tcp_conn->kh) { - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX pwm->tcp_conn->kh = libssh2_knownhost_init(pwm->tcp_conn->session); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX } if (!pwm->tcp_conn->kh) @@ -830,11 +838,11 @@ gpg_error_t _setup_ssh_channel(pwm_t *pwm) gpg_error_t rc = 0; pwm->tcp_conn->state = SSH_CHANNEL; - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX pwm->tcp_conn->channel = libssh2_channel_open_session(pwm->tcp_conn->session); n = libssh2_session_last_errno(pwm->tcp_conn->session); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX if (!pwm->tcp_conn->channel && n == LIBSSH2_ERROR_EAGAIN) return GPG_ERR_EAGAIN; @@ -855,9 +863,9 @@ gpg_error_t _setup_ssh_shell(pwm_t *pwm) gpg_error_t rc; pwm->tcp_conn->state = SSH_SHELL; - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX n = libssh2_channel_shell(pwm->tcp_conn->channel); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX if (n == LIBSSH2_ERROR_EAGAIN) return GPG_ERR_EAGAIN; @@ -908,9 +916,9 @@ gpg_error_t _setup_ssh_init(pwm_t *pwm) goto done; pwm->tcp_conn->state = SSH_INIT; - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX n = libssh2_session_startup(pwm->tcp_conn->session, pwm->tcp_conn->fd); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX if (n == LIBSSH2_ERROR_EAGAIN) return GPG_ERR_EAGAIN; @@ -928,7 +936,7 @@ gpg_error_t _setup_ssh_session(pwm_t *pwm) { gpg_error_t rc; - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX if (!pwm->tcp_conn->session) { pwm->tcp_conn->session = libssh2_session_init_ex(ssh_malloc, ssh_free, @@ -939,16 +947,16 @@ gpg_error_t _setup_ssh_session(pwm_t *pwm) pwm->tcp_conn->agent = libssh2_agent_init(pwm->tcp_conn->session); } - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX if (!pwm->tcp_conn->session) { rc = gpg_error_from_errno(ENOMEM); goto fail; } - pthread_mutex_lock(&ssh_mutex); + LOCK_SSH_MUTEX libssh2_session_set_blocking(pwm->tcp_conn->session, 0); - pthread_mutex_unlock(&ssh_mutex); + UNLOCK_SSH_MUTEX return _setup_ssh_init(pwm); fail: -- 2.11.4.GIT