summaryrefslogtreecommitdiff
path: root/accel-pppd/utils.h
diff options
context:
space:
mode:
authorDenys Fedoryshchenko <denys.f@collabora.com>2026-09-07 20:54:47 +0300
committerGitHub <noreply@github.com>2026-09-07 20:54:47 +0300
commit7e81fd4a4c5fb47f9ddfc6d99124ade83ca58940 (patch)
treeee978a149543f91c8a155a6f6dcbee26564f7bf5 /accel-pppd/utils.h
parent57ae56148c5519b9207ede623098d3cfad5211b8 (diff)
parent4654c4a9c083780f5e151ee064e69a357c48d364 (diff)
downloadaccel-ppp-7e81fd4a4c5fb47f9ddfc6d99124ade83ca58940.tar.gz
accel-ppp-7e81fd4a4c5fb47f9ddfc6d99124ade83ca58940.zip
Merge pull request #361 from nuclearcat/fix-protocol-buffer-access
Fix several unsafe or unaligned integer accesses found in protocol parsing paths, including option-gated MPPE, DHCP, PPPoE, RADIUS, IPCP and IPv6CP code.
Diffstat (limited to 'accel-pppd/utils.h')
-rw-r--r--accel-pppd/utils.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/accel-pppd/utils.h b/accel-pppd/utils.h
index 63c1db0d..7c62422c 100644
--- a/accel-pppd/utils.h
+++ b/accel-pppd/utils.h
@@ -1,13 +1,86 @@
#ifndef __UTILS_H
#define __UTILS_H
+#include <endian.h>
#include <netinet/in.h>
#include <stdint.h>
+#include <string.h>
#ifndef min
#define min(x, y) ((x) < (y) ? (x) : (y))
#endif
+/*
+ * Fixed-size memcpy() lets the compiler emit efficient unaligned accesses on
+ * architectures that support them without imposing alignment or aliasing
+ * requirements on callers.
+ */
+static inline uint16_t u_read_be16(const void *ptr)
+{
+ uint16_t value;
+
+ memcpy(&value, ptr, sizeof(value));
+ return ntohs(value);
+}
+
+static inline uint32_t u_read_be32(const void *ptr)
+{
+ uint32_t value;
+
+ memcpy(&value, ptr, sizeof(value));
+ return ntohl(value);
+}
+
+static inline uint64_t u_read_be64(const void *ptr)
+{
+ uint64_t value;
+
+ memcpy(&value, ptr, sizeof(value));
+ return be64toh(value);
+}
+
+static inline void u_write_be16(void *ptr, uint16_t value)
+{
+ value = htons(value);
+ memcpy(ptr, &value, sizeof(value));
+}
+
+static inline void u_write_be32(void *ptr, uint32_t value)
+{
+ value = htonl(value);
+ memcpy(ptr, &value, sizeof(value));
+}
+
+static inline void u_write_be64(void *ptr, uint64_t value)
+{
+ value = htobe64(value);
+ memcpy(ptr, &value, sizeof(value));
+}
+
+static inline uint16_t u_read_native16(const void *ptr)
+{
+ uint16_t value;
+
+ memcpy(&value, ptr, sizeof(value));
+ return value;
+}
+
+static inline uint32_t u_read_native32(const void *ptr)
+{
+ uint32_t value;
+
+ memcpy(&value, ptr, sizeof(value));
+ return value;
+}
+
+static inline uint64_t u_read_native64(const void *ptr)
+{
+ uint64_t value;
+
+ memcpy(&value, ptr, sizeof(value));
+ return value;
+}
+
char *u_ip6str(const struct in6_addr *addr, char *buf);
char *u_ip4str(const struct in_addr *addr, char *buf);