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

(with notable exceptions: ignore tests for EINTR which winsock never sets)
This commit is contained in:
Howard Chu 2006-09-14 06:35:34 +00:00
parent 8585b7d6bb
commit 57c329a3af
11 changed files with 49 additions and 76 deletions

4
configure vendored
View file

@ -16032,7 +16032,7 @@ cat >>conftest.$ac_ext <<_ACEOF
#include <stdio.h> #include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include <errno.h> #include <errno.h>
#ifdef WINNT #ifdef _WIN32
#include <stdlib.h> #include <stdlib.h>
#endif #endif
int int
@ -16397,7 +16397,7 @@ cat >>conftest.$ac_ext <<_ACEOF
#include <stdio.h> #include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include <errno.h> #include <errno.h>
#ifdef WINNT #ifdef _WIN32
#include <stdlib.h> #include <stdlib.h>
#endif #endif
int int

View file

@ -80,6 +80,7 @@
#undef sock_errstr #undef sock_errstr
#define sock_errno() errno #define sock_errno() errno
#define sock_errstr(e) STRERROR(e) #define sock_errstr(e) STRERROR(e)
#define sock_errset(e) errno = (e)
#ifdef HAVE_WINSOCK #ifdef HAVE_WINSOCK
# define tcp_read( s, buf, len ) recv( s, buf, len, 0 ) # define tcp_read( s, buf, len ) recv( s, buf, len, 0 )
@ -102,6 +103,7 @@
#undef sock_errstr #undef sock_errstr
#define sock_errno() WSAGetLastError() #define sock_errno() WSAGetLastError()
#define sock_errstr(e) ber_pvt_wsa_err2string(e) #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)); LBER_F( char * ) ber_pvt_wsa_err2string LDAP_P((int));

View file

@ -509,7 +509,7 @@ ber_get_next(
char buf[sizeof(ber->ber_len)-1]; char buf[sizeof(ber->ber_len)-1];
ber_len_t tlen = 0; ber_len_t tlen = 0;
errno = 0; sock_errset(0);
sblen=ber_int_sb_read( sb, ber->ber_rwptr, sblen=ber_int_sb_read( sb, ber->ber_rwptr,
((char *)&ber->ber_len + LENSIZE*2 - 1)-ber->ber_rwptr); ((char *)&ber->ber_len + LENSIZE*2 - 1)-ber->ber_rwptr);
if (sblen<=0) return LBER_DEFAULT; if (sblen<=0) return LBER_DEFAULT;
@ -529,16 +529,16 @@ ber_get_next(
break; break;
/* Is the tag too big? */ /* Is the tag too big? */
if (i == sizeof(ber_tag_t)-1) { if (i == sizeof(ber_tag_t)-1) {
errno = ERANGE; sock_errset(ERANGE);
return LBER_DEFAULT; return LBER_DEFAULT;
} }
} }
/* Did we run out of bytes? */ /* Did we run out of bytes? */
if ((char *)p == ber->ber_rwptr) { if ((char *)p == ber->ber_rwptr) {
#if defined( EWOULDBLOCK ) #if defined( EWOULDBLOCK )
errno = EWOULDBLOCK; sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN ) #elif defined( EAGAIN )
errno = EAGAIN; sock_errset(EAGAIN);
#endif #endif
return LBER_DEFAULT; return LBER_DEFAULT;
} }
@ -549,9 +549,9 @@ ber_get_next(
if ( ber->ber_ptr == ber->ber_rwptr ) { if ( ber->ber_ptr == ber->ber_rwptr ) {
#if defined( EWOULDBLOCK ) #if defined( EWOULDBLOCK )
errno = EWOULDBLOCK; sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN ) #elif defined( EAGAIN )
errno = EAGAIN; sock_errset(EAGAIN);
#endif #endif
return LBER_DEFAULT; return LBER_DEFAULT;
} }
@ -562,15 +562,15 @@ ber_get_next(
unsigned char *p = (unsigned char *)ber->ber_ptr; unsigned char *p = (unsigned char *)ber->ber_ptr;
int llen = *p++ & 0x7f; int llen = *p++ & 0x7f;
if (llen > (int)sizeof(ber_len_t)) { if (llen > (int)sizeof(ber_len_t)) {
errno = ERANGE; sock_errset(ERANGE);
return LBER_DEFAULT; return LBER_DEFAULT;
} }
/* Not enough bytes? */ /* Not enough bytes? */
if (ber->ber_rwptr - (char *)p < llen) { if (ber->ber_rwptr - (char *)p < llen) {
#if defined( EWOULDBLOCK ) #if defined( EWOULDBLOCK )
errno = EWOULDBLOCK; sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN ) #elif defined( EAGAIN )
errno = EAGAIN; sock_errset(EAGAIN);
#endif #endif
return LBER_DEFAULT; return LBER_DEFAULT;
} }
@ -601,7 +601,7 @@ ber_get_next(
/* make sure length is reasonable */ /* make sure length is reasonable */
if ( ber->ber_len == 0 ) { if ( ber->ber_len == 0 ) {
errno = ERANGE; sock_errset(ERANGE);
return LBER_DEFAULT; return LBER_DEFAULT;
} }
@ -609,7 +609,7 @@ ber_get_next(
ber_log_printf( LDAP_DEBUG_CONNS, ber->ber_debug, ber_log_printf( LDAP_DEBUG_CONNS, ber->ber_debug,
"ber_get_next: sockbuf_max_incoming exceeded " "ber_get_next: sockbuf_max_incoming exceeded "
"(%ld > %ld)\n", ber->ber_len, sb->sb_max_incoming ); "(%ld > %ld)\n", ber->ber_len, sb->sb_max_incoming );
errno = ERANGE; sock_errset(ERANGE);
return LBER_DEFAULT; return LBER_DEFAULT;
} }
@ -620,7 +620,7 @@ ber_get_next(
* already read. * already read.
*/ */
if ( ber->ber_len < sblen + l ) { if ( ber->ber_len < sblen + l ) {
errno = ERANGE; sock_errset(ERANGE);
return LBER_DEFAULT; return LBER_DEFAULT;
} }
ber->ber_buf = (char *) ber_memalloc_x( ber->ber_len + 1, ber->ber_memctx ); 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; to_go = ber->ber_end - ber->ber_rwptr;
assert( to_go > 0 ); assert( to_go > 0 );
errno = 0; sock_errset(0);
res = ber_int_sb_read( sb, ber->ber_rwptr, to_go ); res = ber_int_sb_read( sb, ber->ber_rwptr, to_go );
if (res<=0) return LBER_DEFAULT; if (res<=0) return LBER_DEFAULT;
ber->ber_rwptr+=res; ber->ber_rwptr+=res;
if (res<to_go) { if (res<to_go) {
#if defined( EWOULDBLOCK ) #if defined( EWOULDBLOCK )
errno = EWOULDBLOCK; sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN ) #elif defined( EAGAIN )
errno = EAGAIN; sock_errset(EAGAIN);
#endif #endif
return LBER_DEFAULT; return LBER_DEFAULT;
} }

