diff --git a/auth/ldap/auth.php b/auth/ldap/auth.php index cd9e347d4bb..b3015d4e20f 100644 --- a/auth/ldap/auth.php +++ b/auth/ldap/auth.php @@ -698,8 +698,8 @@ class auth_plugin_ldap extends auth_plugin_base { array_push($contexts, $this->config->create_context); } - $ldap_pagedresults = ldap_paged_results_supported($this->config->ldap_version, $ldapconnection); - $ldap_cookie = ''; + $ldappagedresults = ldap_paged_results_supported($this->config->ldap_version, $ldapconnection); + $ldapcookie = ''; foreach ($contexts as $context) { $context = trim($context); if (empty($context)) { @@ -707,23 +707,28 @@ class auth_plugin_ldap extends auth_plugin_base { } do { - if ($ldap_pagedresults) { - ldap_control_paged_result($ldapconnection, $this->config->pagesize, true, $ldap_cookie); + if ($ldappagedresults) { + ldap_control_paged_result($ldapconnection, $this->config->pagesize, true, $ldapcookie); } if ($this->config->search_sub) { // Use ldap_search to find first user from subtree. - $ldap_result = ldap_search($ldapconnection, $context, $filter, array($this->config->user_attribute)); + $ldapresult = ldap_search($ldapconnection, $context, $filter, array($this->config->user_attribute)); } else { // Search only in this context. - $ldap_result = ldap_list($ldapconnection, $context, $filter, array($this->config->user_attribute)); + $ldapresult = ldap_list($ldapconnection, $context, $filter, array($this->config->user_attribute)); } - if(!$ldap_result) { + if (!$ldapresult) { continue; } - if ($ldap_pagedresults) { - ldap_control_paged_result_response($ldapconnection, $ldap_result, $ldap_cookie); + if ($ldappagedresults) { + $pagedresp = ldap_control_paged_result_response($ldapconnection, $ldapresult, $ldapcookie); + // Function ldap_control_paged_result_response() does not overwrite $ldapcookie if it fails, by + // setting this to null we avoid an infinite loop. + if ($pagedresp === false) { + $ldapcookie = null; + } } - if ($entry = @ldap_first_entry($ldapconnection, $ldap_result)) { + if ($entry = @ldap_first_entry($ldapconnection, $ldapresult)) { do { $value = ldap_get_values_len($ldapconnection, $entry, $this->config->user_attribute); $value = core_text::convert($value[0], $this->config->ldapencoding, 'utf-8'); @@ -731,13 +736,13 @@ class auth_plugin_ldap extends auth_plugin_base { $this->ldap_bulk_insert($value); } while ($entry = ldap_next_entry($ldapconnection, $entry)); } - unset($ldap_result); // Free mem. - } while ($ldap_pagedresults && $ldap_cookie !== null && $ldap_cookie != ''); + unset($ldapresult); // Free mem. + } while ($ldappagedresults && $ldapcookie !== null && $ldapcookie != ''); } // If LDAP paged results were used, the current connection must be completely // closed and a new one created, to work without paged results from here on. - if ($ldap_pagedresults) { + if ($ldappagedresults) { $this->ldap_close(true); $ldapconnection = $this->ldap_connect(); }