Merge pull request #70 from k0ekk0ek/fix-55
Do not require table to contain address if interface is down (Fixes #55)
This commit is contained in:
commit
19202d9de8
5 changed files with 51 additions and 51 deletions
|
@ -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);
|
ret = dds_read_instance(*ent, buf, si, bufsz, maxs, g_hdl_valid);
|
||||||
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} 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);
|
ret = dds_read_instance_wl(*ent, buf, si, maxs, g_hdl_valid);
|
||||||
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} 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);
|
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);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} else {
|
||||||
CU_PASS();
|
CU_PASS("Skipped");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*************************************************************************************************/
|
/*************************************************************************************************/
|
||||||
|
|
|
@ -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);
|
ret = dds_read(g_reader, buf, si, bufsz, maxs);
|
||||||
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} 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);
|
ret = dds_read_mask(g_reader, buf, si, bufsz, maxs, mask);
|
||||||
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} 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);
|
ret = dds_take(g_reader, buf, si, bufsz, maxs);
|
||||||
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} 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);
|
ret = dds_take_mask(g_reader, buf, si, bufsz, maxs, mask);
|
||||||
CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} else {
|
||||||
CU_PASS();
|
CU_PASS("Skipped");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*************************************************************************************************/
|
/*************************************************************************************************/
|
||||||
|
|
|
@ -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);
|
ret = dds_read_next(g_reader, buf, si);
|
||||||
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} 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);
|
ret = dds_read_next_wl(g_reader, buf, si);
|
||||||
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} 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);
|
ret = dds_take_next(g_reader, buf, si);
|
||||||
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} 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);
|
ret = dds_take_next_wl(g_reader, buf, si);
|
||||||
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} else {
|
||||||
CU_PASS();
|
CU_PASS("Skipped");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*************************************************************************************************/
|
/*************************************************************************************************/
|
||||||
|
|
|
@ -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);
|
ret = dds_take_instance(*ent, buf, si, bufsz, maxs, g_hdl_valid);
|
||||||
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} 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);
|
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);
|
CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
|
||||||
} else {
|
} else {
|
||||||
CU_PASS();
|
CU_PASS("Skipped");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*************************************************************************************************/
|
/*************************************************************************************************/
|
||||||
|
|
|
@ -58,6 +58,8 @@ getifaces(PIP_ADAPTER_ADDRESSES *ptr)
|
||||||
|
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
*ptr = buf;
|
*ptr = buf;
|
||||||
|
} else {
|
||||||
|
os_free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
@ -146,56 +148,54 @@ copyaddr(
|
||||||
const PIP_ADAPTER_UNICAST_ADDRESS addr)
|
const PIP_ADAPTER_UNICAST_ADDRESS addr)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
int eq = 0;
|
|
||||||
os_ifaddrs_t *ifa;
|
os_ifaddrs_t *ifa;
|
||||||
DWORD i;
|
struct sockaddr *sa;
|
||||||
struct sockaddr *sa = (struct sockaddr *)addr->Address.lpSockaddr;
|
size_t sz;
|
||||||
size_t size;
|
|
||||||
|
|
||||||
assert(iface != NULL);
|
assert(iface != NULL);
|
||||||
assert(addrtable != NULL);
|
assert(addrtable != NULL);
|
||||||
assert(addr != 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) {
|
if ((ifa = os_calloc_s(1, sizeof(*ifa))) == NULL) {
|
||||||
err = ENOMEM;
|
err = ENOMEM;
|
||||||
} else {
|
} else {
|
||||||
ifa->flags = getflags(iface);
|
ifa->flags = getflags(iface);
|
||||||
|
ifa->addr = os_memdup(sa, sz);
|
||||||
(void)os_asprintf(&ifa->name, "%wS", iface->FriendlyName);
|
(void)os_asprintf(&ifa->name, "%wS", iface->FriendlyName);
|
||||||
|
if (ifa->addr == NULL || ifa->name == NULL) {
|
||||||
if (ifa->name == NULL) {
|
|
||||||
err = ENOMEM;
|
err = ENOMEM;
|
||||||
} else {
|
} else if (ifa->addr->sa_family == AF_INET6) {
|
||||||
ifa->addr = os_memdup(sa, addr->Address.iSockaddrLength);
|
ifa->index = iface->Ipv6IfIndex;
|
||||||
if (ifa->addr == NULL) {
|
|
||||||
|
/* 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;
|
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) {
|
if (err == 0) {
|
||||||
*ifap = ifa;
|
*ifap = ifa;
|
||||||
} else {
|
} else {
|
||||||
os_free(ifa);
|
os_freeifaddrs(ifa);
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue