The branch main has been updated by tsoome:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=733da235aa6a3c71d06b92a41656bad07fada5e6

commit 733da235aa6a3c71d06b92a41656bad07fada5e6
Author:     Toomas Soome <tso...@freebsd.org>
AuthorDate: 2025-07-31 19:11:16 +0000
Commit:     Toomas Soome <tso...@freebsd.org>
CommitDate: 2025-07-31 22:04:32 +0000

    libsa: errors with pointer conversion
    
    loader ip implementation is using pointer to structure ip to receive
    the packet and is using this pointer to cast on other data types
    (namely structure arphdr). Problem does arise when those data structures
    are declared with different alignment rules and when/if the compiler
    does check those rules. To work around and silence warnings, use
    void * generic pointer instead.
    
    Error seen with gcc 14 (-Werror=address-of-packed-member).
    
    Reviewed by:    imp
    Differential Revision: https://reviews.freebsd.org/D51662
---
 stand/libsa/ip.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/stand/libsa/ip.c b/stand/libsa/ip.c
index 2c2acf2eda16..6c7b0844b14d 100644
--- a/stand/libsa/ip.c
+++ b/stand/libsa/ip.c
@@ -181,6 +181,7 @@ readipv4(struct iodesc *d, void **pkt, void **payload, 
time_t tleft,
        ssize_t n;
        size_t hlen;
        struct ether_header *eh;
+       void *buf;
        struct ip *ip;
        struct udphdr *uh;
        uint16_t etype;         /* host order */
@@ -195,7 +196,7 @@ readipv4(struct iodesc *d, void **pkt, void **payload, 
time_t tleft,
 
        ip = NULL;
        ptr = NULL;
-       n = readether(d, (void **)&ptr, (void **)&ip, tleft, &etype);
+       n = readether(d, (void **)&ptr, (void **)&buf, tleft, &etype);
        if (n == -1 || n < sizeof(*ip) + sizeof(*uh)) {
                free(ptr);
                return (-1);
@@ -205,7 +206,7 @@ readipv4(struct iodesc *d, void **pkt, void **payload, 
time_t tleft,
 
        /* Need to respond to ARP requests. */
        if (etype == ETHERTYPE_ARP) {
-               struct arphdr *ah = (void *)ip;
+               struct arphdr *ah = buf;
                if (ah->ar_op == htons(ARPOP_REQUEST)) {
                        /* Send ARP reply */
                        arp_reply(d, ah);
@@ -224,6 +225,7 @@ readipv4(struct iodesc *d, void **pkt, void **payload, 
time_t tleft,
                return (-1);
        }
 
+       ip = buf;
        /* Check ip header */
        if (ip->ip_v != IPVERSION ||    /* half char */
            ip->ip_p != proto) {

Reply via email to