summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSami Kerola <kerolasa@iki.fi>2018-10-25 22:13:56 +0100
committerSami Kerola <kerolasa@iki.fi>2018-10-25 22:24:21 +0100
commit0220aafbfa292c3c74437afa65aeeaebaeee9aa5 (patch)
tree288ef70fa8229c91968054390d069976f347240d
parent8e5d8eb2bef95646fe5d1ca9894582fdde4c6bcc (diff)
downloadiputils-0220aafbfa292c3c74437afa65aeeaebaeee9aa5.tar.gz
arping: fix undefined behavior detector [UBSan]
arping.c:106:18: runtime error: member access within null pointer of type 'struct sockaddr_ll' Signed-off-by: Sami Kerola <kerolasa@iki.fi>
-rw-r--r--arping.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/arping.c b/arping.c
index 80acad0..6d54152 100644
--- a/arping.c
+++ b/arping.c
@@ -99,18 +99,16 @@ static uid_t euid;
#define MS_TDIFF(tv1,tv2) ( ((tv1).tv_sec-(tv2).tv_sec)*1000 + \
((tv1).tv_usec-(tv2).tv_usec)/1000 )
-#define OFFSET_OF(name,ele) ((size_t)(((name *)0)->ele))
-
-static inline socklen_t sll_len(size_t halen)
+__attribute__((const)) static inline size_t sll_len(const size_t halen)
{
- socklen_t len = OFFSET_OF(struct sockaddr_ll, sll_addr) + halen;
- if (len < sizeof(struct sockaddr_ll))
- len = sizeof(struct sockaddr_ll);
+ const struct sockaddr_ll unused;
+ const size_t len = sizeof(unused.sll_addr) + halen;
+
+ if (len < sizeof(unused))
+ return sizeof(unused);
return len;
}
-#define SLL_LEN(hln) sll_len(hln)
-
void usage(void)
{
fprintf(stderr,
@@ -301,7 +299,7 @@ int send_pack(int s, struct in_addr src, struct in_addr dst,
p+=4;
clock_gettime(CLOCK_MONOTONIC, &now);
- err = sendto(s, buf, p-buf, 0, (struct sockaddr*)HE, SLL_LEN(ah->ar_hln));
+ err = sendto(s, buf, p-buf, 0, (struct sockaddr*)HE, sll_len(ah->ar_hln));
if (err == p-buf) {
last = now;
sent++;