diff --git a/include/libssh/poll.h b/include/libssh/poll.h index 8e30676e367f4cbc0e7e461313ccc456db2bb3fc..8ed7372dcbcfe896bf86a45fe3ca48d92a3eaf0a 100644 --- a/include/libssh/poll.h +++ b/include/libssh/poll.h @@ -157,6 +157,7 @@ void ssh_poll_ctx_free(ssh_poll_ctx ctx); int ssh_poll_ctx_add(ssh_poll_ctx ctx, ssh_poll_handle p); int ssh_poll_ctx_add_socket (ssh_poll_ctx ctx, struct ssh_socket_struct *s); void ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p); +bool ssh_poll_locked(ssh_poll_handle p); int ssh_poll_ctx_dopoll(ssh_poll_ctx ctx, int timeout); ssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session); int ssh_event_add_poll(ssh_event event, ssh_poll_handle p); diff --git a/src/poll.c b/src/poll.c index 80903049f4141489b9ec02fbfcff53ec260b1ead..4b1763637b7aca8b9ea93e0d4c13597463f6884e 100644 --- a/src/poll.c +++ b/src/poll.c @@ -670,6 +670,20 @@ void ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p) } } +/** + * @brief Returns if a poll object is locked. + * + * @param p Pointer to an already allocated poll object. + * @returns true if the poll object is locked; false otherwise. + */ +bool ssh_poll_locked(ssh_poll_handle p) +{ + if (p == NULL) { + return false; + } + return p->lock_cnt > 0; +} + /** * @brief Poll all the sockets associated through a poll object with a * poll context. If any of the events are set after the poll, the diff --git a/src/socket.c b/src/socket.c index 857a7bd5d89dbfaeb10ee35b09c77833369e9bb3..3909e486c18996142383a839a49cec129a6ca0bf 100644 --- a/src/socket.c +++ b/src/socket.c @@ -479,7 +479,7 @@ void ssh_socket_close(ssh_socket s) #endif } - if (s->poll_handle != NULL) { + if (s->poll_handle != NULL && !ssh_poll_locked(s->poll_handle)) { ssh_poll_free(s->poll_handle); s->poll_handle = NULL; }