Commit f44e6364 authored by Andrea Grandi's avatar Andrea Grandi Committed by Matt Caswell
Browse files

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: default avatarRich Salz <rsalz@openssl.org>
Reviewed-by: default avatarMatt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/2581)
parent 2dfb52d3
Loading
Loading
Loading
Loading
+25 −4
Original line number Original line Diff line number Diff line
@@ -49,17 +49,29 @@ static int waitfd(void *args)
{
{
    ASYNC_JOB *job;
    ASYNC_JOB *job;
    ASYNC_WAIT_CTX *waitctx;
    ASYNC_WAIT_CTX *waitctx;
    ASYNC_pause_job();
    job = ASYNC_get_current_job();
    job = ASYNC_get_current_job();
    if (job == NULL)
    if (job == NULL)
        return 0;
        return 0;
    waitctx = ASYNC_get_wait_ctx(job);
    waitctx = ASYNC_get_wait_ctx(job);
    if (waitctx == NULL)
    if (waitctx == NULL)
        return 0;
        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))
    if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL))
        return 0;
        return 0;
    ASYNC_pause_job();
    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))
    if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx))
        return 0;
        return 0;


@@ -201,9 +213,9 @@ static int test_ASYNC_WAIT_CTX_get_all_fds()
            || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, &fd, &numfds, NULL,
            || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, &fd, &numfds, NULL,
                                               &numdelfds)
                                               &numdelfds)
            || fd != MAGIC_WAIT_FD
            || 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_start_job(&job, waitctx, &funcret, waitfd, NULL, 0)
                != ASYNC_FINISH
                != ASYNC_PAUSE
            || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds)
            || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds)
            || numfds != 0
            || numfds != 0
            || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL,
            || !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,
            || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, &delfd,
                                               &numdelfds)
                                               &numdelfds)
            || delfd != MAGIC_WAIT_FD
            || 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) {
            || funcret != 1) {
        fprintf(stderr, "test_ASYNC_get_wait_fd() failed\n");
        fprintf(stderr, "test_ASYNC_get_wait_fd() failed\n");
        ASYNC_WAIT_CTX_free(waitctx);
        ASYNC_WAIT_CTX_free(waitctx);