diff --git a/libraries/libldap/sort.c b/libraries/libldap/sort.c index 579cb35e32..2e5c09e021 100644 --- a/libraries/libldap/sort.c +++ b/libraries/libldap/sort.c @@ -92,20 +92,36 @@ ldap_sort_entries( int (*cmp) (LDAP_CONST char *, LDAP_CONST char *) ) { - int i, count; + int i, count = 0; struct entrything *et; - LDAPMessage *e, *last; + LDAPMessage *e, *ehead = NULL, *etail = NULL; + LDAPMessage *ohead = NULL, *otail = NULL; LDAPMessage **ep; assert( ld != NULL ); - count = ldap_count_entries( ld, *chain ); + /* Separate entries from non-entries */ + for ( e = *chain; e; e=e->lm_chain ) { + if ( e->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) { + count++; + if ( !ehead ) ehead = e; + if ( etail ) etail->lm_chain = e; + etail = e; + } else { + if ( !ohead ) ohead = e; + if ( otail ) otail->lm_chain = e; + otail = e; + } + } - if ( count < 0 ) { - return -1; - - } else if ( count < 2 ) { + if ( count < 2 ) { /* zero or one entries -- already sorted! */ + if ( ehead ) { + etail->lm_chain = ohead; + *chain = ehead; + } else { + *chain = ohead; + } return 0; } @@ -115,7 +131,7 @@ ldap_sort_entries( return( -1 ); } - e = *chain; + e = ehead; for ( i = 0; i < count; i++ ) { et[i].et_cmp_fn = cmp; et[i].et_msg = e; @@ -131,7 +147,6 @@ ldap_sort_entries( e = e->lm_chain; } - last = e; qsort( et, count, sizeof(struct entrything), et_cmp ); @@ -142,7 +157,8 @@ ldap_sort_entries( LDAP_VFREE( et[i].et_vals ); } - *ep = last; + *ep = ohead; + LDAP_FREE( (char *) et ); return( 0 ); diff --git a/tests/data/referrals.out b/tests/data/referrals.out index 1ed2e49b5d..4fac149bb5 100644 --- a/tests/data/referrals.out +++ b/tests/data/referrals.out @@ -93,6 +93,9 @@ result: 0 Success # requesting: 1.1 # +# University of Michigan, US +dn: o=University of Michigan,c=US + # search reference ref: ldap://hostA/o=abc,c=us??base ref: ldap://hostB/o=ABC,c=US??base @@ -100,9 +103,6 @@ ref: ldap://hostB/o=ABC,c=US??base # search reference ref: ldap://hostC/o=xyz,c=us??base -# University of Michigan, US -dn: o=University of Michigan,c=US - # search result search: 2 result: 0 Success @@ -118,6 +118,15 @@ result: 0 Success # requesting: 1.1 # +# Manager, University of Michigan, US +dn: cn=Manager,o=University of Michigan,c=US + +# University of Michigan, US +dn: o=University of Michigan,c=US + +# US +dn: c=US + # search reference ref: ldap://hostA/o=abc,c=us??sub ref: ldap://hostB/o=ABC,c=US??sub @@ -125,15 +134,6 @@ ref: ldap://hostB/o=ABC,c=US??sub # search reference ref: ldap://hostC/o=xyz,c=us??sub -# US -dn: c=US - -# University of Michigan, US -dn: o=University of Michigan,c=US - -# Manager, University of Michigan, US -dn: cn=Manager,o=University of Michigan,c=US - # search result search: 2 result: 0 Success