diff options
author | Pavel Reichl <preichl@redhat.com> | 2015-07-08 09:01:24 -0400 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2015-09-07 18:08:02 +0200 |
commit | 7837d8ed79181ff115f1193cccbec6c3455d1dd3 (patch) | |
tree | 355efdd8a0a8b7d561b3e249e1de3475b79067f0 | |
parent | 3e42297426742313bbbfaa868553857acba78feb (diff) | |
download | sssd-7837d8ed79181ff115f1193cccbec6c3455d1dd3.tar.gz sssd-7837d8ed79181ff115f1193cccbec6c3455d1dd3.tar.xz sssd-7837d8ed79181ff115f1193cccbec6c3455d1dd3.zip |
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
-rw-r--r-- | src/providers/dp_dyndns.c | 13 | ||||
-rw-r--r-- | src/providers/ldap/sdap_dyndns.c | 6 | ||||
-rw-r--r-- | 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 1cac3d0fa..2ac43a108 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 0d9c92057..e99a4f668 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 689e333d4..3214e90c0 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, |