From: Matt Caswell <matt@openssl.org>
Date: Fri, 13 Nov 2015 11:22:21 +0000 (+0000)
Subject: Swap to using proper windows pipes
X-Git-Tag: OpenSSL_1_1_0-pre1~209
X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=2b2c78d4f0a73498739cfc0879299d7325c35160;p=oweals%2Fopenssl.git

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 <rsalz@openssl.org>
---

diff --git a/crypto/async/arch/async_null.c b/crypto/async/arch/async_null.c
index 05b4964eb2..f015c90fb7 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 78bf61c44e..3f6cb6274a 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 fce3c481d6..9841a9ca92 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 86f4c09675..5bf64afa22 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 ba329788b3..3cf97479ed 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 6e7cf72b0b..0cfd7dc683 100644
--- a/include/openssl/async.h
+++ b/include/openssl/async.h
@@ -56,6 +56,14 @@
 
 #include <stdlib.h>
 
+#if defined(_WIN32) || defined(__CYGWIN__)
+#include <windows.h>
+#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 d89e8ad789..5dd5c4adff 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)