View file

@ -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) * 32-bit Windows Socket API (under Windows NT or Windows 95)
*/ */
{ return recv( sbiod->sbiod_sb->sb_fd, buf, len, 0 );
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;
}
#elif defined( HAVE_NCSA ) #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) * 32-bit Windows Socket API (under Windows NT or Windows 95)
*/ */
{ return send( sbiod->sbiod_sb->sb_fd, buf, len, 0 );
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;
}
#elif defined(HAVE_NCSA) #elif defined(HAVE_NCSA)
return netwrite( sbiod->sbiod_sb->sb_fd, buf, len ); 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 ); ret = LBER_SBIOD_READ_NEXT( sbiod, buf, len );
if (sbiod->sbiod_sb->sb_debug & LDAP_DEBUG_PACKETS) { if (sbiod->sbiod_sb->sb_debug & LDAP_DEBUG_PACKETS) {
int err = errno; int err = sock_errno();
if ( ret < 0 ) { if ( ret < 0 ) {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug, ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%sread: want=%ld error=%s\n", (char *)sbiod->sbiod_pvt, "%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 { } else {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug, ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%sread: want=%ld, got=%ld\n", (char *)sbiod->sbiod_pvt, "%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, ber_log_bprint( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
(const char *)buf, ret ); (const char *)buf, ret );
} }
errno = err; sock_errset(err);
} }
return ret; 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 ); ret = LBER_SBIOD_WRITE_NEXT( sbiod, buf, len );
if (sbiod->sbiod_sb->sb_debug & LDAP_DEBUG_PACKETS) { if (sbiod->sbiod_sb->sb_debug & LDAP_DEBUG_PACKETS) {
int err = errno; int err = sock_errno();
if ( ret < 0 ) { if ( ret < 0 ) {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug, ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%swrite: want=%ld error=%s\n", "%swrite: want=%ld error=%s\n",
(char *)sbiod->sbiod_pvt, (long)len, (char *)sbiod->sbiod_pvt, (long)len,
AC_STRERROR_R( errno, ebuf, sizeof ebuf ) ); AC_STRERROR_R( err, ebuf, sizeof ebuf ) );
} else { } else {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug, ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%swrite: want=%ld, written=%ld\n", "%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, ber_log_bprint( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
(const char *)buf, ret ); (const char *)buf, ret );
} }
errno = err; sock_errset(err);
} }
return ret; return ret;

