summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-06-22 09:19:09 +0200
committerThomas Haller <thaller@redhat.com>2021-06-22 09:47:44 +0200
commitc6559b04c21dcc22361f559eccc40029b2b30115 (patch)
tree4ec7e1aa3225b23e5866132e829b4186de74c9e9
parent26090bafc9fd2eceeccffb758937427ae5dd160b (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.h20
-rw-r--r--src/libnm-std-aux/nm-std-aux.h27
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__ */