From: Howard Chu Date: Thu, 14 Sep 2006 06:35:34 +0000 (+0000) Subject: ITS#4606 errno is not per-thread on WIN32, always use WSAGet/SetLastError X-Git-Tag: OPENLDAP_REL_ENG_2_3_MP~145 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=57c329a3af4843a3b02c9b19ed194c3a2825593b;p=openldap ITS#4606 errno is not per-thread on WIN32, always use WSAGet/SetLastError (with notable exceptions: ignore tests for EINTR which winsock never sets) --- diff --git a/configure b/configure index 83f1233fd8..2657cd8e1c 100755 --- a/configure +++ b/configure @@ -16032,7 +16032,7 @@ cat >>conftest.$ac_ext <<_ACEOF #include #include #include -#ifdef WINNT +#ifdef _WIN32 #include #endif int @@ -16397,7 +16397,7 @@ cat >>conftest.$ac_ext <<_ACEOF #include #include #include -#ifdef WINNT +#ifdef _WIN32 #include #endif int diff --git a/include/ac/socket.h b/include/ac/socket.h index 5aac4fe448..384a80aa3b 100644 --- a/include/ac/socket.h +++ b/include/ac/socket.h @@ -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)); diff --git a/libraries/liblber/io.c b/libraries/liblber/io.c index 730d05d4fd..b697acee1f 100644 --- a/libraries/liblber/io.c +++ b/libraries/liblber/io.c @@ -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 (ressbiod_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; diff --git a/libraries/libldap/cyrus.c b/libraries/libldap/cyrus.c index 936f44d35b..52ade28cac 100644 --- a/libraries/libldap/cyrus.c +++ b/libraries/libldap/cyrus.c @@ -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; diff --git a/libraries/libldap/os-ip.c b/libraries/libldap/os-ip.c index 3f428ae980..9f85e800ac 100644 --- a/libraries/libldap/os-ip.c +++ b/libraries/libldap/os-ip.c @@ -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 ); } diff --git a/libraries/libldap/request.c b/libraries/libldap/request.c index 219d2c0b01..1357707c27 100644 --- a/libraries/libldap/request.c +++ b/libraries/libldap/request.c @@ -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 ); diff --git a/libraries/libldap/result.c b/libraries/libldap/result.c index 0d9a429fd1..1720b85df9 100644 --- a/libraries/libldap/result.c +++ b/libraries/libldap/result.c @@ -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; diff --git a/libraries/libldap/tls.c b/libraries/libldap/tls.c index fc2e31d55a..49cd184595 100644 --- a/libraries/libldap/tls.c +++ b/libraries/libldap/tls.c @@ -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 ); } diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 6afc81bbc6..5311091545 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -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 ); diff --git a/servers/slapd/result.c b/servers/slapd/result.c index c6ec836159..0cde942a2c 100644 --- a/servers/slapd/result.c +++ b/servers/slapd/result.c @@ -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