autofs-5.0.1 - fix paged query more results check From: Ian Kent <raven@themaw.net> When getting paged results from an LDAP server the server returns an opaque cookie (of type berval) that is used to retrieve the next page. The criteria for deciding if there are more pages is that the berval value is non-null and has a non-zero length. To determine if the berval value has non-zero length autofs checks the strlen() of the value but on ppc64 and s390x this can return 0 even if the value has non-zero length causing a premature termination of the query. Fix this by also checking the berval length field. Also make sure we free the opaque cookie when the query is finished. --- modules/lookup_ldap.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) --- autofs-5.0.1.orig/modules/lookup_ldap.c +++ autofs-5.0.1/modules/lookup_ldap.c @@ -2052,7 +2052,8 @@ do_paged: rv = ldap_parse_page_control(sp->ldap, returnedControls, &sp->totalCount, &sp->cookie); - if (sp->cookie && sp->cookie->bv_val && strlen(sp->cookie->bv_val)) + if (sp->cookie && sp->cookie->bv_val && + (strlen(sp->cookie->bv_val) || sp->cookie->bv_len)) sp->morePages = TRUE; else sp->morePages = FALSE; @@ -2385,6 +2386,10 @@ static int read_one_map(struct autofs_po rv == LDAP_SIZELIMIT_EXCEEDED) { if (sp.result) ldap_msgfree(sp.result); + if (sp.cookie) { + ber_bvfree(sp.cookie); + sp.cookie = NULL; + } sp.pageSize = sp.pageSize / 2; if (sp.pageSize < 5) { debug(ap->logopt, MODPREFIX @@ -2400,6 +2405,8 @@ static int read_one_map(struct autofs_po if (rv != LDAP_SUCCESS || !sp.result) { unbind_ldap_connection(ap->logopt, sp.ldap, ctxt); *result_ldap = rv; + if (sp.cookie) + ber_bvfree(sp.cookie); free(sp.query); return NSS_STATUS_UNAVAIL; } @@ -2409,6 +2416,8 @@ static int read_one_map(struct autofs_po ldap_msgfree(sp.result); unbind_ldap_connection(ap->logopt, sp.ldap, ctxt); *result_ldap = rv; + if (sp.cookie) + ber_bvfree(sp.cookie); free(sp.query); return NSS_STATUS_NOTFOUND; } @@ -2420,6 +2429,8 @@ static int read_one_map(struct autofs_po unbind_ldap_connection(ap->logopt, sp.ldap, ctxt); source->age = age; + if (sp.cookie) + ber_bvfree(sp.cookie); free(sp.query); return NSS_STATUS_SUCCESS;