Resolves: rhbz#1494002 - sssd_nss crashed in cache_req_search_domains_next

This commit is contained in:
Lukas Slebodnik 2017-11-21 17:52:58 +01:00
parent 87763840cd
commit ce65f7d9ee
5 changed files with 360 additions and 162 deletions

View File

@ -0,0 +1,171 @@
From caae0e53e6091806634943699f4398b6a20273b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michal=20=C5=BDidek?= <mzidek@redhat.com>
Date: Mon, 13 Nov 2017 16:15:21 +0100
Subject: [PATCH] TESTS: Order list of entries in some lists
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Some tests started to fail because we depended on specific
order of users in groups or messages in ldb results to be
returned and that order changed.
This patch adds a simple helper functions into these tests
that order the entries before comparison with expected results.
more deterministic.
Resolves:
https://pagure.io/SSSD/sssd/issue/3563
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
---
src/tests/cmocka/test_nss_srv.c | 22 +++++++++++++++++++
src/tests/cmocka/test_sysdb_views.c | 42 ++++++++++++++++++++++++++++++++-----
2 files changed, 59 insertions(+), 5 deletions(-)
diff --git a/src/tests/cmocka/test_nss_srv.c b/src/tests/cmocka/test_nss_srv.c
index 6aa726153183b5a871a75d398727ea7132358ca6..21bd80fb7f6562f6a31452bac6a26c109fef4cb1 100644
--- a/src/tests/cmocka/test_nss_srv.c
+++ b/src/tests/cmocka/test_nss_srv.c
@@ -585,6 +585,25 @@ static errno_t delete_group(struct nss_test_ctx *ctx,
return ret;
}
+static int cmp_func(const void *a, const void *b)
+{
+ char *str1 = *(char **)discard_const(a);
+ char *str2 = *(char **)discard_const(b);
+
+ return strcmp(str1, str2);
+}
+
+static void order_string_array(char **_list, int size)
+{
+ if (size < 2 || _list == NULL || *_list == NULL) {
+ /* Nothing to do */
+ return;
+ }
+
+ qsort(_list, size, sizeof(char *), cmp_func);
+ return;
+}
+
static void assert_groups_equal(struct group *expected,
struct group *gr, const int nmem)
{
@@ -594,6 +613,9 @@ static void assert_groups_equal(struct group *expected,
assert_string_equal(gr->gr_name, expected->gr_name);
assert_string_equal(gr->gr_passwd, expected->gr_passwd);
+ order_string_array(gr->gr_mem, nmem);
+ order_string_array(expected->gr_mem, nmem);
+
for (i = 0; i < nmem; i++) {
assert_string_equal(gr->gr_mem[i], expected->gr_mem[i]);
}
diff --git a/src/tests/cmocka/test_sysdb_views.c b/src/tests/cmocka/test_sysdb_views.c
index 0378254b4440b29c3182faf2adde8c3db8a4ce97..dd3eb50f9310ff925734dcf51a669d08a638aefd 100644
--- a/src/tests/cmocka/test_sysdb_views.c
+++ b/src/tests/cmocka/test_sysdb_views.c
@@ -22,6 +22,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
@@ -612,6 +613,31 @@ static int test_enum_users_setup(void **state)
return 0;
}
+static int cmp_func(const void *a, const void *b)
+{
+ const char *str1;
+ const char *str2;
+ struct ldb_message *msg1 = *(struct ldb_message **)discard_const(a);
+ struct ldb_message *msg2 = *(struct ldb_message **)discard_const(b);
+
+ str1 = ldb_msg_find_attr_as_string(msg1, SYSDB_NAME, NULL);
+ str2 = ldb_msg_find_attr_as_string(msg2, SYSDB_NAME, NULL);
+
+ return strcmp(str1, str2);
+}
+
+/* Make the order of ldb results deterministic */
+static void order_ldb_res_msgs(struct ldb_result *res)
+{
+ if (res == NULL || res->count < 2) {
+ /* Nothing to do */
+ return;
+ }
+
+ qsort(res->msgs, res->count, sizeof(struct ldb_message *), cmp_func);
+ return;
+}
+
static void assert_user_attrs(struct ldb_message *msg,
struct sss_domain_info *dom,
const char *shortname,
@@ -660,8 +686,9 @@ static void check_enumpwent(int ret, struct sss_domain_info *dom,
assert_int_equal(ret, EOK);
assert_int_equal(res->count, N_ELEMENTS(users)-1);
- assert_user_attrs(res->msgs[0], dom, "barney", views);
- assert_user_attrs(res->msgs[1], dom, "alice", views);
+ order_ldb_res_msgs(res);
+ assert_user_attrs(res->msgs[0], dom, "alice", views);
+ assert_user_attrs(res->msgs[1], dom, "barney", views);
assert_user_attrs(res->msgs[2], dom, "bob", views);
}
@@ -703,6 +730,7 @@ static void test_sysdb_enumpwent_filter(void **state)
ret = sysdb_enumpwent_filter(test_ctx, test_ctx->domain, "b*", 0, &res);
assert_int_equal(ret, EOK);
assert_int_equal(res->count, 2);
+ order_ldb_res_msgs(res);
assert_user_attrs(res->msgs[0], test_ctx->domain, "barney", false);
assert_user_attrs(res->msgs[1], test_ctx->domain, "bob", false);
@@ -749,6 +777,7 @@ static void test_sysdb_enumpwent_filter_views(void **state)
"b*", NULL, &res);
assert_int_equal(ret, EOK);
assert_int_equal(res->count, 2);
+ order_ldb_res_msgs(res);
assert_user_attrs(res->msgs[0], test_ctx->domain, "barney", true);
assert_user_attrs(res->msgs[1], test_ctx->domain, "bob", true);
@@ -896,10 +925,11 @@ static void check_enumgrent(int ret, struct sss_domain_info *dom,
{
assert_int_equal(ret, EOK);
assert_int_equal(res->count, N_ELEMENTS(groups)-1);
- assert_group_attrs(res->msgs[0], dom, "three",
- views ? TEST_GID_OVERRIDE_BASE + 2 : 0);
- assert_group_attrs(res->msgs[1], dom, "one",
+ order_ldb_res_msgs(res);
+ assert_group_attrs(res->msgs[0], dom, "one",
views ? TEST_GID_OVERRIDE_BASE : 0);
+ assert_group_attrs(res->msgs[1], dom, "three",
+ views ? TEST_GID_OVERRIDE_BASE + 2 : 0);
assert_group_attrs(res->msgs[2], dom, "two",
views ? TEST_GID_OVERRIDE_BASE + 1 : 0);
}
@@ -942,6 +972,7 @@ static void test_sysdb_enumgrent_filter(void **state)
ret = sysdb_enumgrent_filter(test_ctx, test_ctx->domain, "t*", 0, &res);
assert_int_equal(ret, EOK);
assert_int_equal(res->count, 2);
+ order_ldb_res_msgs(res);
assert_group_attrs(res->msgs[0], test_ctx->domain, "three", 0);
assert_group_attrs(res->msgs[1], test_ctx->domain, "two", 0);
@@ -988,6 +1019,7 @@ static void test_sysdb_enumgrent_filter_views(void **state)
"t*", NULL, &res);
assert_int_equal(ret, EOK);
assert_int_equal(res->count, 2);
+ order_ldb_res_msgs(res);
assert_group_attrs(res->msgs[0], test_ctx->domain,
"three", TEST_GID_OVERRIDE_BASE + 2);
assert_group_attrs(res->msgs[1], test_ctx->domain, "two",
--
2.15.0

View File

@ -0,0 +1,141 @@
From 0f44eefe2ce75a0814c8688495477f6c57f3d39a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= <fidencio@redhat.com>
Date: Fri, 20 Oct 2017 09:26:43 +0200
Subject: [PATCH] CACHE_REQ: Copy the cr_domain list for each request
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Let's copy the cr_domain list for each request as this list may be
free'd due to a refresh domains request.
Resolves: https://pagure.io/SSSD/sssd/issue/3551
Signed-off-by: Fabiano Fidêncio <fidencio@redhat.com>
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
---
src/responder/common/cache_req/cache_req.c | 14 +++++++--
src/responder/common/cache_req/cache_req_domain.c | 38 +++++++++++++++++++++++
src/responder/common/cache_req/cache_req_domain.h | 5 +++
3 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c
index abcb9cba351b06e833bacde26a504e5ee3445528..5fed7a2ab8beded2fee91f679a12f9a0ff6013ec 100644
--- a/src/responder/common/cache_req/cache_req.c
+++ b/src/responder/common/cache_req/cache_req.c
@@ -699,6 +699,7 @@ struct cache_req_state {
const char *domain_name;
/* work data */
+ struct cache_req_domain *cr_domains;
struct cache_req_result **results;
size_t num_results;
bool first_iteration;
@@ -953,6 +954,7 @@ static errno_t cache_req_select_domains(struct tevent_req *req,
bool bypass_cache;
bool bypass_dp;
bool search;
+ errno_t ret;
state = tevent_req_data(req, struct cache_req_state);
@@ -964,12 +966,20 @@ static errno_t cache_req_select_domains(struct tevent_req *req,
return EOK;
}
+ ret = cache_req_domain_copy_cr_domains(state,
+ state->cr->rctx->cr_domains,
+ &state->cr_domains);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "cache_req_copy_cr_domains() failed\n");
+ return EINVAL;
+ }
+
if (domain_name != NULL) {
CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, state->cr,
"Performing a single domain search\n");
cr_domain = cache_req_domain_get_domain_by_name(
- state->cr->rctx->cr_domains, domain_name);
+ state->cr_domains, domain_name);
if (cr_domain == NULL) {
return ERR_DOMAIN_NOT_FOUND;
}
@@ -978,7 +988,7 @@ static errno_t cache_req_select_domains(struct tevent_req *req,
CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, state->cr,
"Performing a multi-domain search\n");
- cr_domain = state->cr->rctx->cr_domains;
+ cr_domain = state->cr_domains;
check_next = true;
}
diff --git a/src/responder/common/cache_req/cache_req_domain.c b/src/responder/common/cache_req/cache_req_domain.c
index 7b58f7c94a77881429f870bc5162fb2fe0aa57c6..15893ba548f6d0e3979010d6d5bbf27441d5fa97 100644
--- a/src/responder/common/cache_req/cache_req_domain.c
+++ b/src/responder/common/cache_req/cache_req_domain.c
@@ -47,6 +47,44 @@ cache_req_domain_get_domain_by_name(struct cache_req_domain *domains,
return ret;
}
+errno_t
+cache_req_domain_copy_cr_domains(TALLOC_CTX *mem_ctx,
+ struct cache_req_domain *src,
+ struct cache_req_domain **_dest)
+{
+ struct cache_req_domain *cr_domains = NULL;
+ struct cache_req_domain *cr_domain;
+ struct cache_req_domain *iter;
+ errno_t ret;
+
+ if (src == NULL) {
+ return EINVAL;
+ }
+
+ DLIST_FOR_EACH(iter, src) {
+ cr_domain = talloc_zero(mem_ctx, struct cache_req_domain);
+ if (cr_domain == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ cr_domain->domain = iter->domain;
+ cr_domain->fqnames = iter->fqnames;
+
+ DLIST_ADD_END(cr_domains, cr_domain, struct cache_req_domain *);
+ }
+
+ *_dest = cr_domains;
+ ret = EOK;
+
+done:
+ if (ret != EOK) {
+ cache_req_domain_list_zfree(&cr_domains);
+ }
+
+ return ret;
+}
+
void cache_req_domain_list_zfree(struct cache_req_domain **cr_domains)
{
struct cache_req_domain *p, *q, *r;
diff --git a/src/responder/common/cache_req/cache_req_domain.h b/src/responder/common/cache_req/cache_req_domain.h
index 3780a5d8d88d76e100738d28d1dd0e697edf5eae..ebdc71dd635d5d8a5d06e30e96c5d4101b6d98bf 100644
--- a/src/responder/common/cache_req/cache_req_domain.h
+++ b/src/responder/common/cache_req/cache_req_domain.h
@@ -50,6 +50,11 @@ cache_req_domain_new_list_from_domain_resolution_order(
const char *domain_resolution_order,
struct cache_req_domain **_cr_domains);
+errno_t
+cache_req_domain_copy_cr_domains(TALLOC_CTX *mem_ctx,
+ struct cache_req_domain *src,
+ struct cache_req_domain **_dest);
+
void cache_req_domain_list_zfree(struct cache_req_domain **cr_domains);
--
2.15.0

View File

@ -0,0 +1,41 @@
From 3f2845f98ad28e57cf6a2a3ce33ff01d417c4a45 Mon Sep 17 00:00:00 2001
From: Lukas Slebodnik <lslebodn@fedoraproject.org>
Date: Tue, 21 Nov 2017 17:48:16 +0100
Subject: [PATCH] KCM: temporary increase hardcoded buffers
Temporary workaround:
https://pagure.io/SSSD/sssd/issue/3386
---
src/responder/kcm/kcmsrv_ops.c | 2 +-
src/util/tev_curl.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/responder/kcm/kcmsrv_ops.c b/src/responder/kcm/kcmsrv_ops.c
index 7a78e9d6b36b4aa3d31ad467216244f733f4a57b..5af567c0d19d347e28cdeada22d15807fb8bc0d5 100644
--- a/src/responder/kcm/kcmsrv_ops.c
+++ b/src/responder/kcm/kcmsrv_ops.c
@@ -31,7 +31,7 @@
#include "responder/kcm/kcmsrv_ops.h"
#include "responder/kcm/kcmsrv_ccache.h"
-#define KCM_REPLY_MAX 16384
+#define KCM_REPLY_MAX 131072
struct kcm_op_ctx {
struct kcm_resp_ctx *kcm_data;
diff --git a/src/util/tev_curl.c b/src/util/tev_curl.c
index 4c2f1ec9ff0127ccfd72010460ed75dad43e9ce3..a51003f4118d4dc0dcb697469b861d277cd1b917 100644
--- a/src/util/tev_curl.c
+++ b/src/util/tev_curl.c
@@ -35,7 +35,7 @@
#include "util/tev_curl.h"
#define TCURL_IOBUF_CHUNK 1024
-#define TCURL_IOBUF_MAX 16384
+#define TCURL_IOBUF_MAX 131072
static bool global_is_curl_initialized;
--
2.15.0

View File

@ -1,160 +0,0 @@
From 7a68d005503df7f650d6ff987714b2c5d50bb9d7 Mon Sep 17 00:00:00 2001
From: Lukas Slebodnik <lslebodn@fedoraproject.org>
Date: Sat, 21 Oct 2017 16:05:04 +0200
Subject: [PATCH] tests/cmocka: Fix unit tests with libldb 1.3.0
---
src/tests/cmocka/test_nss_srv.c | 32 ++++++++++++++++----------------
src/tests/cmocka/test_sysdb_views.c | 32 ++++++++++++++++----------------
2 files changed, 32 insertions(+), 32 deletions(-)
diff --git a/src/tests/cmocka/test_nss_srv.c b/src/tests/cmocka/test_nss_srv.c
index ccedf96beaecfaa4232bbe456d5e5a8394098483..1fc2e545ae5c9811953c5a6e4f9c97c6fb948473 100644
--- a/src/tests/cmocka/test_nss_srv.c
+++ b/src/tests/cmocka/test_nss_srv.c
@@ -1738,13 +1738,13 @@ static int test_nss_getgrnam_check_mix_dom(uint32_t status,
tmp_ctx = talloc_new(nss_test_ctx);
assert_non_null(tmp_ctx);
- exp_members[0] = sss_tc_fqname(tmp_ctx,
+ exp_members[0] = testmember1.pw_name;
+ exp_members[1] = testmember2.pw_name;
+ exp_members[2] = sss_tc_fqname(tmp_ctx,
nss_test_ctx->subdom->names,
nss_test_ctx->subdom,
submember1.pw_name);
- assert_non_null(exp_members[0]);
- exp_members[1] = testmember1.pw_name;
- exp_members[2] = testmember2.pw_name;
+ assert_non_null(exp_members[2]);
assert_int_equal(status, EOK);
@@ -1830,19 +1830,13 @@ static int test_nss_getgrnam_check_mix_dom_fqdn(uint32_t status,
tmp_ctx = talloc_new(nss_test_ctx);
assert_non_null(tmp_ctx);
- exp_members[0] = sss_tc_fqname(tmp_ctx,
- nss_test_ctx->subdom->names,
- nss_test_ctx->subdom,
- submember1.pw_name);
- assert_non_null(exp_members[0]);
-
if (nss_test_ctx->tctx->dom->fqnames) {
- exp_members[1] = sss_tc_fqname(tmp_ctx, nss_test_ctx->tctx->dom->names,
+ exp_members[0] = sss_tc_fqname(tmp_ctx, nss_test_ctx->tctx->dom->names,
nss_test_ctx->tctx->dom, testmember1.pw_name);
- assert_non_null(exp_members[1]);
- exp_members[2] = sss_tc_fqname(tmp_ctx, nss_test_ctx->tctx->dom->names,
+ assert_non_null(exp_members[0]);
+ exp_members[1] = sss_tc_fqname(tmp_ctx, nss_test_ctx->tctx->dom->names,
nss_test_ctx->tctx->dom, testmember2.pw_name);
- assert_non_null(exp_members[2]);
+ assert_non_null(exp_members[1]);
expected.gr_name = sss_tc_fqname(tmp_ctx,
nss_test_ctx->tctx->dom->names,
@@ -1850,11 +1844,17 @@ static int test_nss_getgrnam_check_mix_dom_fqdn(uint32_t status,
testgroup_members.gr_name);
assert_non_null(expected.gr_name);
} else {
- exp_members[1] = testmember1.pw_name;
- exp_members[2] = testmember2.pw_name;
+ exp_members[0] = testmember1.pw_name;
+ exp_members[1] = testmember2.pw_name;
expected.gr_name = testgroup_members.gr_name;
}
+ exp_members[2] = sss_tc_fqname(tmp_ctx,
+ nss_test_ctx->subdom->names,
+ nss_test_ctx->subdom,
+ submember1.pw_name);
+ assert_non_null(exp_members[2]);
+
assert_int_equal(status, EOK);
ret = parse_group_packet(body, blen, &gr, &nmem);
diff --git a/src/tests/cmocka/test_sysdb_views.c b/src/tests/cmocka/test_sysdb_views.c
index 0378254b4440b29c3182faf2adde8c3db8a4ce97..3fb5211826e798c105b710894409c17e338a7b66 100644
--- a/src/tests/cmocka/test_sysdb_views.c
+++ b/src/tests/cmocka/test_sysdb_views.c
@@ -660,9 +660,9 @@ static void check_enumpwent(int ret, struct sss_domain_info *dom,
assert_int_equal(ret, EOK);
assert_int_equal(res->count, N_ELEMENTS(users)-1);
- assert_user_attrs(res->msgs[0], dom, "barney", views);
- assert_user_attrs(res->msgs[1], dom, "alice", views);
- assert_user_attrs(res->msgs[2], dom, "bob", views);
+ assert_user_attrs(res->msgs[0], dom, "alice", views);
+ assert_user_attrs(res->msgs[1], dom, "bob", views);
+ assert_user_attrs(res->msgs[2], dom, "barney", views);
}
static void test_sysdb_enumpwent(void **state)
@@ -703,8 +703,8 @@ static void test_sysdb_enumpwent_filter(void **state)
ret = sysdb_enumpwent_filter(test_ctx, test_ctx->domain, "b*", 0, &res);
assert_int_equal(ret, EOK);
assert_int_equal(res->count, 2);
- assert_user_attrs(res->msgs[0], test_ctx->domain, "barney", false);
- assert_user_attrs(res->msgs[1], test_ctx->domain, "bob", false);
+ assert_user_attrs(res->msgs[0], test_ctx->domain, "bob", false);
+ assert_user_attrs(res->msgs[1], test_ctx->domain, "barney", false);
ret = sysdb_enumpwent_filter(test_ctx, test_ctx->domain, "c*", 0, &res);
assert_int_equal(ret, EOK);
@@ -749,8 +749,8 @@ static void test_sysdb_enumpwent_filter_views(void **state)
"b*", NULL, &res);
assert_int_equal(ret, EOK);
assert_int_equal(res->count, 2);
- assert_user_attrs(res->msgs[0], test_ctx->domain, "barney", true);
- assert_user_attrs(res->msgs[1], test_ctx->domain, "bob", true);
+ assert_user_attrs(res->msgs[0], test_ctx->domain, "bob", true);
+ assert_user_attrs(res->msgs[1], test_ctx->domain, "barney", true);
addtl_filter = talloc_asprintf(test_ctx, "(%s<=%d)",
SYSDB_LAST_UPDATE, 1235);
@@ -896,12 +896,12 @@ static void check_enumgrent(int ret, struct sss_domain_info *dom,
{
assert_int_equal(ret, EOK);
assert_int_equal(res->count, N_ELEMENTS(groups)-1);
- assert_group_attrs(res->msgs[0], dom, "three",
- views ? TEST_GID_OVERRIDE_BASE + 2 : 0);
- assert_group_attrs(res->msgs[1], dom, "one",
+ assert_group_attrs(res->msgs[0], dom, "one",
views ? TEST_GID_OVERRIDE_BASE : 0);
- assert_group_attrs(res->msgs[2], dom, "two",
+ assert_group_attrs(res->msgs[1], dom, "two",
views ? TEST_GID_OVERRIDE_BASE + 1 : 0);
+ assert_group_attrs(res->msgs[2], dom, "three",
+ views ? TEST_GID_OVERRIDE_BASE + 2 : 0);
}
static void test_sysdb_enumgrent(void **state)
@@ -942,8 +942,8 @@ static void test_sysdb_enumgrent_filter(void **state)
ret = sysdb_enumgrent_filter(test_ctx, test_ctx->domain, "t*", 0, &res);
assert_int_equal(ret, EOK);
assert_int_equal(res->count, 2);
- assert_group_attrs(res->msgs[0], test_ctx->domain, "three", 0);
- assert_group_attrs(res->msgs[1], test_ctx->domain, "two", 0);
+ assert_group_attrs(res->msgs[0], test_ctx->domain, "two", 0);
+ assert_group_attrs(res->msgs[1], test_ctx->domain, "three", 0);
ret = sysdb_enumgrent_filter(test_ctx, test_ctx->domain, "x*", 0, &res);
assert_int_equal(ret, EOK);
@@ -988,10 +988,10 @@ static void test_sysdb_enumgrent_filter_views(void **state)
"t*", NULL, &res);
assert_int_equal(ret, EOK);
assert_int_equal(res->count, 2);
- assert_group_attrs(res->msgs[0], test_ctx->domain,
+ assert_group_attrs(res->msgs[0], test_ctx->domain, "two",
+ TEST_GID_OVERRIDE_BASE + 1);
+ assert_group_attrs(res->msgs[1], test_ctx->domain,
"three", TEST_GID_OVERRIDE_BASE + 2);
- assert_group_attrs(res->msgs[1], test_ctx->domain, "two",
- TEST_GID_OVERRIDE_BASE + 1);
addtl_filter = talloc_asprintf(test_ctx, "(%s<=%d)",
SYSDB_LAST_UPDATE, 1235);
--
2.14.2

View File

@ -29,7 +29,7 @@
Name: sssd
Version: 1.16.0
Release: 3%{?dist}
Release: 4%{?dist}
Group: Applications/System
Summary: System Security Services Daemon
License: GPLv3+
@ -49,10 +49,12 @@ Patch0008: 0008-NSS-add-support-for-SSS_NSS_EX_FLAG_INVALIDATE_CACHE.patch
Patch0009: 0009-NSS-TESTS-add-unit-tests-for-_EX-requests.patch
Patch0010: 0010-nss-idmap-add-timeout-version-of-old-sss_nss_-calls.patch
Patch0011: 0011-nss-idmap-allow-empty-buffer-with-SSS_NSS_EX_FLAG_IN.patch
Patch0012: 0012-TESTS-Order-list-of-entries-in-some-lists.patch
Patch0013: 0013-CACHE_REQ-Copy-the-cr_domain-list-for-each-request.patch
Patch0502: 0502-SYSTEMD-Use-capabilities.patch
Patch0503: 0503-Disable-stopping-idle-socket-activated-responders.patch
Patch0600: 0600-tests-cmocka-Fix-unit-tests-with-libldb-1.3.0.patch
Patch0504: 0504-KCM-temporary-increase-hardcoded-buffers.patch
### Dependencies ###
@ -1251,6 +1253,9 @@ fi
%{_libdir}/%{name}/modules/libwbclient.so
%changelog
* Tue Nov 21 2017 Lukas Slebodnik <lslebodn@fedoraproject.org> - 1.16.0-4
- Resolves: rhbz#1494002 - sssd_nss crashed in cache_req_search_domains_next
* Fri Nov 17 2017 Jakub Hrozek <jhrozek@redhat.com> - 1.16.0-3
- Backport extended NSS API from upstream master branch