99 lines
3.7 KiB
Diff
99 lines
3.7 KiB
Diff
From a74f42e33fd62be175c30574242a214cdce14b06 Mon Sep 17 00:00:00 2001
|
|
From: Pavel Reichl <preichl@redhat.com>
|
|
Date: Wed, 8 Jul 2015 09:01:24 -0400
|
|
Subject: [PATCH 03/14] DYNDNS: sss_iface_addr_list_get return ENOENT
|
|
|
|
If none of eligible interfaces matches ifname then ENOENT is returned.
|
|
|
|
Resolves:
|
|
https://fedorahosted.org/sssd/ticket/2549
|
|
---
|
|
src/providers/dp_dyndns.c | 13 +++++++++++--
|
|
src/providers/ldap/sdap_dyndns.c | 6 +++++-
|
|
src/tests/cmocka/test_dyndns.c | 20 ++++++++++++++++++++
|
|
3 files changed, 36 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/providers/dp_dyndns.c b/src/providers/dp_dyndns.c
|
|
index 1cac3d0fae2454cea823ed640a4325f27580353f..2ac43a108ff6197d9e2662198a6da976ca348e76 100644
|
|
--- a/src/providers/dp_dyndns.c
|
|
+++ b/src/providers/dp_dyndns.c
|
|
@@ -222,8 +222,17 @@ sss_iface_addr_list_get(TALLOC_CTX *mem_ctx, const char *ifname,
|
|
}
|
|
}
|
|
|
|
- ret = EOK;
|
|
- *_addrlist = addrlist;
|
|
+ if (addrlist != NULL) {
|
|
+ /* OK, some result was found */
|
|
+ ret = EOK;
|
|
+ *_addrlist = addrlist;
|
|
+ } else {
|
|
+ /* No result was found */
|
|
+ DEBUG(SSSDBG_TRACE_FUNC,
|
|
+ "No IPs usable for DNS was found for interface: %s.\n", ifname);
|
|
+ ret = ENOENT;
|
|
+ }
|
|
+
|
|
done:
|
|
freeifaddrs(ifaces);
|
|
return ret;
|
|
diff --git a/src/providers/ldap/sdap_dyndns.c b/src/providers/ldap/sdap_dyndns.c
|
|
index 0d9c9205792062378aa25aad6ac706058001433a..e99a4f6687035928f6775c38b9df6b2a06d38f38 100644
|
|
--- a/src/providers/ldap/sdap_dyndns.c
|
|
+++ b/src/providers/ldap/sdap_dyndns.c
|
|
@@ -502,8 +502,12 @@ sdap_dyndns_get_addrs_send(TALLOC_CTX *mem_ctx,
|
|
if (iface) {
|
|
ret = sss_iface_addr_list_get(state, iface, &state->addresses);
|
|
if (ret != EOK) {
|
|
- DEBUG(SSSDBG_OP_FAILURE,
|
|
+ DEBUG(ret == ENOENT ? SSSDBG_MINOR_FAILURE : SSSDBG_OP_FAILURE,
|
|
"Cannot get list of addresses from interface %s\n", iface);
|
|
+ /* non critical failure */
|
|
+ if (ret == ENOENT) {
|
|
+ ret = EOK;
|
|
+ }
|
|
}
|
|
/* We're done. Just fake an async request completion */
|
|
goto done;
|
|
diff --git a/src/tests/cmocka/test_dyndns.c b/src/tests/cmocka/test_dyndns.c
|
|
index 689e333d4e68c4a2582894d06b8b7b20c76b9be8..3214e90c063ea9a4cf6f6bc6507bf4e37b7d23a4 100644
|
|
--- a/src/tests/cmocka/test_dyndns.c
|
|
+++ b/src/tests/cmocka/test_dyndns.c
|
|
@@ -247,6 +247,23 @@ void dyndns_test_get_multi_ifaddr(void **state)
|
|
assert_true(check_leaks_pop(dyndns_test_ctx) == true);
|
|
}
|
|
|
|
+void dyndns_test_get_ifaddr_enoent(void **state)
|
|
+{
|
|
+ errno_t ret;
|
|
+ struct sss_iface_addr *addrlist = NULL;
|
|
+
|
|
+ check_leaks_push(dyndns_test_ctx);
|
|
+ will_return_getifaddrs("eth0", "192.168.0.1");
|
|
+ will_return_getifaddrs("eth1", "192.168.0.2");
|
|
+ will_return_getifaddrs(NULL, NULL); /* sentinel */
|
|
+ ret = sss_iface_addr_list_get(dyndns_test_ctx, "non_existing_interface",
|
|
+ &addrlist);
|
|
+ assert_int_equal(ret, ENOENT);
|
|
+ talloc_free(addrlist);
|
|
+
|
|
+ assert_true(check_leaks_pop(dyndns_test_ctx) == true);
|
|
+}
|
|
+
|
|
void dyndns_test_ok(void **state)
|
|
{
|
|
struct tevent_req *req;
|
|
@@ -460,6 +477,9 @@ int main(int argc, const char *argv[])
|
|
cmocka_unit_test_setup_teardown(dyndns_test_get_multi_ifaddr,
|
|
dyndns_test_simple_setup,
|
|
dyndns_test_teardown),
|
|
+ cmocka_unit_test_setup_teardown(dyndns_test_get_ifaddr_enoent,
|
|
+ dyndns_test_simple_setup,
|
|
+ dyndns_test_teardown),
|
|
|
|
/* Dynamic DNS update unit tests*/
|
|
cmocka_unit_test_setup_teardown(dyndns_test_ok,
|
|
--
|
|
2.5.0
|
|
|