add new testcase for bind
PATCH v2 1/1 add new testcase for bind
With
0fb44559ffd6 af_unix: move unix_mknod() out of bindlock
the behavior of bind() for STREAM UNIX sockets changed in case a socket that is already bound is passed to bind() again.
This testcase fails for the new behavior and passes for the old one.
Signed-off-by Michael Moese <[email protected]>
Acked-by Petr Vorel <[email protected]>
---
Changes to v1:
I just cleaned the includes and comments as suggested.
runtest/syscalls | 1 + testcases/kernel/syscalls/bind/.gitignore | 1 + testcases/kernel/syscalls/bind/bind03.c | 101 ++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 testcases/kernel/syscalls/bind/bind03.c
runtest/syscalls +1 -0
@@ -29,6 +29,7 @@ asyncio02 asyncio02 bind01 bind01 bind02 bind02 +bind03 bind03 bdflush01 bdflush01
testcases/kernel/syscalls/bind/.gitignore +1 -0
@@ -1,2 +1,3 @@ /bind01 /bind02 +/bind03
testcases/kernel/syscalls/bind/bind03.c new file +101 -0
101 lines not on this page · raw message
Signature · 1 line
2.18.0
PATCH v2 1/1 add new testcase for bind
Hi!
Quoted 66 lines
testcases/kernel/syscalls/bind/bind03.c new file +66
-0+#include <errno.h> +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "tst_test.h" +#include "tst_safe_net.h" + +#define SOCK_NAME "socket.1" + +static int sock1, sock2; + +static char dir_path[PATH_MAX ]; +static char sockpath[PATH_MAX ]; + +void run (void ) +{ +struct sockaddr_un sun; + + sock1 =SAFE_SOCKET (PF_UNIX ,SOCK_STREAM ,0 ); + +memset (&sun,0 ,sizeof (sun)); + sun.sun_family =AF_UNIX ; +if (snprintf (sockpath,sizeof (sockpath),"%s/%s" , dir_path,SOCK_NAME ) + >=PATH_MAX ) { +tst_res (TBROK ,"bind_test: snprintf(sockpath)" ); +return ; + } +if (snprintf (sun.sun_path,sizeof (sun.sun_path),"%s" , sockpath) + >= (int )sizeof (sun.sun_path)) { +tst_res (TBROK ,"bind_test: snprintf(sun.sun_path)" ); +return ; + } + +SAFE_BIND (sock1, (struct sockaddr *)&sun,sizeof (sun)); + +/* +* Once a STREAM UNIX domain socket has been bound, it can't be +* rebound. Expected error is EINVAL. +*/ +if (bind (sock1, (struct sockaddr *)&sun,sizeof (sun)) ==0 ) { +tst_res (TFAIL ,"re-binding of socket succeeded" ); +return ; + } + +if (errno !=EINVAL ) { +tst_res (TFAIL |TERRNO ,"expected EINVAL" ); +return ; + } + + sock2 =SAFE_SOCKET (PF_UNIX ,SOCK_STREAM ,0 ); + +/* +* Since a socket is already bound to the pathname, it can't be bound +* to a second socket. Expected error is EADDRINUSE. +*/ +if (bind (sock2, (struct sockaddr *)&sun,sizeof (sun)) ==0 ) { +tst_res (TFAIL ,"bind() succeeded with already bound pathname!" ); +return ; + } + +if (errno !=EADDRINUSE ) { +tst_res (TFAIL |TERRNO ,"expected to fail with EADDRINUSE" ); +return ; + }
testcases/kernel/syscalls/bind/bind03.c line 86
Quoted 10 lines
testcases/kernel/syscalls/bind/bind03.c new file +10
-0+ +tst_res (TPASS ,"bind() failed with EADDRINUSE as expected" ); +} + + +static void setup (void ) +{ +strncpy (dir_path,"/tmp/unix_bind.XXXXXXX" ,PATH_MAX ); +if (mkdtemp (dir_path) ==NULL ) +tst_res (TBROK ,"cannot create temporary directory" );
We should use the test temporary directory here instead. I.e. set the needs_tmpdir flag in the tst_test structure and use a relative paths in the testcase.
Other than that this is fine.
Quoted 21 lines
testcases/kernel/syscalls/bind/bind03.c new file +15
-0+} + +static void cleanup (void ) +{ +close (sock1); +close (sock2); +unlink (sockpath); +rmdir (dir_path); +} + +static struct tst_test test = { + .setup = setup, + .cleanup = cleanup, + .test_all = run, +};Signature · 5 lines
2.18.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp
Signature · 2 lines
Cyril Hrubis [email protected]