diff options
author | Thomas Haller <thaller@redhat.com> | 2021-06-22 09:19:09 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2021-06-22 09:47:44 +0200 |
commit | c6559b04c21dcc22361f559eccc40029b2b30115 (patch) | |
tree | 4ec7e1aa3225b23e5866132e829b4186de74c9e9 | |
parent | 26090bafc9fd2eceeccffb758937427ae5dd160b (diff) |
std-aux/glib-aux: minor cleanup of nm_ip_addr_*()/nm_utils_addr_family_*()
- let nm_ip_addr_is_null() work for unaligned addresses.
- drop redundant nm_assert_addr_family().
- move code around.
-rw-r--r-- | src/libnm-glib-aux/nm-shared-utils.h | 20 | ||||
-rw-r--r-- | src/libnm-std-aux/nm-std-aux.h | 27 |
2 files changed, 26 insertions, 21 deletions
diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index aced71f985..62fd064265 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -247,7 +247,6 @@ extern const NMIPAddr nm_ip_addr_zero; static inline int nm_ip_addr_cmp(int addr_family, gconstpointer a, gconstpointer b) { - nm_assert_addr_family(addr_family); nm_assert(a); nm_assert(b); @@ -264,20 +263,27 @@ static inline gboolean nm_ip_addr_is_null(int addr_family, gconstpointer addr) { nm_assert(addr); - if (addr_family == AF_INET6) - return IN6_IS_ADDR_UNSPECIFIED((const struct in6_addr *) addr); - nm_assert(addr_family == AF_INET); - return ((const struct in_addr *) addr)->s_addr == 0; + + if (NM_IS_IPv4(addr_family)) { + in_addr_t t; + + /* also for in_addr_t type (AF_INET), we accept that the pointer might + * be unaligned. */ + memcpy(&t, addr, sizeof(t)); + return t == 0; + } + + return IN6_IS_ADDR_UNSPECIFIED((const struct in6_addr *) addr); } static inline void nm_ip_addr_set(int addr_family, gpointer dst, gconstpointer src) { - nm_assert_addr_family(addr_family); nm_assert(dst); nm_assert(src); - memcpy(dst, src, NM_IS_IPv4(addr_family) ? sizeof(in_addr_t) : sizeof(struct in6_addr)); + /* this MUST use memcpy() (or similar means) to support unaligned src/dst pointers. */ + memcpy(dst, src, nm_utils_addr_family_to_size(addr_family)); } static inline NMIPAddr diff --git a/src/libnm-std-aux/nm-std-aux.h b/src/libnm-std-aux/nm-std-aux.h index 7ad6294d71..1e341157fc 100644 --- a/src/libnm-std-aux/nm-std-aux.h +++ b/src/libnm-std-aux/nm-std-aux.h @@ -1060,6 +1060,18 @@ nm_utils_addr_family_to_char(int addr_family) return '?'; } +#define nm_assert_addr_family(addr_family) \ + nm_assert(NM_IN_SET((addr_family), NM_AF_INET, NM_AF_INET6)) + +#define NM_IS_IPv4(addr_family) \ + ({ \ + const int _addr_family = (addr_family); \ + \ + nm_assert_addr_family(_addr_family); \ + \ + (_addr_family == NM_AF_INET); \ + }) + static inline size_t nm_utils_addr_family_to_size(int addr_family) { @@ -1069,8 +1081,7 @@ nm_utils_addr_family_to_size(int addr_family) case NM_AF_INET6: return NM_AF_INET6_SIZE; } - nm_assert_not_reached(); - return 0; + return nm_assert_unreachable_val(0); } static inline int @@ -1085,16 +1096,4 @@ nm_utils_addr_family_from_size(size_t len) return NM_AF_UNSPEC; } -#define nm_assert_addr_family(addr_family) \ - nm_assert(NM_IN_SET((addr_family), NM_AF_INET, NM_AF_INET6)) - -#define NM_IS_IPv4(addr_family) \ - ({ \ - const int _addr_family = (addr_family); \ - \ - nm_assert_addr_family(_addr_family); \ - \ - (_addr_family == NM_AF_INET); \ - }) - #endif /* __NM_STD_AUX_H__ */ |