From 0f700cf71f5531fb6c863990216aa1eb88970dc8 Mon Sep 17 00:00:00 2001 From: Alexander Bokovoy Date: Jun 16 2021 08:08:21 +0000 Subject: [PATCH 1/2] back-sch-nss: only loop if asked to try again slapi-nis uses sss-idmap library to discover user group membership. Its sss_nss_getgrouplist_timeout() function can return timeout errors as well which might cause a busy looping. sss_nss_getgrouplist_timeout() will return ERANGE which is translated by slapi-nis to NSS_STATUS_TRYAGAIN. Fixes: rhbz#1967179 Signed-off-by: Alexander Bokovoy --- diff --git a/src/back-sch-nss.c b/src/back-sch-nss.c index df04a96..b595f3b 100644 --- a/src/back-sch-nss.c +++ b/src/back-sch-nss.c @@ -589,19 +589,22 @@ repeat: return NULL; } - do { + for(rc = NSS_STATUS_TRYAGAIN; rc == NSS_STATUS_TRYAGAIN;) { rc = backend_nss_getgrouplist(ctx, user_name, pwd.pw_gid, grouplist, &ngroups, &lerrno); - if ((rc != NSS_STATUS_SUCCESS)) { - tmp_list = realloc(grouplist, ngroups * sizeof(gid_t)); - if (tmp_list == NULL) { + if (rc == NSS_STATUS_TRYAGAIN) { + tmp_list = NULL; + if (lerrno == ERANGE) { + tmp_list = realloc(grouplist, ngroups * sizeof(gid_t)); + } + if ((tmp_list == NULL) || (lerrno == ENOMEM)) { free(grouplist); return NULL; } grouplist = tmp_list; } - } while (rc != NSS_STATUS_SUCCESS); + } entries = calloc(ngroups + 1, sizeof(entries[0])); if (entries == NULL) { From faa4dafcaec9df7851d1d7af40595b37215d5559 Mon Sep 17 00:00:00 2001 From: Alexander Bokovoy Date: Jun 16 2021 08:11:05 +0000 Subject: [PATCH 2/2] back-sch-nss: use tabs instead of spaces Signed-off-by: Alexander Bokovoy --- diff --git a/src/back-sch-nss.c b/src/back-sch-nss.c index b595f3b..45cbb43 100644 --- a/src/back-sch-nss.c +++ b/src/back-sch-nss.c @@ -790,8 +790,8 @@ backend_retrieve_from_nsswitch(struct backend_staged_search *staged, if ((staged->type == SCH_NSSWITCH_GROUP) && (NULL != staged->name)) { entries = backend_retrieve_group_entry_from_nsswitch(staged->name, staged->is_id, - staged->container_sdn, - cbdata, &staged->count); + staged->container_sdn, + cbdata, &staged->count); if (entries != NULL) { staged->entries = entries; return TRUE; @@ -801,8 +801,8 @@ backend_retrieve_from_nsswitch(struct backend_staged_search *staged, if ((staged->type == SCH_NSSWITCH_USER) && (NULL != staged->name)) { entries = backend_retrieve_user_entry_from_nsswitch(staged->name, staged->is_id, - staged->container_sdn, - cbdata, &staged->count); + staged->container_sdn, + cbdata, &staged->count); if (entries != NULL) { staged->entries = entries; return TRUE;