The branch master has been updated via 219aa86cb04e1bfc9c156fab18da2f767502afb2 (commit) via f89dd6738a0ec2b6cfb05a3cc5fa38843dc27d2f (commit) via f44e63644d29e5908be52b7896d5031a5cf460eb (commit) from 2dfb52d3968e838876406d47861488324d5990b4 (commit)
- Log ----------------------------------------------------------------- commit 219aa86cb04e1bfc9c156fab18da2f767502afb2 Author: Andrea Grandi <andrea.gra...@intel.com> Date: Fri Feb 10 10:23:21 2017 +0000 Further improvements to ASYNC_WAIT_CTX_clear_fd Remove call to cleanup function Use only one loop to find previous element Reviewed-by: Rich Salz <rs...@openssl.org> Reviewed-by: Matt Caswell <m...@openssl.org> (Merged from https://github.com/openssl/openssl/pull/2581) commit f89dd6738a0ec2b6cfb05a3cc5fa38843dc27d2f Author: Andrea Grandi <andrea.gra...@intel.com> Date: Fri Feb 3 05:46:17 2017 +0000 Remove fd from the list when the engine clears the wait context before pause This fixes the num of fds added/removed returned by ASYNC_WAIT_CTX_get_changed_fds Previously, the numbers were not consistent with the fds actually written in the buffers since the fds that have been both added and removed are explicitly ignored in the loop. Reviewed-by: Rich Salz <rs...@openssl.org> Reviewed-by: Matt Caswell <m...@openssl.org> (Merged from https://github.com/openssl/openssl/pull/2581) commit f44e63644d29e5908be52b7896d5031a5cf460eb Author: Andrea Grandi <andrea.gra...@intel.com> Date: Thu Jan 26 03:17:54 2017 +0000 Add test to show wrong behavior of ASYNC_WAIT_CTX This happens when a fd is added and then immediately removed from the ASYNC_WAIT_CTX before pausing the job. Reviewed-by: Rich Salz <rs...@openssl.org> Reviewed-by: Matt Caswell <m...@openssl.org> (Merged from https://github.com/openssl/openssl/pull/2581) ----------------------------------------------------------------------- Summary of changes: crypto/async/async_wait.c | 22 ++++++++++++++++++++-- test/asynctest.c | 29 +++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/crypto/async/async_wait.c b/crypto/async/async_wait.c index e5ecaeb..e115985 100644 --- a/crypto/async/async_wait.c +++ b/crypto/async/async_wait.c @@ -138,16 +138,33 @@ int ASYNC_WAIT_CTX_get_changed_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *addfd, int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key) { - struct fd_lookup_st *curr; + struct fd_lookup_st *curr, *prev; curr = ctx->fds; + prev = NULL; while (curr != NULL) { - if (curr->del) { + if (curr->del == 1) { /* This one has been marked deleted already so do nothing */ curr = curr->next; continue; } if (curr->key == key) { + /* If fd has just been added, remove it from the list */ + if (curr->add == 1) { + if (ctx->fds == curr) { + ctx->fds = curr->next; + } else { + prev->next = curr->next; + } + + /* It is responsibility of the caller to cleanup before calling + * ASYNC_WAIT_CTX_clear_fd + */ + OPENSSL_free(curr); + ctx->numadd--; + return 1; + } + /* * Mark it as deleted. We don't call cleanup if explicitly asked * to clear an fd. We assume the caller is going to do that (if @@ -157,6 +174,7 @@ int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key) ctx->numdel++; return 1; } + prev = curr; curr = curr->next; } return 0; diff --git a/test/asynctest.c b/test/asynctest.c index 5057ce1..7be2e5f 100644 --- a/test/asynctest.c +++ b/test/asynctest.c @@ -49,17 +49,29 @@ static int waitfd(void *args) { ASYNC_JOB *job; ASYNC_WAIT_CTX *waitctx; - ASYNC_pause_job(); job = ASYNC_get_current_job(); if (job == NULL) return 0; waitctx = ASYNC_get_wait_ctx(job); if (waitctx == NULL) return 0; + + /* First case: no fd added or removed */ + ASYNC_pause_job(); + + /* Second case: one fd added */ if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) return 0; ASYNC_pause_job(); + /* Third case: all fd removed */ + if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx)) + return 0; + ASYNC_pause_job(); + + /* Last case: fd added and immediately removed */ + if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) + return 0; if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx)) return 0; @@ -195,15 +207,15 @@ static int test_ASYNC_WAIT_CTX_get_all_fds() || fd != MAGIC_WAIT_FD || (fd = OSSL_BAD_ASYNC_FD, 0) /* Assign to something else */ || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, - &numdelfds) + &numdelfds) || numfds != 1 || numdelfds != 0 || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, &fd, &numfds, NULL, &numdelfds) || fd != MAGIC_WAIT_FD - /* On final run we expect one deleted fd */ + /* On third run we expect one deleted fd */ || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) - != ASYNC_FINISH + != ASYNC_PAUSE || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) || numfds != 0 || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, @@ -213,6 +225,15 @@ static int test_ASYNC_WAIT_CTX_get_all_fds() || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, &delfd, &numdelfds) || delfd != MAGIC_WAIT_FD + /* On last run we are not expecting any wait fd */ + || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) + != ASYNC_FINISH + || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) + || numfds != 0 + || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, + &numdelfds) + || numfds != 0 + || numdelfds != 0 || funcret != 1) { fprintf(stderr, "test_ASYNC_get_wait_fd() failed\n"); ASYNC_WAIT_CTX_free(waitctx); _____ openssl-commits mailing list To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-commits