Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Jan 2021 21:38:15 GMT
From:      Alex Richardson <arichardson@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: bc596e563245 - main - libalias: Fix -Wcast-align compiler warnings
Message-ID:  <202101192138.10JLcFIt078410@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by arichardson:

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

commit bc596e563245d838a27e3c7aaf090caa49af1016
Author:     Alex Richardson <arichardson@FreeBSD.org>
AuthorDate: 2021-01-19 11:32:32 +0000
Commit:     Alex Richardson <arichardson@FreeBSD.org>
CommitDate: 2021-01-19 21:23:24 +0000

    libalias: Fix -Wcast-align compiler warnings
    
    This fixes -Wcast-align warnings caused by the underaligned `struct ip`.
    This also silences them in the public functions by changing the function
    signature from char * to void *. This is source and binary compatible and
    avoids the -Wcast-align warning.
    
    Reviewed By:    ae, gbe (manpages)
    Differential Revision: https://reviews.freebsd.org/D27882
---
 sys/netinet/libalias/alias.c       | 102 ++++++++++++++++++-------------------
 sys/netinet/libalias/alias.h       |  14 ++---
 sys/netinet/libalias/alias_db.c    |   4 +-
 sys/netinet/libalias/alias_local.h |   4 +-
 sys/netinet/libalias/alias_proxy.c |   2 +-
 sys/netinet/libalias/libalias.3    |  16 +++---
 6 files changed, 69 insertions(+), 73 deletions(-)

diff --git a/sys/netinet/libalias/alias.c b/sys/netinet/libalias/alias.c
index 267bd2118222..8d5097943080 100644
--- a/sys/netinet/libalias/alias.c
+++ b/sys/netinet/libalias/alias.c
@@ -274,9 +274,9 @@ static int	IcmpAliasOut2(struct libalias *, struct ip *);
 static int	IcmpAliasOut(struct libalias *, struct ip *, int create);
 
 static int	ProtoAliasIn(struct libalias *la, struct in_addr ip_src,
-		    struct in_addr *ip_dst, u_char ip_p, u_short *ip_sum);
-static int	ProtoAliasOut(struct libalias *la, struct in_addr *ip_src, 
-		    struct in_addr ip_dst, u_char ip_p, u_short *ip_sum, 
+		    struct ip *pip, u_char ip_p, u_short *ip_sum);
+static int	ProtoAliasOut(struct libalias *la, struct ip *pip,
+		    struct in_addr ip_dst, u_char ip_p, u_short *ip_sum,
 		    int create);
 
 static int	UdpAliasIn(struct libalias *, struct ip *);
@@ -655,8 +655,8 @@ IcmpAliasOut(struct libalias *la, struct ip *pip, int create)
 }
 
 static int
-ProtoAliasIn(struct libalias *la, struct in_addr ip_src, 
-    struct in_addr *ip_dst, u_char ip_p, u_short *ip_sum)
+ProtoAliasIn(struct libalias *la, struct in_addr ip_src,
+    struct ip *pip, u_char ip_p, u_short *ip_sum)
 {
 /*
   Handle incoming IP packets. The
@@ -671,7 +671,7 @@ ProtoAliasIn(struct libalias *la, struct in_addr ip_src,
 	if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
 		return (PKT_ALIAS_OK);
 
-	lnk = FindProtoIn(la, ip_src, *ip_dst, ip_p);
+	lnk = FindProtoIn(la, ip_src, pip->ip_dst, ip_p);
 	if (lnk != NULL) {
 		struct in_addr original_address;
 
@@ -679,8 +679,8 @@ ProtoAliasIn(struct libalias *la, struct in_addr ip_src,
 
 /* Restore original IP address */
 		DifferentialChecksum(ip_sum,
-		    &original_address, ip_dst, 2);
-		*ip_dst = original_address;
+		    &original_address, &pip->ip_dst, 2);
+		pip->ip_dst = original_address;
 
 		return (PKT_ALIAS_OK);
 	}
