[openssl-commits] [openssl] master update

Matt Caswell matt at openssl.org
Mon Feb 13 15:54:22 UTC 2017


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.grandi at 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 <rsalz at openssl.org>
    Reviewed-by: Matt Caswell <matt at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/2581)

commit f89dd6738a0ec2b6cfb05a3cc5fa38843dc27d2f
Author: Andrea Grandi <andrea.grandi at 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 <rsalz at openssl.org>
    Reviewed-by: Matt Caswell <matt at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/2581)

commit f44e63644d29e5908be52b7896d5031a5cf460eb
Author: Andrea Grandi <andrea.grandi at 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 <rsalz at openssl.org>
    Reviewed-by: Matt Caswell <matt at 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);


More information about the openssl-commits mailing list