Async error handling and MacOS/X fixes

In the async code for MacOS/X define _XOPEN_SOURCE (if not already
defined) as early as possible.  We must do this before including
any header files, because on MacOS/X <stlib.h> includes <signal.h>
which includes <ucontext.h>.  If we delay defining _XOPEN_SOURCE
and include <ucontext.h> after various system headers are included,
we are very likely to end up with the wrong (truncated) definition
of ucontext_t.

Also, better error handling and some code cleanup in POSIX fibre
construction and destruction.  We make sure that async_fibre_makecontext()
always initializes the fibre to a state that can be freed.

For all implementations, check for error returns from
async_fibre_makecontext().

Reviewed-by: Matt Caswell <matt@openssl.org>
This commit is contained in:
Viktor Dukhovni
2015-11-21 20:14:43 -05:00
parent 3d32218812
commit 6e8ac50870
7 changed files with 51 additions and 51 deletions

View File

@@ -59,11 +59,12 @@
*/
#undef _FORTIFY_SOURCE
#include <openssl/err.h>
#include <openssl/async.h>
#include <string.h>
/* This must be the first #include file */
#include "async_locl.h"
#include <openssl/err.h>
#include <string.h>
#define ASYNC_JOB_RUNNING 0
#define ASYNC_JOB_PAUSING 1
#define ASYNC_JOB_PAUSED 2
@@ -168,8 +169,11 @@ static ASYNC_JOB *async_get_pool_job(void) {
return NULL;
job = async_job_new();
if (job) {
async_fibre_makecontext(&job->fibrectx);
if (job != NULL) {
if (! async_fibre_makecontext(&job->fibrectx)) {
async_job_free(job);
return NULL;
}
pool->curr_size++;
}
}
@@ -369,22 +373,20 @@ int ASYNC_init_thread(size_t max_size, size_t init_size)
pool->max_size = max_size;
/* Pre-create jobs as required */
while (init_size) {
while (init_size--) {
ASYNC_JOB *job;
job = async_job_new();
if (job) {
async_fibre_makecontext(&job->fibrectx);
job->funcargs = NULL;
sk_ASYNC_JOB_push(pool->jobs, job);
curr_size++;
init_size--;
} else {
if (job == NULL || !async_fibre_makecontext(&job->fibrectx)) {
/*
* Not actually fatal because we already created the pool, just skip
* creation of any more jobs
* Not actually fatal because we already created the pool, just
* skip creation of any more jobs
*/
init_size = 0;
async_job_free(job);
break;
}
job->funcargs = NULL;
sk_ASYNC_JOB_push(pool->jobs, job);
curr_size++;
}
pool->curr_size = curr_size;
if (!async_set_pool(pool)) {