@@ -688,7 +688,7 @@ ProtoAliasIn(struct libalias *la, struct in_addr ip_src,
 }
 
 static int
-ProtoAliasOut(struct libalias *la, struct in_addr *ip_src, 
+ProtoAliasOut(struct libalias *la, struct ip *pip,
     struct in_addr ip_dst, u_char ip_p, u_short *ip_sum, int create)
 {
 /*
@@ -707,7 +707,7 @@ ProtoAliasOut(struct libalias *la, struct in_addr *ip_src,
 	if (!create)
 		return (PKT_ALIAS_IGNORED);
 
-	lnk = FindProtoOut(la, *ip_src, ip_dst, ip_p);
+	lnk = FindProtoOut(la, pip->ip_src, ip_dst, ip_p);
 	if (lnk != NULL) {
 		struct in_addr alias_address;
 
@@ -715,8 +715,8 @@ ProtoAliasOut(struct libalias *la, struct in_addr *ip_src,
 
 /* Change source address */
 		DifferentialChecksum(ip_sum,
-		    &alias_address, ip_src, 2);
-		*ip_src = alias_address;
+		    &alias_address, &pip->ip_src, 2);
+		pip->ip_src = alias_address;
 
 		return (PKT_ALIAS_OK);
 	}
@@ -1185,26 +1185,26 @@ saved and recalled when a header fragment is seen.
 */
 
 /* Local prototypes */
