Commit a4570992 authored by Quanah Gibson-Mount's avatar Quanah Gibson-Mount
Browse files

ITS#5836,ITS#6089

parent e4644649
......@@ -15,8 +15,10 @@ OpenLDAP 2.4.17 Engineering
Fixed slapd bind race condition (ITS#6189)
Fixed slapd cancel behavior (ITS#6137)
Fixed slapd cert validation (ITS#6098)
Fixed slapd connection_destroy assert (ITS#6089)
Fixed slapd errno handling (ITS#6037)
Fixed slapd global alloc handling (ITS#6054)
Fixed slapd hung writers (ITS#5836)
Fixed slapd ldapi issues (ITS#6056)
Fixed slapd moduleload with static backends and modules (ITS#6016)
Fixed slapd normalization of updated schema attributes (ITS#5540)
......
......@@ -139,40 +139,46 @@ static long send_ldap_ber(
Connection *conn = op->o_conn;
ber_len_t bytes;
long ret = 0;
int closing = 0;
ber_get_option( ber, LBER_OPT_BER_BYTES_TO_WRITE, &bytes );
/* write only one pdu at a time - wait til it's our turn */
ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex );
if (( op->o_abandon && !op->o_cancel ) || !connection_valid( conn )) {
if (( op->o_abandon && !op->o_cancel ) || !connection_valid( conn ) ||
conn->c_writers < 0 ) {
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
return 0;
}
while ( conn->c_writers > 0 ) {
conn->c_writers++;
while ( conn->c_writers > 0 && conn->c_writing ) {
ldap_pvt_thread_cond_wait( &conn->c_write1_cv, &conn->c_write1_mutex );
}
/* connection was closed under us */
if ( conn->c_writers < 0 ) {
closing = 1;
/* we're the last waiter, let the closer continue */
if ( conn->c_writers == -1 )
ldap_pvt_thread_cond_signal( &conn->c_write1_cv );
}
conn->c_writers++;
if ( closing ) {
conn->c_writers++;
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
return 0;
}
/* Our turn */
conn->c_writing = 1;
/* write the pdu */
while( 1 ) {
int err;
/* lock the connection */
if ( ldap_pvt_thread_mutex_trylock( &conn->c_mutex )) {
if ( !connection_valid(conn)) {
ret = 0;
break;
}
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex );
if ( conn->c_writers < 0 ) {
......@@ -201,6 +207,7 @@ static long send_ldap_ber(
if ( err != EWOULDBLOCK && err != EAGAIN ) {
conn->c_writers--;
conn->c_writing = 0;
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
connection_closing( conn, "connection lost on write" );
......@@ -225,6 +232,7 @@ static long send_ldap_ber(
}
}
conn->c_writing = 0;
if ( conn->c_writers < 0 ) {
conn->c_writers++;
if ( !conn->c_writers )
......
......@@ -2810,6 +2810,7 @@ struct Connection {
BerElement *c_currentber; /* ber we're attempting to read */
int c_writers; /* number of writers waiting */
char c_writing; /* someone is writing */
char c_sasl_bind_in_progress; /* multi-op bind in progress */
char c_writewaiter; /* true if blocked on write */
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment