From 3b69213f510808672184431373ac01e38ba6dbf7 Mon Sep 17 00:00:00 2001 From: Jeroen Koekkoek Date: Thu, 6 Dec 2018 18:51:53 +0100 Subject: [PATCH 1/2] Do not require table to contain address if interface is down (Fixes #55) Signed-off-by: Jeroen Koekkoek --- src/os/src/windows/os_platform_ifaddrs.c | 76 ++++++++++++------------ 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/os/src/windows/os_platform_ifaddrs.c b/src/os/src/windows/os_platform_ifaddrs.c index 5303425..65dd98f 100644 --- a/src/os/src/windows/os_platform_ifaddrs.c +++ b/src/os/src/windows/os_platform_ifaddrs.c @@ -58,6 +58,8 @@ getifaces(PIP_ADAPTER_ADDRESSES *ptr) if (err == 0) { *ptr = buf; + } else { + os_free(buf); } return err; @@ -146,56 +148,54 @@ copyaddr( const PIP_ADAPTER_UNICAST_ADDRESS addr) { int err = 0; - int eq = 0; os_ifaddrs_t *ifa; - DWORD i; - struct sockaddr *sa = (struct sockaddr *)addr->Address.lpSockaddr; - size_t size; + struct sockaddr *sa; + size_t sz; assert(iface != NULL); assert(addrtable != NULL); assert(addr != NULL); + sa = (struct sockaddr *)addr->Address.lpSockaddr; + sz = (size_t)addr->Address.iSockaddrLength; + if ((ifa = os_calloc_s(1, sizeof(*ifa))) == NULL) { err = ENOMEM; } else { ifa->flags = getflags(iface); + ifa->addr = os_memdup(sa, sz); (void)os_asprintf(&ifa->name, "%wS", iface->FriendlyName); - - if (ifa->name == NULL) { + if (ifa->addr == NULL || ifa->name == NULL) { err = ENOMEM; - } else { - ifa->addr = os_memdup(sa, addr->Address.iSockaddrLength); - if (ifa->addr == NULL) { + } else if (ifa->addr->sa_family == AF_INET6) { + ifa->index = iface->Ipv6IfIndex; + + /* Address is not in addrtable if the interface is not connected. */ + } else if (ifa->addr->sa_family == AF_INET && (ifa->flags & IFF_UP)) { + DWORD i = 0; + struct sockaddr_in nm, bc, *sin = (struct sockaddr_in *)sa; + + assert(sz == sizeof(nm)); + memset(&nm, 0, sz); + memset(&bc, 0, sz); + nm.sin_family = bc.sin_family = AF_INET; + + for (; i < addrtable->dwNumEntries; i++) { + if (sin->sin_addr.s_addr == addrtable->table[i].dwAddr) { + ifa->index = addrtable->table[i].dwIndex; + nm.sin_addr.s_addr = addrtable->table[i].dwMask; + bc.sin_addr.s_addr = + sin->sin_addr.s_addr | ~(nm.sin_addr.s_addr); + break; + } + } + + assert(i < addrtable->dwNumEntries); + + if ((ifa->netmask = os_memdup(&nm, sz)) == NULL || + (ifa->broadaddr = os_memdup(&bc, sz)) == NULL) + { err = ENOMEM; - } else if (ifa->addr->sa_family == AF_INET) { - size = sizeof(struct sockaddr_in); - struct sockaddr_in netmask, broadaddr; - - memset(&netmask, 0, size); - memset(&broadaddr, 0, size); - netmask.sin_family = broadaddr.sin_family = AF_INET; - - for (i = 0; !eq && i < addrtable->dwNumEntries; i++) { - eq = (((struct sockaddr_in *)sa)->sin_addr.s_addr == - addrtable->table[i].dwAddr); - if (eq) { - ifa->index = addrtable->table[i].dwIndex; - netmask.sin_addr.s_addr = addrtable->table[i].dwMask; - broadaddr.sin_addr.s_addr = - ((struct sockaddr_in *)sa)->sin_addr.s_addr | ~(netmask.sin_addr.s_addr); - } - } - - assert(eq != 0); - - if ((ifa->netmask = os_memdup(&netmask, size)) == NULL || - (ifa->broadaddr = os_memdup(&broadaddr, size)) == NULL) - { - err = ENOMEM; - } - } else { - ifa->index = iface->Ipv6IfIndex; } } } @@ -203,7 +203,7 @@ copyaddr( if (err == 0) { *ifap = ifa; } else { - os_free(ifa); + os_freeifaddrs(ifa); } return err; From 3c5a209389655408bfde0c9d22a0c0d47fd336fd Mon Sep 17 00:00:00 2001 From: Jeroen Koekkoek Date: Thu, 6 Dec 2018 19:06:08 +0100 Subject: [PATCH 2/2] Fix build warnings by passing a message to CU_PASS Signed-off-by: Jeroen Koekkoek --- src/core/ddsc/tests/read_instance.c | 6 +++--- src/core/ddsc/tests/reader.c | 8 ++++---- src/core/ddsc/tests/reader_iterator.c | 8 ++++---- src/core/ddsc/tests/take_instance.c | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/core/ddsc/tests/read_instance.c b/src/core/ddsc/tests/read_instance.c index 4548e0a..c609303 100644 --- a/src/core/ddsc/tests/read_instance.c +++ b/src/core/ddsc/tests/read_instance.c @@ -298,7 +298,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, size_t bufsz, u ret = dds_read_instance(*ent, buf, si, bufsz, maxs, g_hdl_valid); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ @@ -319,7 +319,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, uint32_t maxs), ret = dds_read_instance_wl(*ent, buf, si, maxs, g_hdl_valid); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ @@ -349,7 +349,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, size_t bufsz, u ret = dds_read_instance_mask(*ent, buf, si, bufsz, maxs, g_hdl_valid, mask); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ diff --git a/src/core/ddsc/tests/reader.c b/src/core/ddsc/tests/reader.c index 3f3b435..06fb704 100644 --- a/src/core/ddsc/tests/reader.c +++ b/src/core/ddsc/tests/reader.c @@ -306,7 +306,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs), ddsc ret = dds_read(g_reader, buf, si, bufsz, maxs); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ @@ -540,7 +540,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs), ddsc ret = dds_read_mask(g_reader, buf, si, bufsz, maxs, mask); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ @@ -1676,7 +1676,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs), ddsc ret = dds_take(g_reader, buf, si, bufsz, maxs); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ @@ -1911,7 +1911,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs), ddsc ret = dds_take_mask(g_reader, buf, si, bufsz, maxs, mask); CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ diff --git a/src/core/ddsc/tests/reader_iterator.c b/src/core/ddsc/tests/reader_iterator.c index e275d44..2364d6a 100644 --- a/src/core/ddsc/tests/reader_iterator.c +++ b/src/core/ddsc/tests/reader_iterator.c @@ -405,7 +405,7 @@ CU_Theory((void **buf, dds_sample_info_t *si), ddsc_read_next, invalid_buffers, ret = dds_read_next(g_reader, buf, si); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ @@ -521,7 +521,7 @@ CU_Theory((void **buf, dds_sample_info_t *si), ddsc_read_next_wl, invalid_buffer ret = dds_read_next_wl(g_reader, buf, si); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ @@ -631,7 +631,7 @@ CU_Theory((void **buf, dds_sample_info_t *si), ddsc_take_next, invalid_buffers, ret = dds_take_next(g_reader, buf, si); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ @@ -743,7 +743,7 @@ CU_Theory((void **buf, dds_sample_info_t *si), ddsc_take_next_wl, invalid_buffer ret = dds_take_next_wl(g_reader, buf, si); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ diff --git a/src/core/ddsc/tests/take_instance.c b/src/core/ddsc/tests/take_instance.c index a943602..72edb18 100644 --- a/src/core/ddsc/tests/take_instance.c +++ b/src/core/ddsc/tests/take_instance.c @@ -299,7 +299,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, size_t bufsz, u ret = dds_take_instance(*ent, buf, si, bufsz, maxs, g_hdl_valid); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/ @@ -347,7 +347,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, size_t bufsz, u ret = dds_take_instance_mask(*ent, buf, si, bufsz, maxs, g_hdl_valid, mask); CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER); } else { - CU_PASS(); + CU_PASS("Skipped"); } } /*************************************************************************************************/