From 2b2c78d4f0a73498739cfc0879299d7325c35160 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Fri, 13 Nov 2015 11:22:21 +0000 Subject: [PATCH] Swap to using proper windows pipes We were using _pipe to create a pipe on windows. This uses the "int" type for its file descriptor for compatibility. However most windows functions expect to use a "HANDLE". Probably we could get away with just casting but it seems more robust to use the proper type and main stream windows functions. Reviewed-by: Rich Salz --- crypto/async/arch/async_null.c | 6 +++--- crypto/async/arch/async_posix.c | 6 +++--- crypto/async/arch/async_win.c | 20 ++++++++++++-------- crypto/async/async.c | 4 ++-- crypto/async/async_locl.h | 10 +++++----- include/openssl/async.h | 10 +++++++++- test/asynctest.c | 16 +++++++++++++--- 7 files changed, 47 insertions(+), 25 deletions(-) diff --git a/crypto/async/arch/async_null.c b/crypto/async/arch/async_null.c index 05b4964eb2d..f015c90fb73 100644 --- a/crypto/async/arch/async_null.c +++ b/crypto/async/arch/async_null.c @@ -91,17 +91,17 @@ int async_pool_can_grow(void) { return 0; } -int async_pipe(int *pipefds) +int async_pipe(OSSL_ASYNC_FD *pipefds) { return -1; } -int async_write1(int fd, const void *buf) +int async_write1(OSSL_ASYNC_FD fd, const void *buf) { return -1; } -int async_read1(int fd, void *buf) +int async_read1(OSSL_ASYNC_FD fd, void *buf) { return -1; } diff --git a/crypto/async/arch/async_posix.c b/crypto/async/arch/async_posix.c index 78bf61c44ef..3f6cb6274aa 100644 --- a/crypto/async/arch/async_posix.c +++ b/crypto/async/arch/async_posix.c @@ -95,7 +95,7 @@ void async_fibre_free(async_fibre *fibre) OPENSSL_free(fibre->fibre.uc_stack.ss_sp); } -int async_pipe(int *pipefds) +int async_pipe(OSSL_ASYNC_FD *pipefds) { if (pipe(pipefds) == 0) return 1; @@ -103,7 +103,7 @@ int async_pipe(int *pipefds) return 0; } -int async_write1(int fd, const void *buf) +int async_write1(OSSL_ASYNC_FD fd, const void *buf) { if (write(fd, buf, 1) > 0) return 1; @@ -111,7 +111,7 @@ int async_write1(int fd, const void *buf) return 0; } -int async_read1(int fd, void *buf) +int async_read1(OSSL_ASYNC_FD fd, void *buf) { if (read(fd, buf, 1) > 0) return 1; diff --git a/crypto/async/arch/async_win.c b/crypto/async/arch/async_win.c index fce3c481d66..9841a9ca929 100644 --- a/crypto/async/arch/async_win.c +++ b/crypto/async/arch/async_win.c @@ -87,25 +87,29 @@ VOID CALLBACK async_start_func_win(PVOID unused) async_start_func(); } -int async_pipe(int *pipefds) +int async_pipe(OSSL_ASYNC_FD *pipefds) { - if (_pipe(pipefds, 256, _O_BINARY) == 0) - return 1; + if (CreatePipe(&pipefds[0], &pipefds[1], NULL, 256) == 0) + return 0; - return 0; + return 1; } -int async_write1(int fd, const void *buf) +int async_write1(OSSL_ASYNC_FD fd, const void *buf) { - if (_write(fd, buf, 1) > 0) + DWORD numwritten = 0; + + if (WriteFile(fd, buf, 1, &numwritten, NULL) && numwritten == 1) return 1; return 0; } -int async_read1(int fd, void *buf) +int async_read1(OSSL_ASYNC_FD fd, void *buf) { - if (_read(fd, buf, 1) > 0) + DWORD numread = 0; + + if (ReadFile(fd, buf, 1, &numread, NULL) && numread == 1) return 1; return 0; diff --git a/crypto/async/async.c b/crypto/async/async.c index 86f4c096754..5bf64afa226 100644 --- a/crypto/async/async.c +++ b/crypto/async/async.c @@ -109,7 +109,7 @@ static int async_ctx_free(void) static ASYNC_JOB *async_job_new(void) { ASYNC_JOB *job = NULL; - int pipefds[2]; + OSSL_ASYNC_FD pipefds[2]; job = OPENSSL_malloc(sizeof (ASYNC_JOB)); if (job == NULL) { @@ -387,7 +387,7 @@ ASYNC_JOB *ASYNC_get_current_job(void) return ctx->currjob; } -int ASYNC_get_wait_fd(ASYNC_JOB *job) +OSSL_ASYNC_FD ASYNC_get_wait_fd(ASYNC_JOB *job) { return job->wait_fd; } diff --git a/crypto/async/async_locl.h b/crypto/async/async_locl.h index ba329788b3a..3cf97479eda 100644 --- a/crypto/async/async_locl.h +++ b/crypto/async/async_locl.h @@ -73,8 +73,8 @@ struct async_job_st { int ret; int status; int wake_set; - int wait_fd; - int wake_fd; + OSSL_ASYNC_FD wait_fd; + OSSL_ASYNC_FD wake_fd; }; DECLARE_STACK_OF(ASYNC_JOB) @@ -88,6 +88,6 @@ void async_release_job_to_pool(ASYNC_JOB *job); size_t async_pool_max_size(void); void async_release_pool(void); int async_pool_can_grow(void); -int async_pipe(int *pipefds); -int async_write1(int fd, const void *buf); -int async_read1(int fd, void *buf); +int async_pipe(OSSL_ASYNC_FD *pipefds); +int async_write1(OSSL_ASYNC_FD fd, const void *buf); +int async_read1(OSSL_ASYNC_FD fd, void *buf); diff --git a/include/openssl/async.h b/include/openssl/async.h index 6e7cf72b0b9..0cfd7dc6830 100644 --- a/include/openssl/async.h +++ b/include/openssl/async.h @@ -56,6 +56,14 @@ #include +#if defined(_WIN32) || defined(__CYGWIN__) +#include +#define OSSL_ASYNC_FD HANDLE +#else +#define OSSL_ASYNC_FD int +#endif + + # ifdef __cplusplus extern "C" { # endif @@ -74,7 +82,7 @@ int ASYNC_start_job(ASYNC_JOB **job, int *ret, int (*func)(void *), void *args, size_t size); int ASYNC_pause_job(void); -int ASYNC_get_wait_fd(ASYNC_JOB *job); +OSSL_ASYNC_FD ASYNC_get_wait_fd(ASYNC_JOB *job); ASYNC_JOB *ASYNC_get_current_job(void); void ASYNC_wake(ASYNC_JOB *job); void ASYNC_clear_wake(ASYNC_JOB *job); diff --git a/test/asynctest.c b/test/asynctest.c index d89e8ad7893..5dd5c4adff6 100644 --- a/test/asynctest.c +++ b/test/asynctest.c @@ -67,7 +67,7 @@ # if _POSIX_VERSION >= 200112L # define ASYNC_POSIX # endif -#elif (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL) +#elif defined(_WIN32) || defined(__CYGWIN__) # define ASYNC_WIN #endif @@ -201,8 +201,9 @@ static int test_ASYNC_get_current_job() return 1; } -static int hasdata(int fd) +static int hasdata(OSSL_ASYNC_FD fd) { +#ifdef ASYNC_POSIX fd_set checkfds; struct timeval tv; FD_ZERO(&checkfds); @@ -213,12 +214,21 @@ static int hasdata(int fd) if (FD_ISSET(fd, &checkfds)) return 1; return 0; +#else + DWORD avail = 0; + + if (PeekNamedPipe(fd, NULL, 0, NULL, &avail, NULL) && avail > 0) + return 1; + + return 0; +#endif } static int test_ASYNC_get_wait_fd() { ASYNC_JOB *job = NULL; - int funcret, fd; + int funcret; + OSSL_ASYNC_FD fd; if ( !ASYNC_init_pool(1, 0) || ASYNC_start_job(&job, &funcret, wake, NULL, 0) -- 2.39.5