Commit 57c329a3 authored by Howard Chu's avatar Howard Chu
Browse files

ITS#4606 errno is not per-thread on WIN32, always use WSAGet/SetLastError

(with notable exceptions: ignore tests for EINTR which winsock never sets)
parent 8585b7d6
......@@ -16032,7 +16032,7 @@ cat >>conftest.$ac_ext <<_ACEOF
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
#ifdef WINNT
#ifdef _WIN32
#include <stdlib.h>
#endif
int
......@@ -16397,7 +16397,7 @@ cat >>conftest.$ac_ext <<_ACEOF
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
#ifdef WINNT
#ifdef _WIN32
#include <stdlib.h>
#endif
int
......@@ -80,6 +80,7 @@
#undef sock_errstr
#define sock_errno() errno
#define sock_errstr(e) STRERROR(e)
#define sock_errset(e) errno = (e)
#ifdef HAVE_WINSOCK
# define tcp_read( s, buf, len ) recv( s, buf, len, 0 )
......@@ -102,6 +103,7 @@
#undef sock_errstr
#define sock_errno() WSAGetLastError()
#define sock_errstr(e) ber_pvt_wsa_err2string(e)
#define sock_errset(e) WSASetLastError(e)
LBER_F( char * ) ber_pvt_wsa_err2string LDAP_P((int));
......
......@@ -509,7 +509,7 @@ ber_get_next(
char buf[sizeof(ber->ber_len)-1];
ber_len_t tlen = 0;
errno = 0;
sock_errset(0);
sblen=ber_int_sb_read( sb, ber->ber_rwptr,
((char *)&ber->ber_len + LENSIZE*2 - 1)-ber->ber_rwptr);
if (sblen<=0) return LBER_DEFAULT;
......@@ -529,16 +529,16 @@ ber_get_next(
break;
/* Is the tag too big? */
if (i == sizeof(ber_tag_t)-1) {
errno = ERANGE;
sock_errset(ERANGE);
return LBER_DEFAULT;
}
}
/* Did we run out of bytes? */
if ((char *)p == ber->ber_rwptr) {
#if defined( EWOULDBLOCK )
errno = EWOULDBLOCK;
sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN )
errno = EAGAIN;
sock_errset(EAGAIN);
#endif
return LBER_DEFAULT;
}
......@@ -549,9 +549,9 @@ ber_get_next(
if ( ber->ber_ptr == ber->ber_rwptr ) {
#if defined( EWOULDBLOCK )
errno = EWOULDBLOCK;
sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN )
errno = EAGAIN;
sock_errset(EAGAIN);
#endif
return LBER_DEFAULT;
}
......@@ -562,15 +562,15 @@ ber_get_next(
unsigned char *p = (unsigned char *)ber->ber_ptr;
int llen = *p++ & 0x7f;
if (llen > (int)sizeof(ber_len_t)) {
errno = ERANGE;
sock_errset(ERANGE);
return LBER_DEFAULT;
}
/* Not enough bytes? */
if (ber->ber_rwptr - (char *)p < llen) {
#if defined( EWOULDBLOCK )
errno = EWOULDBLOCK;
sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN )
errno = EAGAIN;
sock_errset(EAGAIN);
#endif
return LBER_DEFAULT;
}
......@@ -601,7 +601,7 @@ ber_get_next(
/* make sure length is reasonable */
if ( ber->ber_len == 0 ) {
errno = ERANGE;
sock_errset(ERANGE);
return LBER_DEFAULT;
}
......@@ -609,7 +609,7 @@ ber_get_next(
ber_log_printf( LDAP_DEBUG_CONNS, ber->ber_debug,
"ber_get_next: sockbuf_max_incoming exceeded "
"(%ld > %ld)\n", ber->ber_len, sb->sb_max_incoming );
errno = ERANGE;
sock_errset(ERANGE);
return LBER_DEFAULT;
}
......@@ -620,7 +620,7 @@ ber_get_next(
* already read.
*/
if ( ber->ber_len < sblen + l ) {
errno = ERANGE;
sock_errset(ERANGE);
return LBER_DEFAULT;
}
ber->ber_buf = (char *) ber_memalloc_x( ber->ber_len + 1, ber->ber_memctx );
......@@ -652,16 +652,16 @@ ber_get_next(
to_go = ber->ber_end - ber->ber_rwptr;
assert( to_go > 0 );
errno = 0;
sock_errset(0);
res = ber_int_sb_read( sb, ber->ber_rwptr, to_go );
if (res<=0) return LBER_DEFAULT;
ber->ber_rwptr+=res;
if (res<to_go) {
#if defined( EWOULDBLOCK )
errno = EWOULDBLOCK;
sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN )
errno = EAGAIN;
sock_errset(EAGAIN);
#endif
return LBER_DEFAULT;
}
......
......@@ -467,22 +467,7 @@ sb_stream_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len )
/*
* 32-bit Windows Socket API (under Windows NT or Windows 95)
*/
{
int rc;
rc = recv( sbiod->sbiod_sb->sb_fd, buf, len, 0 );
#ifdef HAVE_WINSOCK
if ( rc < 0 ) {
int err;
err = WSAGetLastError();
errno = err;
}
#endif
return rc;
}
return recv( sbiod->sbiod_sb->sb_fd, buf, len, 0 );
#elif defined( HAVE_NCSA )
/*
......@@ -520,18 +505,7 @@ sb_stream_write( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len )
/*
* 32-bit Windows Socket API (under Windows NT or Windows 95)
*/
{
int rc = send( sbiod->sbiod_sb->sb_fd, buf, len, 0 );
#ifdef HAVE_WINSOCK
if ( rc < 0 ) {
int err;
err = WSAGetLastError();
errno = err;
}
#endif
return rc;
}
return send( sbiod->sbiod_sb->sb_fd, buf, len, 0 );
#elif defined(HAVE_NCSA)
return netwrite( sbiod->sbiod_sb->sb_fd, buf, len );
......@@ -820,11 +794,11 @@ sb_debug_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len )
ret = LBER_SBIOD_READ_NEXT( sbiod, buf, len );
if (sbiod->sbiod_sb->sb_debug & LDAP_DEBUG_PACKETS) {
int err = errno;
int err = sock_errno();
if ( ret < 0 ) {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%sread: want=%ld error=%s\n", (char *)sbiod->sbiod_pvt,
(long)len, AC_STRERROR_R( errno, ebuf, sizeof ebuf ) );
(long)len, AC_STRERROR_R( err, ebuf, sizeof ebuf ) );
} else {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%sread: want=%ld, got=%ld\n", (char *)sbiod->sbiod_pvt,
......@@ -832,7 +806,7 @@ sb_debug_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len )
ber_log_bprint( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
(const char *)buf, ret );
}
errno = err;
sock_errset(err);
}
return ret;
}
......@@ -845,12 +819,12 @@ sb_debug_write( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len )
ret = LBER_SBIOD_WRITE_NEXT( sbiod, buf, len );
if (sbiod->sbiod_sb->sb_debug & LDAP_DEBUG_PACKETS) {
int err = errno;
int err = sock_errno();
if ( ret < 0 ) {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%swrite: want=%ld error=%s\n",
(char *)sbiod->sbiod_pvt, (long)len,
AC_STRERROR_R( errno, ebuf, sizeof ebuf ) );
AC_STRERROR_R( err, ebuf, sizeof ebuf ) );
} else {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%swrite: want=%ld, written=%ld\n",
......@@ -858,7 +832,7 @@ sb_debug_write( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len )
ber_log_bprint( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
(const char *)buf, ret );
}
errno = err;
sock_errset(err);
}
return ret;
......
......@@ -161,7 +161,7 @@ sb_sasl_setup( Sockbuf_IO_Desc *sbiod, void *arg )
ber_pvt_sb_buf_init( &p->buf_out );
if ( ber_pvt_sb_grow_buffer( &p->sec_buf_in, SASL_MIN_BUFF_SIZE ) < 0 ) {
LBER_FREE( p );
errno = ENOMEM;
sock_errset(ENOMEM);
return -1;
}
sasl_getprop( p->sasl_context, SASL_MAXOUTBUF,
......@@ -288,7 +288,7 @@ sb_sasl_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
if ( ( p->sec_buf_in.buf_size < (ber_len_t) ret ) &&
ber_pvt_sb_grow_buffer( &p->sec_buf_in, ret ) < 0 )
{
errno = ENOMEM;
sock_errset(ENOMEM);
return -1;
}
p->sec_buf_in.buf_end = ret;
......@@ -327,7 +327,7 @@ sb_sasl_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
ber_log_printf( LDAP_DEBUG_ANY, sbiod->sbiod_sb->sb_debug,
"sb_sasl_read: failed to decode packet: %s\n",
sasl_errstring( ret, NULL, NULL ) );
errno = EIO;
sock_errset(EIO);
return -1;
}
......@@ -356,7 +356,7 @@ sb_sasl_write( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
/* Still have something left?? */
if ( p->buf_out.buf_ptr != p->buf_out.buf_end ) {
errno = EAGAIN;
sock_errset(EAGAIN);
return -1;
}
}
......@@ -383,7 +383,7 @@ sb_sasl_write( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
ber_log_printf( LDAP_DEBUG_ANY, sbiod->sbiod_sb->sb_debug,
"sb_sasl_write: failed to encode packet: %s\n",
sasl_errstring( ret, NULL, NULL ) );
errno = EIO;
sock_errset(EIO);
return -1;
}
p->buf_out.buf_end = p->buf_out.buf_size;
......
......@@ -63,7 +63,7 @@ do { \
static void
ldap_pvt_set_errno(int err)
{
errno = err;
sock_errset(err);
}
int
......@@ -208,7 +208,7 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
struct sockaddr *sin, socklen_t addrlen,
int async)
{
int rc;
int rc, err;
struct timeval tv = { 0 },
*opt_tv = NULL;
......@@ -241,11 +241,8 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
return ( 0 );
}
#ifdef HAVE_WINSOCK
ldap_pvt_set_errno( WSAGetLastError() );
#endif
if ( errno != EINPROGRESS && errno != EWOULDBLOCK ) {
err = sock_errno();
if ( err != EINPROGRESS && err != EWOULDBLOCK ) {
return ( -1 );
}
......
......@@ -150,7 +150,7 @@ ldap_int_flush_request(
LDAPConn *lc = lr->lr_conn;
if ( ber_flush2( lc->lconn_sb, lr->lr_ber, LBER_FLUSH_FREE_NEVER ) != 0 ) {
if ( errno == EAGAIN ) {
if ( sock_errno() == EAGAIN ) {
/* need to continue write later */
lr->lr_status = LDAP_REQST_WRITING;
ldap_mark_select_write( ld, lc->lconn_sb );
......
......@@ -322,13 +322,13 @@ wait4msg(
if ( rc == -1 ) {
Debug( LDAP_DEBUG_TRACE,
"ldap_int_select returned -1: errno %d\n",
errno, 0, 0 );
sock_errno(), 0, 0 );
}
#endif
if ( rc == 0 || ( rc == -1 && (
!LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART)
|| errno != EINTR ) ) )
|| sock_errno() != EINTR ) ) )
{
ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN :
LDAP_TIMEOUT);
......@@ -471,7 +471,7 @@ retry:
assert( LBER_VALID (ber) );
/* get the next message */
errno = 0;
sock_errset(0);
#ifdef LDAP_CONNECTIONLESS
if ( LDAP_IS_UDP(ld) ) {
struct sockaddr from;
......@@ -496,10 +496,10 @@ nextresp3:
"ber_get_next failed.\n", 0, 0, 0 );
#endif
#ifdef EWOULDBLOCK
if ( errno == EWOULDBLOCK ) return LDAP_MSG_X_KEEP_LOOKING;
if ( sock_errno() == EWOULDBLOCK ) return LDAP_MSG_X_KEEP_LOOKING;
#endif
#ifdef EAGAIN
if ( errno == EAGAIN ) return LDAP_MSG_X_KEEP_LOOKING;
if ( sock_errno() == EAGAIN ) return LDAP_MSG_X_KEEP_LOOKING;
#endif
ld->ld_errno = LDAP_SERVER_DOWN;
return -1;
......
......@@ -594,7 +594,7 @@ sb_tls_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
err = SSL_get_error( p->ssl, ret );
if (err == SSL_ERROR_WANT_READ ) {
sbiod->sbiod_sb->sb_trans_needs_read = 1;
errno = EWOULDBLOCK;
sock_errset(EWOULDBLOCK);
}
else
sbiod->sbiod_sb->sb_trans_needs_read = 0;
......@@ -620,7 +620,7 @@ sb_tls_write( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
err = SSL_get_error( p->ssl, ret );
if (err == SSL_ERROR_WANT_WRITE ) {
sbiod->sbiod_sb->sb_trans_needs_write = 1;
errno = EWOULDBLOCK;
sock_errset(EWOULDBLOCK);
} else {
sbiod->sbiod_sb->sb_trans_needs_write = 0;
......@@ -676,7 +676,7 @@ sb_tls_bio_read( BIO *b, char *buf, int len )
BIO_clear_retry_flags( b );
if ( ret < 0 ) {
int err = errno;
int err = sock_errno();
if ( err == EAGAIN || err == EWOULDBLOCK ) {
BIO_set_retry_read( b );
}
......@@ -703,7 +703,7 @@ sb_tls_bio_write( BIO *b, const char *buf, int len )
BIO_clear_retry_flags( b );
if ( ret < 0 ) {
int err = errno;
int err = sock_errno();
if ( err == EAGAIN || err == EWOULDBLOCK ) {
BIO_set_retry_write( b );
}
......
......@@ -1483,7 +1483,7 @@ connection_input( Connection *conn )
return -1;
}
errno = 0;
sock_errset(0);
#ifdef LDAP_CONNECTIONLESS
if ( conn->c_is_udp ) {
......@@ -1503,7 +1503,7 @@ connection_input( Connection *conn )
tag = ber_get_next( conn->c_sb, &len, conn->c_currentber );
if ( tag != LDAP_TAG_MESSAGE ) {
int err = errno;
int err = sock_errno();
ber_socket_t sd;
ber_sockbuf_ctrl( conn->c_sb, LBER_SB_OPT_GET_FD, &sd );
......
......@@ -170,7 +170,7 @@ static long send_ldap_ber(
break;
}
err = errno;
err = sock_errno();
/*
* we got an error. if it's ewouldblock, we need to
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment