]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/os-ip.c
Fix ITS#1843, don't deref NULL string in ldap_pvt_str2upper
[openldap] / libraries / libldap / os-ip.c
index f1bf7559a6b74d9f4fa5b87c9119770d55cf0351..0084743d8498fe922a32e9aade7835416abbe656 100644 (file)
@@ -1,6 +1,6 @@
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /*  Portions
@@ -130,6 +130,8 @@ ldap_int_prepare_socket(LDAP *ld, int s, int proto )
        return 0;
 }
 
+#ifndef HAVE_WINSOCK
+
 #undef TRACE
 #define TRACE do { \
        osip_debug(ld, \
@@ -150,7 +152,7 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s)
 #if defined( notyet ) /* && defined( SO_ERROR ) */
 {
        int so_errno;
-       int dummy = sizeof(so_errno);
+       socklen_t dummy = sizeof(so_errno);
        if ( getsockopt( s, SOL_SOCKET, SO_ERROR, &so_errno, &dummy )
                == AC_SOCKET_ERROR )
        {
@@ -168,15 +170,12 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s)
        /* error slippery */
        struct sockaddr_in sin;
        char ch;
-       int dummy = sizeof(sin);
+       socklen_t dummy = sizeof(sin);
        if ( getpeername( s, (struct sockaddr *) &sin, &dummy )
                == AC_SOCKET_ERROR )
        {
                /* XXX: needs to be replace with ber_stream_read() */
                read(s, &ch, 1);
-#ifdef HAVE_WINSOCK
-               ldap_pvt_set_errno( WSAGetLastError() );
-#endif
                TRACE;
                return -1;
        }
@@ -187,6 +186,8 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s)
 }
 #undef TRACE
 
+#endif /* HAVE_WINSOCK */
+
 static int
 ldap_pvt_connect(LDAP *ld, ber_socket_t s,
        struct sockaddr *sin, socklen_t addrlen,
@@ -262,15 +263,25 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
 #ifdef HAVE_WINSOCK
        /* This means the connection failed */
        if ( FD_ISSET(s, &efds) ) {
-           ldap_pvt_set_errno(WSAECONNREFUSED);
+           int so_errno;
+           int dummy = sizeof(so_errno);
+           if ( getsockopt( s, SOL_SOCKET, SO_ERROR,
+                       (char *) &so_errno, &dummy ) == AC_SOCKET_ERROR || !so_errno )
+           {
+               /* impossible */
+               so_errno = WSAGetLastError();
+           }
+           ldap_pvt_set_errno(so_errno);
            osip_debug(ld, "ldap_pvt_connect: error on socket %d: "
                       "errno: %d (%s)\n", s, errno, sock_errstr(errno));
            return -1;
        }
 #endif
        if ( FD_ISSET(s, &wfds) ) {
+#ifndef HAVE_WINSOCK
                if ( ldap_pvt_is_socket_ready(ld, s) == -1 )
                        return ( -1 );
+#endif
                if ( ldap_pvt_ndelay_off(ld, s) == -1 )
                        return ( -1 );
                return ( 0 );
@@ -298,7 +309,7 @@ int
 ldap_connect_to_host(LDAP *ld, Sockbuf *sb,
        int proto,
        const char *host,
-       unsigned long address, int port, int async)
+       unsigned long address, int port, int async )
 {
        struct sockaddr_in      sin;
        ber_socket_t            s = AC_SOCKET_INVALID;
@@ -307,13 +318,18 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb,
        char                    *ha_buf=NULL, *p, *q;
        int                     socktype;
 
-       osip_debug(ld, "ldap_connect_to_host: %s\n",host,0,0);
        
        switch(proto) {
-       case LDAP_PROTO_TCP: socktype = SOCK_STREAM; break;
-       case LDAP_PROTO_UDP: socktype = SOCK_DGRAM; break;
-       default: osip_debug(ld, "ldap_connect_to_host: unknown proto: %d\n",
-                               proto, 0, 0);
+       case LDAP_PROTO_TCP: socktype = SOCK_STREAM;
+               osip_debug(ld, "ldap_connect_to_host: TCP %s:%d\n",host,port,0);
+               break;
+       case LDAP_PROTO_UDP: socktype = SOCK_DGRAM;
+               osip_debug(ld, "ldap_connect_to_host: TCP %s:%d\n",host,port,0);
+               break;
+
+       default:
+               osip_debug(ld, "ldap_connect_to_host: unknown proto: %d\n",
+                       proto, 0, 0);
                return -1;
        }
 
@@ -327,8 +343,8 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb,
                hints.ai_family = AF_UNSPEC;
                hints.ai_socktype = socktype;
 
-               snprintf(serv, sizeof serv, "%d", ntohs(port));
-               if ( err = getaddrinfo(host, serv, &hints, &res) ) {
+               snprintf(serv, sizeof serv, "%d", port );
+               if ( ( err = getaddrinfo(host, serv, &hints, &res) ) ) {
                        osip_debug(ld, "ldap_connect_to_host: getaddrinfo failed: %s\n",
                                AC_GAI_STRERROR(err), 0, 0);
                        return -1;
@@ -410,7 +426,6 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb,
 
        rc = s = -1;
        for ( i = 0; !use_hp || (hp->h_addr_list[i] != 0); ++i, rc = -1 ) {
-
                s = ldap_int_socket( ld, PF_INET, socktype );
                if ( s == AC_SOCKET_INVALID ) {
                        /* use_hp ? continue : break; */
@@ -424,13 +439,13 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb,
 
                (void)memset((char *)&sin, '\0', sizeof(struct sockaddr_in));
                sin.sin_family = AF_INET;
-               sin.sin_port = port;
+               sin.sin_port = htons((short) port);
                p = (char *)&sin.sin_addr;
                q = use_hp ? (char *)hp->h_addr_list[i] : (char *)&address;
                AC_MEMCPY(p, q, sizeof(sin.sin_addr) );
 
                osip_debug(ld, "ldap_connect_to_host: Trying %s:%d\n", 
-                               inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),0);
+                       inet_ntoa(sin.sin_addr),port,0);
 
                rc = ldap_pvt_connect(ld, s,
                        (struct sockaddr *)&sin, sizeof(struct sockaddr_in),
@@ -662,11 +677,15 @@ ldap_int_ip_init( void )
 
 
 int
-do_ldap_select( LDAP *ld, struct timeval *timeout )
+ldap_int_select( LDAP *ld, struct timeval *timeout )
 {
        struct selectinfo       *sip;
 
-       Debug( LDAP_DEBUG_TRACE, "do_ldap_select\n", 0, 0, 0 );
+#ifdef NEW_LOGGING
+       LDAP_LOG (( "os-ip", LDAP_LEVEL_ENTRY, "ldap_int_select\n" ));
+#else
+       Debug( LDAP_DEBUG_TRACE, "ldap_int_select\n", 0, 0, 0 );
+#endif
 
        if ( ldap_int_tblsize == 0 )
                ldap_int_ip_init();