8a659d
From 0f700cf71f5531fb6c863990216aa1eb88970dc8 Mon Sep 17 00:00:00 2001
8a659d
From: Alexander Bokovoy <abokovoy@redhat.com>
8a659d
Date: Wed, 16 Jun 2021 11:08:21 +0300
8a659d
Subject: [PATCH] back-sch-nss: only loop if asked to try again
8a659d
8a659d
slapi-nis uses sss-idmap library to discover user group membership.  Its
8a659d
sss_nss_getgrouplist_timeout() function can return timeout errors as
8a659d
well which might cause a busy looping.  sss_nss_getgrouplist_timeout()
8a659d
will return ERANGE which is translated by slapi-nis to NSS_STATUS_TRYAGAIN.
8a659d
8a659d
Fixes: rhbz#1967179
8a659d
8a659d
Signed-off-by: Alexander Bokovoy <abokovoy@redhat.com>
8a659d
---
8a659d
 src/back-sch-nss.c | 13 ++++++++-----
8a659d
 1 file changed, 8 insertions(+), 5 deletions(-)
8a659d
8a659d
diff --git a/src/back-sch-nss.c b/src/back-sch-nss.c
8a659d
index df04a96..b595f3b 100644
8a659d
--- a/src/back-sch-nss.c
8a659d
+++ b/src/back-sch-nss.c
8a659d
@@ -589,19 +589,22 @@ repeat:
8a659d
 		return NULL;
8a659d
 	}
8a659d
 
8a659d
-	do {
8a659d
+	for(rc = NSS_STATUS_TRYAGAIN; rc == NSS_STATUS_TRYAGAIN;) {
8a659d
 		rc = backend_nss_getgrouplist(ctx, user_name, pwd.pw_gid,
8a659d
 					      grouplist, &ngroups,
8a659d
 					      &lerrno);
8a659d
-		if ((rc != NSS_STATUS_SUCCESS)) {
8a659d
-			tmp_list = realloc(grouplist, ngroups * sizeof(gid_t));
8a659d
-			if (tmp_list == NULL) {
8a659d
+		if (rc == NSS_STATUS_TRYAGAIN) {
8a659d
+			tmp_list = NULL;
8a659d
+			if (lerrno == ERANGE) {
8a659d
+				tmp_list = realloc(grouplist, ngroups * sizeof(gid_t));
8a659d
+			}
8a659d
+			if ((tmp_list == NULL) || (lerrno == ENOMEM)) {
8a659d
 				free(grouplist);
8a659d
 				return NULL;
8a659d
 			}
8a659d
 			grouplist = tmp_list;
8a659d
 		}
8a659d
-	} while (rc != NSS_STATUS_SUCCESS);
8a659d
+	}
8a659d
 
8a659d
 	entries = calloc(ngroups + 1, sizeof(entries[0]));
8a659d
 	if (entries == NULL) {
8a659d
-- 
8a659d
2.31.1
8a659d