From: Kurt Zeilenga Date: Mon, 31 Jan 2005 16:53:39 +0000 (+0000) Subject: sync update X-Git-Tag: OPENLDAP_REL_ENG_2_2_24~38 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=b9710ce594a829f1cb00368fee5c6975b646554d;p=openldap sync update restart fix --- diff --git a/CHANGES b/CHANGES index 43d4455be6..f22e8dbe5d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ OpenLDAP 2.2 Change Log OpenLDAP 2.2.24 Engineering + Added libldap fast synchronous search result processing + Fixed libldap fdset re-init for restart (ITS#3524) OpenLDAP 2.2.23 Release Updated slapd extensibleMatch empty DN bug fix (ITS#3506) diff --git a/libraries/libldap/addentry.c b/libraries/libldap/addentry.c index 7b8cd08c4a..4edeb28aee 100644 --- a/libraries/libldap/addentry.c +++ b/libraries/libldap/addentry.c @@ -43,10 +43,15 @@ ldap_delete_result_entry( LDAPMessage **list, LDAPMessage *e ) if ( tmp == NULL ) return( NULL ); - if ( prev == NULL ) + if ( prev == NULL ) { + if ( tmp->lm_chain ) + tmp->lm_chain->lm_chain_tail = (*list)->lm_chain_tail; *list = tmp->lm_chain; - else + } else { prev->lm_chain = tmp->lm_chain; + if ( prev->lm_chain == NULL ) + (*list)->lm_chain_tail = prev; + } tmp->lm_chain = NULL; return( tmp ); @@ -59,5 +64,6 @@ ldap_add_result_entry( LDAPMessage **list, LDAPMessage *e ) assert( e != NULL ); e->lm_chain = *list; + e->lm_chain_tail = (*list)->lm_chain_tail; *list = e; } diff --git a/libraries/libldap/error.c b/libraries/libldap/error.c index f789f63363..8d74980d31 100644 --- a/libraries/libldap/error.c +++ b/libraries/libldap/error.c @@ -267,13 +267,24 @@ ldap_parse_result( ldap_pvt_thread_mutex_lock( &ld->ld_res_mutex ); #endif /* Find the next result... */ - for ( lm = r; lm != NULL; lm = lm->lm_chain ) { - /* skip over entries and references */ - if( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY && - lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE && - lm->lm_msgtype != LDAP_RES_INTERMEDIATE ) - { - break; + if ( r->lm_chain == NULL ) { + if ((r->lm_msgtype == LDAP_RES_SEARCH_ENTRY) || + (r->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) || + (r->lm_msgtype == LDAP_RES_INTERMEDIATE)) { + lm = NULL; + } else { + lm = r; + } + } else { + if ((r->lm_chain_tail->lm_chain->lm_msgtype + == LDAP_RES_SEARCH_ENTRY) || + (r->lm_chain_tail->lm_chain->lm_msgtype + == LDAP_RES_SEARCH_REFERENCE) || + (r->lm_chain_tail->lm_chain->lm_msgtype + == LDAP_RES_INTERMEDIATE)) { + lm = NULL; + } else { + lm = r->lm_chain_tail->lm_chain; } } @@ -380,15 +391,24 @@ ldap_parse_result( } /* Find the next result... */ - for ( lm = lm->lm_chain; lm != NULL; lm = lm->lm_chain ) { - /* skip over entries and references */ - if( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY && - lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE && - lm->lm_msgtype != LDAP_RES_INTERMEDIATE ) - { - /* more results to return */ - errcode = LDAP_MORE_RESULTS_TO_RETURN; - break; + lm = lm->lm_chain; + if ( lm ) { + if ( lm->lm_chain == NULL ) { + if ((lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY) && + (lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE) && + (lm->lm_msgtype != LDAP_RES_INTERMEDIATE)) { + /* more results to return */ + errcode = LDAP_MORE_RESULTS_TO_RETURN; + } + } else { + if ((lm->lm_chain_tail->lm_chain->lm_msgtype + != LDAP_RES_SEARCH_ENTRY) && + (lm->lm_chain_tail->lm_chain->lm_msgtype + != LDAP_RES_SEARCH_REFERENCE) && + (lm->lm_chain_tail->lm_chain->lm_msgtype + != LDAP_RES_INTERMEDIATE)) { + errcode = LDAP_MORE_RESULTS_TO_RETURN; + } } } } diff --git a/libraries/libldap/ldap-int.h b/libraries/libldap/ldap-int.h index cbaa57db8f..017b37c38f 100644 --- a/libraries/libldap/ldap-int.h +++ b/libraries/libldap/ldap-int.h @@ -134,6 +134,7 @@ struct ldapmsg { ber_tag_t lm_msgtype; /* the message type */ BerElement *lm_ber; /* the ber encoded message contents */ struct ldapmsg *lm_chain; /* for search - next msg in the resp */ + struct ldapmsg *lm_chain_tail; struct ldapmsg *lm_next; /* next response */ time_t lm_time; /* used to maintain cache */ }; diff --git a/libraries/libldap/os-ip.c b/libraries/libldap/os-ip.c index 572f79e725..b4276b5d6a 100644 --- a/libraries/libldap/os-ip.c +++ b/libraries/libldap/os-ip.c @@ -258,15 +258,15 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s, if ( async ) return ( -2 ); #endif - FD_ZERO(&wfds); - FD_SET(s, &wfds ); + do { + FD_ZERO(&wfds); + FD_SET(s, &wfds ); #ifdef HAVE_WINSOCK - FD_ZERO(&efds); - FD_SET(s, &efds ); + FD_ZERO(&efds); + FD_SET(s, &efds ); #endif - do { rc = select(ldap_int_tblsize, z, &wfds, #ifdef HAVE_WINSOCK &efds, diff --git a/libraries/libldap/result.c b/libraries/libldap/result.c index 1c48c338a7..37f6fe386e 100644 --- a/libraries/libldap/result.c +++ b/libraries/libldap/result.c @@ -191,12 +191,24 @@ chkResponseList( break; } - for ( tmp = lm; tmp != NULL; tmp = tmp->lm_chain ) { - if ( tmp->lm_msgtype != LDAP_RES_SEARCH_ENTRY - && tmp->lm_msgtype != LDAP_RES_SEARCH_REFERENCE - && tmp->lm_msgtype != LDAP_RES_INTERMEDIATE ) - { - break; + if ( lm->lm_chain == NULL ) { + if ((lm->lm_msgtype == LDAP_RES_SEARCH_ENTRY) || + (lm->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) || + (lm->lm_msgtype == LDAP_RES_INTERMEDIATE)) { + tmp = NULL; + } else { + tmp = lm; + } + } else { + if ((lm->lm_chain_tail->lm_chain->lm_msgtype + == LDAP_RES_SEARCH_ENTRY) || + (lm->lm_chain_tail->lm_chain->lm_msgtype + == LDAP_RES_SEARCH_REFERENCE) || + (lm->lm_chain_tail->lm_chain->lm_msgtype + == LDAP_RES_INTERMEDIATE)) { + tmp = NULL; + } else { + tmp = lm->lm_chain_tail->lm_chain; } } @@ -417,7 +429,7 @@ try_read1msg( LDAPMessage **result ) { BerElement *ber; - LDAPMessage *new, *l, *prev, *tmp; + LDAPMessage *new, *l, *prev, *tmp, *chain_head; ber_int_t id; ber_tag_t tag; ber_len_t len; @@ -891,8 +903,11 @@ lr->lr_res_matched ? lr->lr_res_matched : "" ); firstmsg = 0; new->lm_next = ld->ld_responses; ld->ld_responses = new; + new->lm_chain_tail = new; + chain_head = new; } else { tmp->lm_chain = new; + chain_head->lm_chain_tail = tmp; } tmp = new; /* "ok" means there's more to parse */ @@ -914,6 +929,7 @@ lr->lr_res_matched ? lr->lr_res_matched : "" ); * first response off the head of the chain. */ tmp->lm_chain = new; + chain_head->lm_chain_tail = tmp; *result = chkResponseList( ld, msgid, all ); ld->ld_errno = LDAP_SUCCESS; return( (*result)->lm_msgtype ); @@ -957,6 +973,7 @@ lr->lr_res_matched ? lr->lr_res_matched : "" ); new->lm_next = ld->ld_responses; ld->ld_responses = new; + new->lm_chain_tail = new; goto exit; } @@ -970,13 +987,31 @@ lr->lr_res_matched ? lr->lr_res_matched : "" ); #endif /* part of a search response - add to end of list of entries */ - for ( tmp = l; (tmp->lm_chain != NULL) && - ((tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY) || - (tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) || - (tmp->lm_chain->lm_msgtype == LDAP_RES_INTERMEDIATE )); - tmp = tmp->lm_chain ) - ; /* NULL */ - tmp->lm_chain = new; + if (l->lm_chain == NULL) { + if ((l->lm_msgtype == LDAP_RES_SEARCH_ENTRY) || + (l->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) || + (l->lm_msgtype == LDAP_RES_INTERMEDIATE)) { + /* do not advance lm_chain_tail in this case */ + l->lm_chain = new; + } else { + /*FIXME: ldap_msgfree( l );*/ + l = new; + l->lm_chain_tail = new; + } + } else { + if ((l->lm_chain_tail->lm_chain->lm_msgtype + == LDAP_RES_SEARCH_ENTRY) || + (l->lm_chain_tail->lm_chain->lm_msgtype + == LDAP_RES_SEARCH_REFERENCE) || + (l->lm_chain_tail->lm_chain->lm_msgtype + == LDAP_RES_INTERMEDIATE)) { + l->lm_chain_tail->lm_chain->lm_chain = new; + l->lm_chain_tail = l->lm_chain_tail->lm_chain; + } else { + /*FIXME: ldap_msgfree( l->lm_chain_tail->lm_chain );*/ + l->lm_chain_tail->lm_chain = new; + } + } /* return the whole chain if that's what we were looking for */ if ( foundit ) {