summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2011-10-28 17:03:03 +0200
committerStephen Gallagher <sgallagh@redhat.com>2011-10-31 08:04:36 -0400
commit25e0627808739981c27b96ad761e863c302aa1a2 (patch)
tree903fa298f893ef692c90210c0b595e956d582545 /src
parent7923209b738b591fc01ccfee2cfca4ecfb7cd6dd (diff)
downloadsssd-25e0627808739981c27b96ad761e863c302aa1a2.tar.gz
sssd-25e0627808739981c27b96ad761e863c302aa1a2.tar.xz
sssd-25e0627808739981c27b96ad761e863c302aa1a2.zip
RFC2307bis initgroups: fix nested groups processing
Due to incorrectly written loop, SSSD would go into infitite loop if it processed the same group on two different levels of membership.
Diffstat (limited to 'src')
-rw-r--r--src/providers/ldap/sdap_async_accounts.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/src/providers/ldap/sdap_async_accounts.c b/src/providers/ldap/sdap_async_accounts.c
index ba4cfe644..ccfafa1fb 100644
--- a/src/providers/ldap/sdap_async_accounts.c
+++ b/src/providers/ldap/sdap_async_accounts.c
@@ -4881,17 +4881,23 @@ static void rfc2307bis_nested_groups_process(struct tevent_req *subreq)
* Move on to the next group
*/
state->group_iter++;
- if (state->group_iter < state->num_groups) {
- do {
- ret = rfc2307bis_nested_groups_step(req);
- if (ret != EOK && ret != EAGAIN) {
- tevent_req_error(req, ret);
- return;
- }
- } while (ret == EOK);
+ while (state->group_iter < state->num_groups) {
+ ret = rfc2307bis_nested_groups_step(req);
+ if (ret == EAGAIN) {
+ /* Looking up parent groups.. */
+ return;
+ } else if (ret != EOK) {
+ tevent_req_error(req, ret);
+ return;
+ }
+
/* EOK means this group has already been processed
- * in another level */
- } else {
+ * in another nesting level */
+ state->group_iter++;
+ }
+
+ if (state->group_iter == state->num_groups) {
+ /* All groups processed. Done. */
tevent_req_done(req);
}
return;
@@ -4936,18 +4942,25 @@ static void rfc2307bis_nested_groups_done(struct tevent_req *subreq)
}
state->group_iter++;
- if (state->group_iter < state->num_groups) {
- do {
- ret = rfc2307bis_nested_groups_step(req);
- if (ret != EOK && ret != EAGAIN) {
- tevent_req_error(req, ret);
- return;
- }
- } while (ret == EOK);
+ while (state->group_iter < state->num_groups) {
+ ret = rfc2307bis_nested_groups_step(req);
+ if (ret == EAGAIN) {
+ /* Looking up parent groups.. */
+ return;
+ } else if (ret != EOK) {
+ tevent_req_error(req, ret);
+ return;
+ }
+
/* EOK means this group has already been processed
- * in another level */
- } else {
+ * in another nesting level */
+ state->group_iter++;
+ }
+
+ if (state->group_iter == state->num_groups) {
+ /* All groups processed. Done. */
tevent_req_done(req);
+ return;
}
}