From 27f172d9a3f3ec9901439b4823c95788598fa367 Mon Sep 17 00:00:00 2001 From: Rich Salz Date: Thu, 11 Feb 2016 09:33:51 -0500 Subject: [PATCH] GH620: second diff from rt-2275, adds error code clean up and apply patches from RT-2275 Signed-off-by: Rich Salz Reviewed-by: Richard Levitte --- crypto/bio/b_sock.c | 32 ++++++++++++++++++++++++++++++++ include/openssl/err.h | 1 + 2 files changed, 33 insertions(+) diff --git a/crypto/bio/b_sock.c b/crypto/bio/b_sock.c index 3e17bec14a..4ae08d2d84 100644 --- a/crypto/bio/b_sock.c +++ b/crypto/bio/b_sock.c @@ -379,8 +379,40 @@ int BIO_socket_nbio(int s, int mode) l = mode; # ifdef FIONBIO + l = mode; + ret = BIO_socket_ioctl(s, FIONBIO, &l); +# elif defined(F_GETFL) && defined(F_SETFL) && (defined(O_NONBLOCK) || defined(FNDELAY)) + /* make sure this call always pushes an error level; BIO_socket_ioctl() does so, so we do too. */ + + l = fcntl(s, F_GETFL, 0); + if (l == -1) { + SYSerr(SYS_F_FCNTL, get_last_rtl_error()); + ret = -1; + } else { +# if defined(O_NONBLOCK) + l &= ~O_NONBLOCK; +# else + l &= ~FNDELAY; /* BSD4.x */ +# endif + if (mode) { +# if defined(O_NONBLOCK) + l |= O_NONBLOCK; +# else + l |= FNDELAY; /* BSD4.x */ +# endif + } + ret = fcntl(s, F_SETFL, l); + + if (ret < 0) { + SYSerr(SYS_F_FCNTL, get_last_rtl_error()); + } + } +# else + /* make sure this call always pushes an error level; BIO_socket_ioctl() does so, so we do too. */ + BIOerr(BIO_F_BIO_SOCKET_NBIO, ERR_R_PASSED_INVALID_ARGUMENT); # endif + return (ret == 0); } diff --git a/include/openssl/err.h b/include/openssl/err.h index bdf83081cb..390ee74f88 100644 --- a/include/openssl/err.h +++ b/include/openssl/err.h @@ -310,6 +310,7 @@ typedef struct err_state_st { # define ERR_R_INTERNAL_ERROR (4|ERR_R_FATAL) # define ERR_R_DISABLED (5|ERR_R_FATAL) # define ERR_R_INIT_FAIL (6|ERR_R_FATAL) +# define ERR_R_PASSED_INVALID_ARGUMENT (7) /* * 99 is the maximum possible ERR_R_... code, higher values are reserved for -- 2.25.1