diff options
author | Pavel Reichl <preichl@redhat.com> | 2015-07-08 09:01:24 -0400 |
---|---|---|
committer | Pavel Březina <pbrezina@redhat.com> | 2015-07-27 17:25:19 +0200 |
commit | 4e64b82fe58f2cd603481f300d0d550fb402ec04 (patch) | |
tree | 84f46f8bd46c526a5f69c8ac3598bd9b5b3bc607 | |
parent | c822eaf347c81da37c59ecc19cc598497611f4ce (diff) | |
download | sssd-4e64b82fe58f2cd603481f300d0d550fb402ec04.tar.gz sssd-4e64b82fe58f2cd603481f300d0d550fb402ec04.tar.xz sssd-4e64b82fe58f2cd603481f300d0d550fb402ec04.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, |