[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20240927140645.02515695@hermes.local>
Date: Fri, 27 Sep 2024 14:06:45 -0700
From: Stephen Hemminger <stephen@...workplumber.org>
To: Dario Binacchi <dario.binacchi@...rulasolutions.com>
Cc: netdev@...r.kernel.org, linux-amarula@...rulasolutions.com
Subject: Re: [iproute2, RESEND PATCH 1/2] arpd: use designated initializers
for msghdr structure
On Sun, 22 Sep 2024 16:46:12 +0200
Dario Binacchi <dario.binacchi@...rulasolutions.com> wrote:
> This patch fixes the following error:
>
> arpd.c:442:17: error: initialization of 'int' from 'void *' makes integer from pointer without a cast [-Wint-conversion]
> 442 | NULL, 0,
>
> raised by Buildroot autobuilder [1].
>
> In the case in question, the analysis of socket.h [2] containing the
> msghdr structure shows that it has been modified with the addition of
> padding fields, which cause the compilation error. The use of designated
> initializers allows the issue to be fixed.
>
> struct msghdr {
> void *msg_name;
> socklen_t msg_namelen;
> struct iovec *msg_iov;
> #if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __BIG_ENDIAN
> int __pad1;
> #endif
> int msg_iovlen;
> #if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __LITTLE_ENDIAN
> int __pad1;
> #endif
> void *msg_control;
> #if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __BIG_ENDIAN
> int __pad2;
> #endif
> socklen_t msg_controllen;
> #if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __LITTLE_ENDIAN
> int __pad2;
> #endif
> int msg_flags;
> };
That is a really bad idea to put extra padding in there.
>
> [1] http://autobuild.buildroot.org/results/e4cdfa38ae9578992f1c0ff5c4edae3cc0836e3c/
> [2] iproute2/host/mips64-buildroot-linux-musl/sysroot/usr/include/sys/socket.h
>
> Signed-off-by: Dario Binacchi <dario.binacchi@...rulasolutions.com>
> ---
> misc/arpd.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/misc/arpd.c b/misc/arpd.c
> index e77ef53928a2..b4935c23eebb 100644
> --- a/misc/arpd.c
> +++ b/misc/arpd.c
> @@ -437,10 +437,10 @@ static void get_kern_msg(void)
> struct iovec iov;
> char buf[8192];
> struct msghdr msg = {
> - (void *)&nladdr, sizeof(nladdr),
> - &iov, 1,
> - NULL, 0,
> - 0
> + .msg_name = &nladdr, .msg_namelen = sizeof(nladdr),
When converting, to named initializer, please put one per line
like other code does in iproute.
> + .msg_iov = &iov, .msg_iovlen = 1,
> + .msg_control = (void *)NULL, .msg_controllen = 0,
The C standard says that NULL can be used for void *, cast there
is unnecessary.
> + .msg_flags = 0
> };
>
> iov.iov_base = buf;
Powered by blists - more mailing lists