-static int	FragmentIn(struct libalias *la, struct in_addr ip_src, 
-		    struct in_addr *ip_dst, u_short ip_id, u_short *ip_sum);		    
-static int	FragmentOut(struct libalias *, struct in_addr *ip_src, 
+static int	FragmentIn(struct libalias *la, struct in_addr ip_src,
+		    struct ip *pip, u_short ip_id, u_short *ip_sum);
+static int	FragmentOut(struct libalias *, struct ip *pip,
 		    u_short *ip_sum);
 
 static int
-FragmentIn(struct libalias *la, struct in_addr ip_src, struct in_addr *ip_dst,
+FragmentIn(struct libalias *la, struct in_addr ip_src, struct ip *pip,
     u_short ip_id, u_short *ip_sum)
 {
 	struct alias_link *lnk;
 
 	LIBALIAS_LOCK_ASSERT(la);
-	lnk = FindFragmentIn2(la, ip_src, *ip_dst, ip_id);
+	lnk = FindFragmentIn2(la, ip_src, pip->ip_dst, ip_id);
 	if (lnk != NULL) {
 		struct in_addr original_address;
 
 		GetFragmentAddr(lnk, &original_address);
 		DifferentialChecksum(ip_sum,
-		    &original_address, ip_dst, 2);
-		*ip_dst = original_address;
+		    &original_address, &pip->ip_dst, 2);
+		pip->ip_dst = original_address;
 
 		return (PKT_ALIAS_OK);
 	}
@@ -1212,15 +1212,15 @@ FragmentIn(struct libalias *la, struct in_addr ip_src, struct in_addr *ip_dst,
 }
 
 static int
-FragmentOut(struct libalias *la, struct in_addr *ip_src, u_short *ip_sum)
+FragmentOut(struct libalias *la, struct ip *pip, u_short *ip_sum)
 {
 	struct in_addr alias_address;
 
 	LIBALIAS_LOCK_ASSERT(la);
-	alias_address = FindAliasAddress(la, *ip_src);
+	alias_address = FindAliasAddress(la, pip->ip_src);
 	DifferentialChecksum(ip_sum,
-	    &alias_address, ip_src, 2);
-	*ip_src = alias_address;
+	    &alias_address, &pip->ip_src, 2);
+	pip->ip_src = alias_address;
 
 	return (PKT_ALIAS_OK);
 }
@@ -1238,7 +1238,7 @@ FragmentOut(struct libalias *la, struct in_addr *ip_src, u_short *ip_sum)
 */
 
 int
-LibAliasSaveFragment(struct libalias *la, char *ptr)
+LibAliasSaveFragment(struct libalias *la, void *ptr)
 {
 	int iresult;
 	struct alias_link *lnk;
@@ -1256,11 +1256,11 @@ LibAliasSaveFragment(struct libalias *la, char *ptr)
 	return (iresult);
 }
 
-char           *
-LibAliasGetFragment(struct libalias *la, char *ptr)
+void           *
+LibAliasGetFragment(struct libalias *la, void *ptr)
 {
 	struct alias_link *lnk;
-	char *fptr;
+	void *fptr;
 	struct ip *pip;
 
 	LIBALIAS_LOCK(la);
@@ -1278,10 +1278,10 @@ LibAliasGetFragment(struct libalias *la, char *ptr)
 }
 
 void
-LibAliasFragmentIn(struct libalias *la, char *ptr,	/* Points to correctly
+LibAliasFragmentIn(struct libalias *la, void *ptr,	/* Points to correctly
 							 * de-aliased header
 							 * fragment */
-    char *ptr_fragment		/* Points to fragment which must be
+    void *ptr_fragment		/* Points to fragment which must be
 				 * de-aliased   */
 )
 {
@@ -1301,39 +1301,37 @@ LibAliasFragmentIn(struct libalias *la, char *ptr,	/* Points to correctly
 
 /* Local prototypes */
 static int
-LibAliasOutLocked(struct libalias *la, char *ptr,
+LibAliasOutLocked(struct libalias *la, struct ip *pip,
 		  int maxpacketsize, int create);
 static int
-LibAliasInLocked(struct libalias *la, char *ptr,
+LibAliasInLocked(struct libalias *la, struct ip *pip,
 		  int maxpacketsize);
 
 int
-LibAliasIn(struct libalias *la, char *ptr, int maxpacketsize)
+LibAliasIn(struct libalias *la, void *ptr, int maxpacketsize)
 {
 	int res;
 
 	LIBALIAS_LOCK(la);
-	res = LibAliasInLocked(la, ptr, maxpacketsize);
+	res = LibAliasInLocked(la, (struct ip *)ptr, maxpacketsize);
 	LIBALIAS_UNLOCK(la);
 	return (res);
 }
 
 static int
-LibAliasInLocked(struct libalias *la, char *ptr, int maxpacketsize)
+LibAliasInLocked(struct libalias *la, struct ip *pip, int maxpacketsize)
 {
 	struct in_addr alias_addr;
-	struct ip *pip;
 	int iresult;
 
 	if (la->packetAliasMode & PKT_ALIAS_REVERSE) {
 		la->packetAliasMode &= ~PKT_ALIAS_REVERSE;
-		iresult = LibAliasOutLocked(la, ptr, maxpacketsize, 1);
+		iresult = LibAliasOutLocked(la, pip, maxpacketsize, 1);
 		la->packetAliasMode |= PKT_ALIAS_REVERSE;
 		goto getout;
 	}
 	HouseKeeping(la);
 	ClearCheckNewLink(la);
-	pip = (struct ip *)ptr;
 	alias_addr = pip->ip_dst;
 
 	/* Defense against mangled packets */
@@ -1377,12 +1375,12 @@ LibAliasInLocked(struct libalias *la, char *ptr, int maxpacketsize)
 			if (error ==  0)
 				iresult = PKT_ALIAS_OK;
 			else
-				iresult = ProtoAliasIn(la, pip->ip_src, 
-				    &pip->ip_dst, pip->ip_p, &pip->ip_sum);
+				iresult = ProtoAliasIn(la, pip->ip_src,
+				    pip, pip->ip_p, &pip->ip_sum);
 		}
  			break; 
 		default:
-			iresult = ProtoAliasIn(la, pip->ip_src, &pip->ip_dst,
+			iresult = ProtoAliasIn(la, pip->ip_src, pip,
 			    pip->ip_p, &pip->ip_sum);
 			break;
 		}
@@ -1399,7 +1397,7 @@ LibAliasInLocked(struct libalias *la, char *ptr, int maxpacketsize)
 			}
 		}
 	} else {
-		iresult = FragmentIn(la, pip->ip_src, &pip->ip_dst, pip->ip_id,
+		iresult = FragmentIn(la, pip->ip_src, pip, pip->ip_id,
 		    &pip->ip_sum);
 	}
 
@@ -1426,29 +1424,29 @@ getout:
 #define UNREG_ADDR_CGN_UPPER 0x647fffff
 
 int
-LibAliasOut(struct libalias *la, char *ptr, int maxpacketsize)
+LibAliasOut(struct libalias *la, void *ptr, int maxpacketsize)
 {
 	int res;
 
 	LIBALIAS_LOCK(la);
-	res = LibAliasOutLocked(la, ptr, maxpacketsize, 1);
+	res = LibAliasOutLocked(la, (struct ip *)ptr, maxpacketsize, 1);
 	LIBALIAS_UNLOCK(la);
 	return (res);
 }
 
 int
-LibAliasOutTry(struct libalias *la, char *ptr, int maxpacketsize, int create)
+LibAliasOutTry(struct libalias *la, void *ptr, int maxpacketsize, int create)
 {
 	int res;
 
 	LIBALIAS_LOCK(la);
-	res = LibAliasOutLocked(la, ptr, maxpacketsize, create);
+	res = LibAliasOutLocked(la, (struct ip *)ptr, maxpacketsize, create);
 	LIBALIAS_UNLOCK(la);
 	return (res);
 }
 
 static int
-LibAliasOutLocked(struct libalias *la, char *ptr,	/* valid IP packet */
+LibAliasOutLocked(struct libalias *la, struct ip *pip,	/* valid IP packet */
     int maxpacketsize,		/* How much the packet data may grow (FTP
 				 * and IRC inline changes) */
     int create                  /* Create new entries ? */
@@ -1456,17 +1454,15 @@ LibAliasOutLocked(struct libalias *la, char *ptr,	/* valid IP packet */
 {
 	int iresult;
 	struct in_addr addr_save;
-	struct ip *pip;
 
 	if (la->packetAliasMode & PKT_ALIAS_REVERSE) {
 		la->packetAliasMode &= ~PKT_ALIAS_REVERSE;
-		iresult = LibAliasInLocked(la, ptr, maxpacketsize);
+		iresult = LibAliasInLocked(la, pip, maxpacketsize);
 		la->packetAliasMode |= PKT_ALIAS_REVERSE;
 		goto getout;
 	}
 	HouseKeeping(la);
 	ClearCheckNewLink(la);
-	pip = (struct ip *)ptr;
 
 	/* Defense against mangled packets */
 	if (ntohs(pip->ip_len) > maxpacketsize
@@ -1532,17 +1528,17 @@ LibAliasOutLocked(struct libalias *la, char *ptr,	/* valid IP packet */
 			if (error == 0)
  				iresult = PKT_ALIAS_OK;
  			else
- 				iresult = ProtoAliasOut(la, &pip->ip_src, 
+				iresult = ProtoAliasOut(la, pip,
 				    pip->ip_dst, pip->ip_p, &pip->ip_sum, create);
 		}
  			break;
 		default:
-			iresult = ProtoAliasOut(la, &pip->ip_src,
+			iresult = ProtoAliasOut(la, pip,
 			    pip->ip_dst, pip->ip_p, &pip->ip_sum, create);
 			break;
 		}
 	} else {
-		iresult = FragmentOut(la, &pip->ip_src, &pip->ip_sum);
+		iresult = FragmentOut(la, pip, &pip->ip_sum);
 	}
 
 	SetDefaultAliasAddress(la, addr_save);
@@ -1551,7 +1547,7 @@ getout:
 }
 
 int
-LibAliasUnaliasOut(struct libalias *la, char *ptr,	/* valid IP packet */
+LibAliasUnaliasOut(struct libalias *la, void *ptr,	/* valid IP packet */
     int maxpacketsize		/* for error checking */
 )
 {
diff --git a/sys/netinet/libalias/alias.h b/sys/netinet/libalias/alias.h
index a9935f7aa812..671241212799 100644
--- a/sys/netinet/libalias/alias.h
+++ b/sys/netinet/libalias/alias.h
@@ -93,10 +93,10 @@ unsigned int
 void		LibAliasUninit(struct libalias *);
 
 /* Packet Handling functions. */
-int		LibAliasIn (struct libalias *, char *_ptr, int _maxpacketsize);
-int		LibAliasOut(struct libalias *, char *_ptr, int _maxpacketsize);
-int		LibAliasOutTry(struct libalias *, char *_ptr, int _maxpacketsize, int _create);
-int		LibAliasUnaliasOut(struct libalias *, char *_ptr, int _maxpacketsize);
+int		LibAliasIn (struct libalias *, void *_ptr, int _maxpacketsize);
+int		LibAliasOut(struct libalias *, void *_ptr, int _maxpacketsize);
+int		LibAliasOutTry(struct libalias *, void *_ptr, int _maxpacketsize, int _create);
+int		LibAliasUnaliasOut(struct libalias *, void *_ptr, int _maxpacketsize);
 
 /* Port and address redirection functions. */
 
@@ -119,9 +119,9 @@ LibAliasRedirectProto(struct libalias *, struct in_addr _src_addr,
     unsigned char _proto);
 
 /* Fragment Handling functions. */
-void		LibAliasFragmentIn(struct libalias *, char *_ptr, char *_ptr_fragment);
-char           *LibAliasGetFragment(struct libalias *, char *_ptr);
-int		LibAliasSaveFragment(struct libalias *, char *_ptr);
+void		LibAliasFragmentIn(struct libalias *, void *_ptr, void *_ptr_fragment);
+void           *LibAliasGetFragment(struct libalias *, void *_ptr);
+int		LibAliasSaveFragment(struct libalias *, void *_ptr);
 
 /* Miscellaneous functions. */
 int		LibAliasCheckNewLink(struct libalias *);
diff --git a/sys/netinet/libalias/alias_db.c b/sys/netinet/libalias/alias_db.c
index e05cc3da948f..8da9a7fe683a 100644
--- a/sys/netinet/libalias/alias_db.c
+++ b/sys/netinet/libalias/alias_db.c
@@ -1742,13 +1742,13 @@ GetFragmentAddr(struct alias_link *lnk, struct in_addr *src_addr)
 }
 
 void
-SetFragmentPtr(struct alias_link *lnk, char *fptr)
+SetFragmentPtr(struct alias_link *lnk, void *fptr)
 {
 	lnk->data.frag_ptr = fptr;
 }
 
 void
-GetFragmentPtr(struct alias_link *lnk, char **fptr)
+GetFragmentPtr(struct alias_link *lnk, void **fptr)
 {
 	*fptr = lnk->data.frag_ptr;
 }
diff --git a/sys/netinet/libalias/alias_local.h b/sys/netinet/libalias/alias_local.h
index ff6c16f7d9eb..5919851a4019 100644
--- a/sys/netinet/libalias/alias_local.h
+++ b/sys/netinet/libalias/alias_local.h
@@ -322,8 +322,8 @@ FindNewPortGroup(struct libalias *la, struct in_addr _dst_addr, struct in_addr _
     u_char _proto, u_char _align);
 void		GetFragmentAddr(struct alias_link *_lnk, struct in_addr *_src_addr);
 void		SetFragmentAddr(struct alias_link *_lnk, struct in_addr _src_addr);
-void		GetFragmentPtr(struct alias_link *_lnk, char **_fptr);
-void		SetFragmentPtr(struct alias_link *_lnk, char *fptr);
+void		GetFragmentPtr(struct alias_link *_lnk, void **_fptr);
+void		SetFragmentPtr(struct alias_link *_lnk, void *fptr);
 void		SetStateIn(struct alias_link *_lnk, int _state);
 void		SetStateOut(struct alias_link *_lnk, int _state);
 int		GetStateIn (struct alias_link *_lnk);
diff --git a/sys/netinet/libalias/alias_proxy.c b/sys/netinet/libalias/alias_proxy.c
index fc8e148d62d0..79d9db82914c 100644
--- a/sys/netinet/libalias/alias_proxy.c
+++ b/sys/netinet/libalias/alias_proxy.c
@@ -382,7 +382,7 @@ ProxyEncodeIpHeader(struct ip *pip,
 #define OPTION_LEN_BYTES  8
 #define OPTION_LEN_INT16  4
 #define OPTION_LEN_INT32  2
-	u_char option[OPTION_LEN_BYTES];
+	_Alignas(_Alignof(u_short)) u_char option[OPTION_LEN_BYTES];
 
 #ifdef LIBALIAS_DEBUG
 	fprintf(stdout, " ip cksum 1 = %x\n", (u_int) IpChecksum(pip));
diff --git a/sys/netinet/libalias/libalias.3 b/sys/netinet/libalias/libalias.3
index c323edf4c499..beef2ff7fca5 100644
--- a/sys/netinet/libalias/libalias.3
+++ b/sys/netinet/libalias/libalias.3
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd December 25, 2013
+.Dd January 1, 2020
 .Dt LIBALIAS 3
 .Os
 .Sh NAME
@@ -311,7 +311,7 @@ comprise the minimal set of functions needed for a basic IP masquerading
 implementation.
 .Pp
 .Ft int
-.Fn LibAliasIn "struct libalias *" "char *buffer" "int maxpacketsize"
+.Fn LibAliasIn "struct libalias *" "void *buffer" "int maxpacketsize"
 .Bd -ragged -offset indent
 An incoming packet coming from a remote machine to the local network is
 de-aliased by this function.
@@ -352,7 +352,7 @@ An internal error within the packet aliasing engine occurred.
 .Ed
 .Pp
 .Ft int
-.Fn LibAliasOut "struct libalias *" "char *buffer" "int maxpacketsize"
+.Fn LibAliasOut "struct libalias *" "void *buffer" "int maxpacketsize"
 .Bd -ragged -offset indent
 An outgoing packet coming from the local network to a remote machine is
 aliased by this function.
@@ -770,7 +770,7 @@ Fragments which arrive before the header are saved and then retrieved
 once the header fragment has been resolved.
 .Pp
 .Ft int
-.Fn LibAliasSaveFragment "struct libalias *" "char *ptr"
+.Fn LibAliasSaveFragment "struct libalias *" "void *ptr"
 .Bd -ragged -offset indent
 When
 .Fn LibAliasIn
@@ -794,8 +794,8 @@ if it was successful and
 if there was an error.
 .Ed
 .Pp
-.Ft char *
-.Fn LibAliasGetFragment "struct libalias *" "char *buffer"
+.Ft void *
+.Fn LibAliasGetFragment "struct libalias *" "void *buffer"
 .Bd -ragged -offset indent
 This function can be used to retrieve fragment pointers saved by
 .Fn LibAliasSaveFragment .
@@ -816,7 +816,7 @@ available, at which time it returns
 .Ed
 .Pp
 .Ft void
-.Fn LibAliasFragmentIn "struct libalias *" "char *header" "char *fragment"
+.Fn LibAliasFragmentIn "struct libalias *" "void *header" "void *fragment"
 .Bd -ragged -offset indent
 When a fragment is retrieved with
 .Fn LibAliasGetFragment ,
@@ -896,7 +896,7 @@ will return zero.
 .Ed
 .Pp
 .Ft int
-.Fn LibAliasUnaliasOut "struct libalias *" "char *buffer" "int maxpacketsize"
+.Fn LibAliasUnaliasOut "struct libalias *" "void *buffer" "int maxpacketsize"
 .Bd -ragged -offset indent
 An outgoing packet, which has already been aliased,
 has its private address/port information restored by this function.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202101192138.10JLcFIt078410>