diff -cb ./ldap/servers/slapd/pagedresults.c ./ldap/servers/slapd/pagedresults.c.fix *** ./ldap/servers/slapd/pagedresults.c 2014-04-16 18:54:34.622001958 +0200 --- ./ldap/servers/slapd/pagedresults.c.fix 2014-04-15 13:49:26.408001975 +0200 *************** *** 124,137 **** --- 124,149 ---- *index = maxlen; /* the first position in the new area */ } else { for (i = 0; i < conn->c_pagedresults.prl_maxlen; i++) { + if (conn->c_pagedresults.prl_list[i].pr_flags & CONN_FLAG_PAGEDRESULTS_ABANDONED) { + rc=LDAP_CANCELLED; + break; + } else { if (!conn->c_pagedresults.prl_list[i].pr_current_be) { *index = i; break; } } } + } + if (rc != LDAP_CANCELLED) { conn->c_pagedresults.prl_count++; + /* even if there's no abandon, we should check a be has been + selected before taking this lock + */ + if (*index != -1) { conn->c_pagedresults.prl_list[*index].pr_mutex = PR_NewLock(); + } + } } else { /* Repeated paged results request. * PagedResults is already allocated. */ *************** *** 145,150 **** --- 157,163 ---- op->o_pagedresults_sizelimit = -1; slapi_ch_free((void **)&cookie.bv_val); + if (rc != LDAP_CANCELLED) { if ((*index > -1) && (*index < conn->c_pagedresults.prl_maxlen)) { if (conn->c_pagedresults.prl_list[*index].pr_flags & CONN_FLAG_PAGEDRESULTS_ABANDONED) { *************** *** 159,164 **** --- 172,178 ---- "pagedresults_parse_control_value: invalid cookie: %d\n", *index); } + } PR_Unlock(conn->c_mutex); LDAPDebug1Arg(LDAP_DEBUG_TRACE, [root@vm-163 389-ds-base-1.2.11.15]#