[LTP] [PATCH] syscalls/setsockopt05: associate receiver with destination address
Jan Stancek
jstancek@redhat.com
Mon Aug 24 17:01:17 CEST 2020
----- Original Message -----
> Hi,
>
> On 24. 08. 20 14:10, Jan Stancek wrote:
> > to avoid sporadic ECONNREFUSED errors:
> > safe_net.c:202: BROK: setsockopt05.c:70: send(6, 0x3ffcaf7d828, 4000,
> > 32768) failed: ECONNREFUSED (111)
> >
> > Signed-off-by: Jan Stancek <jstancek@redhat.com>
> > ---
> > testcases/kernel/syscalls/setsockopt/setsockopt05.c | 5 +++--
> > 1 file changed, 3 insertions(+), 2 deletions(-)
> >
> > diff --git a/testcases/kernel/syscalls/setsockopt/setsockopt05.c
> > b/testcases/kernel/syscalls/setsockopt/setsockopt05.c
> > index e78ef236e337..469e5a64bf71 100644
> > --- a/testcases/kernel/syscalls/setsockopt/setsockopt05.c
> > +++ b/testcases/kernel/syscalls/setsockopt/setsockopt05.c
> > @@ -37,6 +37,7 @@ static void setup(void)
> > int real_uid = getuid();
> > int real_gid = getgid();
> > int sock;
> > + int port = TST_GET_UNUSED_PORT(AF_INET, SOCK_DGRAM);
> > struct ifreq ifr;
> >
> > SAFE_UNSHARE(CLONE_NEWUSER);
> > @@ -45,14 +46,14 @@ static void setup(void)
> > SAFE_FILE_PRINTF("/proc/self/uid_map", "0 %d 1", real_uid);
> > SAFE_FILE_PRINTF("/proc/self/gid_map", "0 %d 1", real_gid);
> >
> > - tst_init_sockaddr_inet_bin(&addr, INADDR_LOOPBACK, 12345);
> > + tst_init_sockaddr_inet_bin(&addr, INADDR_LOOPBACK, port);
>
> Please don't use TST_GET_UNUSED_PORT() this way. The correct way to do
> this is to set port to 0 and then read the address back using
> SAFE_GETSOCKNAME() after bind(). It's the same amount of code but
> without any race conditions.
Fair point.
>
> > sock = SAFE_SOCKET(AF_INET, SOCK_DGRAM, 0);
> > strcpy(ifr.ifr_name, "lo");
> > ifr.ifr_mtu = 1500;
> > SAFE_IOCTL(sock, SIOCSIFMTU, &ifr);
> > ifr.ifr_flags = IFF_UP;
> > SAFE_IOCTL(sock, SIOCSIFFLAGS, &ifr);
> > - SAFE_CLOSE(sock);
>
> Don't forget to close the socket in cleanup().
>
> > + SAFE_BIND(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr));
> > }
> >
> > static void run(void)
> >
>
> Though I wonder whether setsockopt(SO_NO_CHECK, 1) is really supposed to
> flush the partial packet. Are you sure it's not a bug in the kernel?
I assumed it's from previous one, not partial one. From man(7) udp:
ECONNREFUSED
No receiver was associated with the destination address.
This might be caused by a previous packet sent over the socket.
More information about the ltp
mailing list