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
This commit is contained in:
Alex Richardson 2021-01-19 11:32:32 +00:00
parent 4bbfe4bf08
commit bc596e5632
6 changed files with 69 additions and 73 deletions

View File

@ -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 */
)
{

View File

@ -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 *);

View File

@ -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;
}

View File

@ -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);

View File

@ -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));

View File

@ -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.