View file

@ -161,7 +161,7 @@ sb_sasl_setup( Sockbuf_IO_Desc *sbiod, void *arg )
ber_pvt_sb_buf_init( &p->buf_out ); ber_pvt_sb_buf_init( &p->buf_out );
if ( ber_pvt_sb_grow_buffer( &p->sec_buf_in, SASL_MIN_BUFF_SIZE ) < 0 ) { if ( ber_pvt_sb_grow_buffer( &p->sec_buf_in, SASL_MIN_BUFF_SIZE ) < 0 ) {
LBER_FREE( p ); LBER_FREE( p );
errno = ENOMEM; sock_errset(ENOMEM);
return -1; return -1;
} }
sasl_getprop( p->sasl_context, SASL_MAXOUTBUF, 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 ) && if ( ( p->sec_buf_in.buf_size < (ber_len_t) ret ) &&
ber_pvt_sb_grow_buffer( &p->sec_buf_in, ret ) < 0 ) ber_pvt_sb_grow_buffer( &p->sec_buf_in, ret ) < 0 )
{ {
errno = ENOMEM; sock_errset(ENOMEM);
return -1; return -1;
} }
p->sec_buf_in.buf_end = ret; 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, ber_log_printf( LDAP_DEBUG_ANY, sbiod->sbiod_sb->sb_debug,
"sb_sasl_read: failed to decode packet: %s\n", "sb_sasl_read: failed to decode packet: %s\n",
sasl_errstring( ret, NULL, NULL ) ); sasl_errstring( ret, NULL, NULL ) );
errno = EIO; sock_errset(EIO);
return -1; return -1;
} }
@ -356,7 +356,7 @@ sb_sasl_write( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
/* Still have something left?? */ /* Still have something left?? */
if ( p->buf_out.buf_ptr != p->buf_out.buf_end ) { if ( p->buf_out.buf_ptr != p->buf_out.buf_end ) {
errno = EAGAIN; sock_errset(EAGAIN);
return -1; 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, ber_log_printf( LDAP_DEBUG_ANY, sbiod->sbiod_sb->sb_debug,
"sb_sasl_write: failed to encode packet: %s\n", "sb_sasl_write: failed to encode packet: %s\n",
sasl_errstring( ret, NULL, NULL ) ); sasl_errstring( ret, NULL, NULL ) );
errno = EIO; sock_errset(EIO);
return -1; return -1;
} }
p->buf_out.buf_end = p->buf_out.buf_size; p->buf_out.buf_end = p->buf_out.buf_size;

View file

@ -63,7 +63,7 @@ do { \
static void static void
ldap_pvt_set_errno(int err) ldap_pvt_set_errno(int err)
{ {
errno = err; sock_errset(err);
} }
int int
@ -208,7 +208,7 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
struct sockaddr *sin, socklen_t addrlen, struct sockaddr *sin, socklen_t addrlen,
int async) int async)
{ {
int rc; int rc, err;
struct timeval tv = { 0 }, struct timeval tv = { 0 },
*opt_tv = NULL; *opt_tv = NULL;
@ -241,11 +241,8 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
return ( 0 ); return ( 0 );
} }
#ifdef HAVE_WINSOCK err = sock_errno();
ldap_pvt_set_errno( WSAGetLastError() ); if ( err != EINPROGRESS && err != EWOULDBLOCK ) {
#endif
if ( errno != EINPROGRESS && errno != EWOULDBLOCK ) {
return ( -1 ); return ( -1 );
} }

View file

