mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-03-13 14:27:59 +08:00
don't risk using dangling pointers when looping thru connections (ITS#4405)
This commit is contained in:
parent
4a071da8c2
commit
41ceb4af9d
@ -239,7 +239,7 @@ wait4msg(
|
||||
*tvp;
|
||||
time_t start_time = 0;
|
||||
time_t tmp_time;
|
||||
LDAPConn *lc, *nextlc;
|
||||
LDAPConn *lc;
|
||||
|
||||
assert( ld != NULL );
|
||||
assert( result != NULL );
|
||||
@ -297,8 +297,7 @@ wait4msg(
|
||||
#ifdef LDAP_R_COMPILE
|
||||
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex );
|
||||
#endif
|
||||
for ( lc = ld->ld_conns; lc != NULL; lc = nextlc ) {
|
||||
nextlc = lc->lconn_next;
|
||||
for ( lc = ld->ld_conns; lc != NULL; lc = lc->lconn_next ) {
|
||||
if ( ber_sockbuf_ctrl( lc->lconn_sb,
|
||||
LBER_SB_OPT_DATA_READY, NULL ) )
|
||||
{
|
||||
@ -354,10 +353,10 @@ wait4msg(
|
||||
ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
|
||||
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex );
|
||||
#endif
|
||||
for ( lc = ld->ld_conns; rc == LDAP_MSG_X_KEEP_LOOKING && lc != NULL;
|
||||
lc = nextlc )
|
||||
for ( lc = ld->ld_conns;
|
||||
rc == LDAP_MSG_X_KEEP_LOOKING && lc != NULL;
|
||||
lc = lc->lconn_next )
|
||||
{
|
||||
nextlc = lc->lconn_next;
|
||||
if ( lc->lconn_status == LDAP_CONNST_CONNECTED &&
|
||||
ldap_is_read_ready( ld, lc->lconn_sb ) )
|
||||
{
|
||||
@ -365,10 +364,17 @@ wait4msg(
|
||||
ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex );
|
||||
#endif
|
||||
rc = try_read1msg( ld, msgid, all, &lc, result );
|
||||
if ( lc == NULL ) lc = nextlc;
|
||||
#ifdef LDAP_R_COMPILE
|
||||
ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex );
|
||||
#endif
|
||||
if ( lc == NULL ) {
|
||||
/* if lc gets free()'d,
|
||||
* there's no guarantee
|
||||
* lc->lconn_next is still
|
||||
* sane; better restart
|
||||
* (ITS#4405) */
|
||||
lc = ld->ld_conns;
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef LDAP_R_COMPILE
|
||||
|
Loading…
x
Reference in New Issue
Block a user