diff options
author | Matt Caswell <matt@openssl.org> | 2015-10-06 14:47:00 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2015-11-20 23:34:35 +0000 |
commit | 079a1a9014b89661f0a612a5a9724ad9c77f21a3 (patch) | |
tree | 2e04061d51e78ff7c6e53bdd2440497c9cbcc0c6 /crypto/async/async.c | |
parent | 9c8dc051d0a1293279bbf289b5f324824a02405b (diff) | |
download | openssl-079a1a9014b89661f0a612a5a9724ad9c77f21a3.zip openssl-079a1a9014b89661f0a612a5a9724ad9c77f21a3.tar.gz openssl-079a1a9014b89661f0a612a5a9724ad9c77f21a3.tar.bz2 |
Add ASYNC error codes
Add ASYNCerr support to give some meaningful error message in the event of
a failure.
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/async/async.c')
-rw-r--r-- | crypto/async/async.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/crypto/async/async.c b/crypto/async/async.c index c3fe3e1..e0ff110 100644 --- a/crypto/async/async.c +++ b/crypto/async/async.c @@ -51,6 +51,7 @@ * ==================================================================== */ +#include <openssl/err.h> #include <openssl/async.h> #include <string.h> #include "async_locl.h" @@ -65,7 +66,7 @@ static async_ctx *async_ctx_new(void) async_ctx *nctx = NULL; if(!(nctx = OPENSSL_malloc(sizeof (async_ctx)))) { - /* Error here */ + ASYNCerr(ASYNC_F_ASYNC_CTX_NEW, ERR_R_MALLOC_FAILURE); goto err; } @@ -101,11 +102,13 @@ static ASYNC_JOB *async_job_new(void) int pipefds[2]; if(!(job = OPENSSL_malloc(sizeof (ASYNC_JOB)))) { + ASYNCerr(ASYNC_F_ASYNC_JOB_NEW, ERR_R_MALLOC_FAILURE); return NULL; } if(!async_pipe(pipefds)) { OPENSSL_free(job); + ASYNCerr(ASYNC_F_ASYNC_JOB_NEW, ASYNC_R_CANNOT_CREATE_WAIT_PIPE); return NULL; } @@ -181,9 +184,10 @@ void async_start_func(void) if(!async_fibre_swapcontext(&job->fibrectx, &async_get_ctx()->dispatcher, 1)) { /* - * Should not happen. Getting here will close the thread...can't do much - * about it + * Should not happen. Getting here will close the thread...can't do + * much about it */ + ASYNCerr(ASYNC_F_ASYNC_START_FUNC, ASYNC_R_FAILED_TO_SWAP_CONTEXT); } } } @@ -220,12 +224,16 @@ int ASYNC_start_job(ASYNC_JOB **job, int *ret, int (*func)(void *), async_get_ctx()->currjob = *job; /* Resume previous job */ if(!async_fibre_swapcontext(&async_get_ctx()->dispatcher, - &async_get_ctx()->currjob->fibrectx, 1)) + &async_get_ctx()->currjob->fibrectx, 1)) { + ASYNCerr(ASYNC_F_ASYNC_START_JOB, + ASYNC_R_FAILED_TO_SWAP_CONTEXT); goto err; + } continue; } /* Should not happen */ + ASYNCerr(ASYNC_F_ASYNC_START_JOB, ERR_R_INTERNAL_ERROR); async_release_job(async_get_ctx()->currjob); async_get_ctx()->currjob = NULL; *job = NULL; @@ -240,6 +248,7 @@ int ASYNC_start_job(ASYNC_JOB **job, int *ret, int (*func)(void *), if(args != NULL) { async_get_ctx()->currjob->funcargs = OPENSSL_malloc(size); if(!async_get_ctx()->currjob->funcargs) { + ASYNCerr(ASYNC_F_ASYNC_START_JOB, ERR_R_MALLOC_FAILURE); async_release_job(async_get_ctx()->currjob); async_get_ctx()->currjob = NULL; return ASYNC_ERR; @@ -251,8 +260,10 @@ int ASYNC_start_job(ASYNC_JOB **job, int *ret, int (*func)(void *), async_get_ctx()->currjob->func = func; if(!async_fibre_swapcontext(&async_get_ctx()->dispatcher, - &async_get_ctx()->currjob->fibrectx, 1)) + &async_get_ctx()->currjob->fibrectx, 1)) { + ASYNCerr(ASYNC_F_ASYNC_START_JOB, ASYNC_R_FAILED_TO_SWAP_CONTEXT); goto err; + } } err: @@ -267,15 +278,20 @@ int ASYNC_pause_job(void) { ASYNC_JOB *job; - if(!async_get_ctx() || !async_get_ctx()->currjob) + if(!async_get_ctx() || !async_get_ctx()->currjob) { + /* + * Could be we've deliberately not been started within a job so we + * don't put an error on the error queue here. + */ return 0; + } job = async_get_ctx()->currjob; job->status = ASYNC_JOB_PAUSING; if(!async_fibre_swapcontext(&job->fibrectx, &async_get_ctx()->dispatcher, 1)) { - /* Error */ + ASYNCerr(ASYNC_F_ASYNC_PAUSE_JOB, ASYNC_R_FAILED_TO_SWAP_CONTEXT); return 0; } @@ -297,11 +313,14 @@ int ASYNC_init_pool(size_t max_size, size_t init_size) STACK_OF(ASYNC_JOB) *pool; size_t curr_size = 0; - if (init_size > max_size) + if (init_size > max_size) { + ASYNCerr(ASYNC_F_ASYNC_INIT_POOL, ASYNC_R_INVALID_POOL_SIZE); return 0; + } pool = sk_ASYNC_JOB_new_null(); if (pool == NULL) { + ASYNCerr(ASYNC_F_ASYNC_INIT_POOL, ERR_R_MALLOC_FAILURE); return 0; } /* Pre-create jobs as required */ @@ -324,6 +343,7 @@ int ASYNC_init_pool(size_t max_size, size_t init_size) } if (!async_set_pool(pool, curr_size, max_size)) { + ASYNCerr(ASYNC_F_ASYNC_INIT_POOL, ASYNC_R_FAILED_TO_SET_POOL); async_empty_pool(pool); sk_ASYNC_JOB_free(pool); return 0; |