@ -150,7 +150,7 @@ ldap_int_flush_request(
LDAPConn *lc = lr->lr_conn; LDAPConn *lc = lr->lr_conn;
if ( ber_flush2( lc->lconn_sb, lr->lr_ber, LBER_FLUSH_FREE_NEVER ) != 0 ) { 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 */ /* need to continue write later */
lr->lr_status = LDAP_REQST_WRITING; lr->lr_status = LDAP_REQST_WRITING;
ldap_mark_select_write( ld, lc->lconn_sb ); ldap_mark_select_write( ld, lc->lconn_sb );

View file

@ -322,13 +322,13 @@ wait4msg(
if ( rc == -1 ) { if ( rc == -1 ) {
Debug( LDAP_DEBUG_TRACE, Debug( LDAP_DEBUG_TRACE,
"ldap_int_select returned -1: errno %d\n", "ldap_int_select returned -1: errno %d\n",
errno, 0, 0 ); sock_errno(), 0, 0 );
} }
#endif #endif
if ( rc == 0 || ( rc == -1 && ( if ( rc == 0 || ( rc == -1 && (
!LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART) !LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART)
|| errno != EINTR ) ) ) || sock_errno() != EINTR ) ) )
{ {
ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN : ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN :
LDAP_TIMEOUT); LDAP_TIMEOUT);
@ -471,7 +471,7 @@ retry:
assert( LBER_VALID (ber) ); assert( LBER_VALID (ber) );
/* get the next message */ /* get the next message */
errno = 0; sock_errset(0);
#ifdef LDAP_CONNECTIONLESS #ifdef LDAP_CONNECTIONLESS
if ( LDAP_IS_UDP(ld) ) { if ( LDAP_IS_UDP(ld) ) {
struct sockaddr from; struct sockaddr from;
@ -496,10 +496,10 @@ nextresp3:
"ber_get_next failed.\n", 0, 0, 0 ); "ber_get_next failed.\n", 0, 0, 0 );
#endif #endif
#ifdef EWOULDBLOCK #ifdef EWOULDBLOCK
if ( errno == EWOULDBLOCK ) return LDAP_MSG_X_KEEP_LOOKING; if ( sock_errno() == EWOULDBLOCK ) return LDAP_MSG_X_KEEP_LOOKING;
#endif #endif
#ifdef EAGAIN #ifdef EAGAIN
if ( errno == EAGAIN ) return LDAP_MSG_X_KEEP_LOOKING; if ( sock_errno() == EAGAIN ) return LDAP_MSG_X_KEEP_LOOKING;
#endif #endif
ld->ld_errno = LDAP_SERVER_DOWN; ld->ld_errno = LDAP_SERVER_DOWN;
return -1; return -1;

View file

@ -594,7 +594,7 @@ sb_tls_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
err = SSL_get_error( p->ssl, ret ); err = SSL_get_error( p->ssl, ret );
if (err == SSL_ERROR_WANT_READ ) { if (err == SSL_ERROR_WANT_READ ) {
sbiod->sbiod_sb->sb_trans_needs_read = 1; sbiod->sbiod_sb->sb_trans_needs_read = 1;
errno = EWOULDBLOCK; sock_errset(EWOULDBLOCK);
} }
else else
sbiod->sbiod_sb->sb_trans_needs_read = 0; 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 ); err = SSL_get_error( p->ssl, ret );
if (err == SSL_ERROR_WANT_WRITE ) { if (err == SSL_ERROR_WANT_WRITE ) {
sbiod->sbiod_sb->sb_trans_needs_write = 1; sbiod->sbiod_sb->sb_trans_needs_write = 1;
errno = EWOULDBLOCK; sock_errset(EWOULDBLOCK);
} else { } else {
sbiod->sbiod_sb->sb_trans_needs_write = 0; 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 ); BIO_clear_retry_flags( b );
if ( ret < 0 ) { if ( ret < 0 ) {
int err = errno; int err = sock_errno();
if ( err == EAGAIN || err == EWOULDBLOCK ) { if ( err == EAGAIN || err == EWOULDBLOCK ) {
BIO_set_retry_read( b ); 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 ); BIO_clear_retry_flags( b );
if ( ret < 0 ) { if ( ret < 0 ) {
int err = errno; int err = sock_errno();
if ( err == EAGAIN || err == EWOULDBLOCK ) { if ( err == EAGAIN || err == EWOULDBLOCK ) {
BIO_set_retry_write( b ); BIO_set_retry_write( b );
} }

View file

@ -1483,7 +1483,7 @@ connection_input( Connection *conn )
return -1; return -1;
} }
errno = 0; sock_errset(0);
#ifdef LDAP_CONNECTIONLESS #ifdef LDAP_CONNECTIONLESS
if ( conn->c_is_udp ) { if ( conn->c_is_udp ) {
@ -1503,7 +1503,7 @@ connection_input( Connection *conn )
tag = ber_get_next( conn->c_sb, &len, conn->c_currentber ); tag = ber_get_next( conn->c_sb, &len, conn->c_currentber );
if ( tag != LDAP_TAG_MESSAGE ) { if ( tag != LDAP_TAG_MESSAGE ) {
int err = errno; int err = sock_errno();
ber_socket_t sd; ber_socket_t sd;
ber_sockbuf_ctrl( conn->c_sb, LBER_SB_OPT_GET_FD, &sd ); ber_sockbuf_ctrl( conn->c_sb, LBER_SB_OPT_GET_FD, &sd );

View file

@ -170,7 +170,7 @@ static long send_ldap_ber(
break; break;
} }
err = errno; err = sock_errno();
/* /*
* we got an error. if it's ewouldblock, we need to * we got an error. if it's ewouldblock, we need to