summaryrefslogtreecommitdiff
path: root/source3/libads
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2002-03-19 12:58:38 +0000
committerAndrew Tridgell <tridge@samba.org>2002-03-19 12:58:38 +0000
commitf464ceb109bc9bdc288e0219c4b83da15ba6f1fc (patch)
tree8e88a3e7cfec30c357f70f1b0796ef1a90e055a3 /source3/libads
parent3bc3a3163931021517d7c551e4a0d0730b7b33ad (diff)
downloadsamba-f464ceb109bc9bdc288e0219c4b83da15ba6f1fc.tar.gz
samba-f464ceb109bc9bdc288e0219c4b83da15ba6f1fc.tar.bz2
samba-f464ceb109bc9bdc288e0219c4b83da15ba6f1fc.zip
fixed paged controls on my box. The problem seems to be incorrect
referrals parsing in the openldap libs. By disabling referrals we get valid controls back and the cookies work. (This used to be commit 8bf487ddff240150d7a92aaa0f978dd30062c331)
Diffstat (limited to 'source3/libads')
-rw-r--r--source3/libads/ldap.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c
index 28970e8fa9..8d865dd113 100644
--- a/source3/libads/ldap.c
+++ b/source3/libads/ldap.c
@@ -66,6 +66,7 @@ ADS_STATUS ads_connect(ADS_STRUCT *ads)
return ads_sasl_bind(ads);
}
+
/* Do a search with paged results. cookie must be null on the first
call, and then returned on each subsequent call. It will be null
again when the entire search is complete */
@@ -96,10 +97,10 @@ ADS_STATUS ads_do_paged_search(ADS_STRUCT *ads, const char *bind_path,
berelem = ber_alloc_t(LBER_USE_DER);
if (cookie && *cookie) {
- ber_printf(berelem, "{iO}", (ber_int_t) 256, *cookie);
+ ber_printf(berelem, "{iO}", (ber_int_t) 1000, *cookie);
ber_bvfree(*cookie); /* don't need it from last time */
} else {
- ber_printf(berelem, "{io}", (ber_int_t) 256, "", 0);
+ ber_printf(berelem, "{io}", (ber_int_t) 1000, "", 0);
}
ber_flatten(berelem, &berval);
PagedResults.ldctl_oid = ADS_PAGE_CTL_OID;
@@ -111,17 +112,33 @@ ADS_STATUS ads_do_paged_search(ADS_STRUCT *ads, const char *bind_path,
controls[1] = NULL;
*res = NULL;
-
+
+ /* we need to disable referrals as the openldap libs don't
+ seem to handle them correctly. They result in the result
+ record containing the server control being removed from the
+ result list (tridge) */
+ ldap_set_option(ads->ld, LDAP_OPT_REFERRALS, LDAP_OPT_OFF);
+
rc = ldap_search_ext_s(ads->ld, bind_path, scope, exp,
(char **) attrs, 0, controls, NULL,
NULL, LDAP_NO_LIMIT,
(LDAPMessage **)res);
+
+ if (rc) {
+ DEBUG(3,("ldap_search_ext_s(%s) -> %s\n", exp, ldap_err2string(rc)));
+ return ADS_ERROR(rc);
+ }
+
ber_free(berelem, 1);
ber_bvfree(berval);
-
+
rc = ldap_parse_result(ads->ld, *res, NULL, NULL, NULL,
NULL, &rcontrols, 0);
+ if (!rcontrols) {
+ return ADS_ERROR(rc);
+ }
+
for (cur_control=rcontrols[0]; cur_control; cur_control++) {
if (strcmp(ADS_PAGE_CTL_OID, cur_control->ldctl_oid) == 0) {
berelem = ber_init(&cur_control->ldctl_value);