This is a multi-part message in MIME format.
--------------060206020501030606090605
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Try this instead.

Howard Chu wrote:
> Please test the attached patch and see if the problem is resolved, thanks.
>


-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

--------------060206020501030606090605
Content-Type: text/plain; charset=UTF-8;
 name="diff.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="diff.txt"

diff --git a/libraries/libldap/ldap-int.h b/libraries/libldap/ldap-int.h
index c558d2a..ad37250 100644
--- a/libraries/libldap/ldap-int.h
+++ b/libraries/libldap/ldap-int.h
@@ -622,6 +622,7 @@ LDAP_F (void) ldap_free_select_info( void *sip );
 LDAP_F (void) ldap_mark_select_write( LDAP *ld, Sockbuf *sb );
 LDAP_F (void) ldap_mark_select_read( LDAP *ld, Sockbuf *sb );
 LDAP_F (void) ldap_mark_select_clear( LDAP *ld, Sockbuf *sb );
+LDAP_F (void) ldap_clear_select_write( LDAP *ld, Sockbuf *sb );
 LDAP_F (int) ldap_is_read_ready( LDAP *ld, Sockbuf *sb );
 LDAP_F (int) ldap_is_write_ready( LDAP *ld, Sockbuf *sb );
 
diff --git a/libraries/libldap/open.c b/libraries/libldap/open.c
index 6b92ba6..a920953 100644
--- a/libraries/libldap/open.c
+++ b/libraries/libldap/open.c
@@ -344,7 +344,6 @@ ldap_init_fd(
 
        /* Add the connection to the *LDAP's select pool */
        ldap_mark_select_read( ld, conn->lconn_sb );
-       ldap_mark_select_write( ld, conn->lconn_sb );
        
        *ldp = ld;
        return LDAP_SUCCESS;
@@ -502,7 +501,6 @@ ldap_open_internal_connection( LDAP **ldp, ber_socket_t 
*fdp )
 
        /* Add the connection to the *LDAP's select pool */
        ldap_mark_select_read( ld, c->lconn_sb );
-       ldap_mark_select_write( ld, c->lconn_sb );
 
        /* Make this connection an LDAP V3 protocol connection */
        rc = LDAP_VERSION3;
diff --git a/libraries/libldap/os-ip.c b/libraries/libldap/os-ip.c
index daa765e..2864256 100644
--- a/libraries/libldap/os-ip.c
+++ b/libraries/libldap/os-ip.c
@@ -966,6 +966,32 @@ ldap_mark_select_clear( LDAP *ld, Sockbuf *sb )
 #endif
 }
 
+void
+ldap_clear_select_write( LDAP *ld, Sockbuf *sb )
+{
+       struct selectinfo       *sip;
+       ber_socket_t            sd;
+
+       sip = (struct selectinfo *)ld->ld_selectinfo;
+
+       ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_FD, &sd );
+
+#ifdef HAVE_POLL
+       /* for UNIX poll(2) */
+       {
+               int i;
+               for(i=0; i < sip->si_maxfd; i++) {
+                       if( sip->si_fds[i].fd == sd ) {
+                               sip->si_fds[i].events &= ~POLL_WRITE;
+                       }
+               }
+       }
+#else
+       /* for UNIX select(2) */
+       FD_CLR( sd, &sip->si_writefds );
+#endif
+}
+
 
 int
 ldap_is_write_ready( LDAP *ld, Sockbuf *sb )
diff --git a/libraries/libldap/request.c b/libraries/libldap/request.c
index 88190a2..071391d 100644
--- a/libraries/libldap/request.c
+++ b/libraries/libldap/request.c
@@ -202,6 +202,7 @@ ldap_int_flush_request(
 
                /* sent -- waiting for a response */
                ldap_mark_select_read( ld, lc->lconn_sb );
+               ldap_clear_select_write( ld, lc->lconn_sb );
        }
        return 0;
 }
diff --git a/libraries/libldap/result.c b/libraries/libldap/result.c
index b6e8e75..7241df9 100644
--- a/libraries/libldap/result.c
+++ b/libraries/libldap/result.c
@@ -302,7 +302,7 @@ wait4msg(
                                if ( ber_sockbuf_ctrl( lc->lconn_sb,
                                        LBER_SB_OPT_DATA_READY, NULL ) )
                                {
-                                       lc_ready = 1;
+                                       lc_ready = 2;   /* ready at ber level, 
not socket level */
                                        break;
                                }
                        }
@@ -373,8 +373,8 @@ wait4msg(
                                        }
                                }
                                LDAP_MUTEX_UNLOCK( &ld->ld_req_mutex );
-                               /* Quit looping if no one handled any events */
-                               if (!serviced)
+                               /* Quit looping if no one handled any socket 
events */
+                               if (!serviced && lc_ready == 1)
                                        rc = -1;
                        }
                        LDAP_MUTEX_UNLOCK( &ld->ld_conn_mutex );

--------------060206020501030606090605--


Reply via email to