[openssl-commits] [openssl] OpenSSL_1_1_0-stable update

Matt Caswell matt at openssl.org
Mon Feb 13 15:55:03 UTC 2017


The branch OpenSSL_1_1_0-stable has been updated
       via  955286c9f38c11b8be719d632fa9267eb13467f8 (commit)
       via  bb5b56af4c3b9e43a698f01b70732c62d3642583 (commit)
       via  5a0d86c0e33eb7893517bc11c6bde188e81d5290 (commit)
      from  ca423a693a619b38fb96d94b0385f8ce91a8e759 (commit)


- Log -----------------------------------------------------------------
commit 955286c9f38c11b8be719d632fa9267eb13467f8
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)
    (cherry picked from commit 219aa86cb04e1bfc9c156fab18da2f767502afb2)

commit bb5b56af4c3b9e43a698f01b70732c62d3642583
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)
    (cherry picked from commit f89dd6738a0ec2b6cfb05a3cc5fa38843dc27d2f)

commit 5a0d86c0e33eb7893517bc11c6bde188e81d5290
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)
    (cherry picked from commit f44e63644d29e5908be52b7896d5031a5cf460eb)

-----------------------------------------------------------------------

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