Let the kernel pick free random port and do not rely on previously used
formula: (getpid() % 32768) + 11000 to provide unused port numbers.

If test only needs unused port number (without binding anything to it)
get it with tst_get_unused_port().

Signed-off-by: Jan Stancek <[email protected]>
---
 testcases/kernel/syscalls/bind/bind01.c         |    2 +-
 testcases/kernel/syscalls/connect/connect01.c   |   17 ++++++++++-------
 testcases/kernel/syscalls/recv/recv01.c         |   15 +++++++++------
 testcases/kernel/syscalls/recvfrom/recvfrom01.c |   15 +++++++++------
 testcases/kernel/syscalls/recvmsg/recvmsg01.c   |   12 ++++++++----
 testcases/kernel/syscalls/send/send01.c         |   15 +++++++++------
 testcases/kernel/syscalls/sendfile/sendfile02.c |    6 +++++-
 testcases/kernel/syscalls/sendfile/sendfile04.c |    6 +++++-
 testcases/kernel/syscalls/sendfile/sendfile05.c |    6 +++++-
 testcases/kernel/syscalls/sendfile/sendfile06.c |    6 +++++-
 testcases/kernel/syscalls/sendmsg/sendmsg01.c   |   17 ++++++++++-------
 testcases/kernel/syscalls/sendto/sendto01.c     |   15 +++++++++------
 12 files changed, 85 insertions(+), 47 deletions(-)

diff --git a/testcases/kernel/syscalls/bind/bind01.c 
b/testcases/kernel/syscalls/bind/bind01.c
index ed02299..a3f4d90 100644
--- a/testcases/kernel/syscalls/bind/bind01.c
+++ b/testcases/kernel/syscalls/bind/bind01.c
@@ -162,7 +162,7 @@ void setup(void)
        /* initialize sockaddr's */
        sin1.sin_family = AF_INET;
        /* this port must be unused! */
-       sin1.sin_port = htons((getpid() % 32768) + 10000);
+       sin1.sin_port = tst_get_unused_port(AF_INET, SOCK_STREAM, NULL);
        sin1.sin_addr.s_addr = INADDR_ANY;
 
        sin2.sin_family = AF_INET;
diff --git a/testcases/kernel/syscalls/connect/connect01.c 
b/testcases/kernel/syscalls/connect/connect01.c
index 9fab087..4ef673b 100644
--- a/testcases/kernel/syscalls/connect/connect01.c
+++ b/testcases/kernel/syscalls/connect/connect01.c
@@ -175,15 +175,11 @@ void setup(void)
 {
        TEST_PAUSE;             /* if -p option specified */
 
-       /* initialize sockaddr's */
-       sin1.sin_family = AF_INET;
-       sin1.sin_port = htons((getpid() % 32768) + 11000);
-       sin1.sin_addr.s_addr = INADDR_ANY;
        pid = start_server(&sin1);
 
        sin2.sin_family = AF_INET;
        /* this port must be unused! */
-       sin2.sin_port = htons((getpid() % 32768) + 10000);
+       sin2.sin_port = tst_get_unused_port(AF_INET, SOCK_STREAM, NULL);
        sin2.sin_addr.s_addr = INADDR_ANY;
 
        sin3.sin_family = AF_INET;
@@ -243,15 +239,19 @@ void setup2(void)
 
 pid_t start_server(struct sockaddr_in *sin0)
 {
-       struct sockaddr_in sin1 = *sin0;
        pid_t pid;
+       socklen_t slen = sizeof(*sin0);
+
+       sin0->sin_family = AF_INET;
+       sin0->sin_port = 0; /* pick random free port */
+       sin0->sin_addr.s_addr = INADDR_ANY;
 
        sfd = socket(PF_INET, SOCK_STREAM, 0);
        if (sfd < 0) {
                tst_brkm(TBROK | TERRNO, cleanup, "server socket failed");
                return -1;
        }
-       if (bind(sfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
+       if (bind(sfd, (struct sockaddr *)sin0, sizeof(*sin0)) < 0) {
                tst_brkm(TBROK | TERRNO, cleanup, "server bind failed");
                return -1;
        }
@@ -259,6 +259,9 @@ pid_t start_server(struct sockaddr_in *sin0)
                tst_brkm(TBROK | TERRNO, cleanup, "server listen failed");
                return -1;
        }
+       if (getsockname(sfd, (struct sockaddr *)sin0, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        switch ((pid = FORK_OR_VFORK())) {
        case 0:         /* child */
 #ifdef UCLINUX
diff --git a/testcases/kernel/syscalls/recv/recv01.c 
b/testcases/kernel/syscalls/recv/recv01.c
index 4966587..0615acf 100644
--- a/testcases/kernel/syscalls/recv/recv01.c
+++ b/testcases/kernel/syscalls/recv/recv01.c
@@ -159,10 +159,6 @@ void setup(void)
 {
        TEST_PAUSE;
 
-       /* initialize sockaddr's */
-       sin1.sin_family = AF_INET;
-       sin1.sin_port = htons((getpid() % 32768) + 11000);
-       sin1.sin_addr.s_addr = INADDR_ANY;
        pid = start_server(&sin1);
 
        (void)signal(SIGPIPE, SIG_IGN);
@@ -221,15 +217,19 @@ void cleanup1(void)
 
 pid_t start_server(struct sockaddr_in *sin0)
 {
-       struct sockaddr_in sin1 = *sin0;
        pid_t pid;
+       socklen_t slen = sizeof(*sin0);
+
+       sin0->sin_family = AF_INET;
+       sin0->sin_port = 0; /* pick random free port */
+       sin0->sin_addr.s_addr = INADDR_ANY;
 
        sfd = socket(PF_INET, SOCK_STREAM, 0);
        if (sfd < 0) {
                tst_brkm(TBROK | TERRNO, cleanup, "server socket failed");
                return -1;
        }
-       if (bind(sfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
+       if (bind(sfd, (struct sockaddr *)sin0, sizeof(*sin0)) < 0) {
                tst_brkm(TBROK | TERRNO, cleanup, "server bind failed");
                return -1;
        }
@@ -237,6 +237,9 @@ pid_t start_server(struct sockaddr_in *sin0)
                tst_brkm(TBROK | TERRNO, cleanup, "server listen failed");
                return -1;
        }
+       if (getsockname(sfd, (struct sockaddr *)sin0, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        switch ((pid = FORK_OR_VFORK())) {
        case 0:         /* child */
 #ifdef UCLINUX
diff --git a/testcases/kernel/syscalls/recvfrom/recvfrom01.c 
b/testcases/kernel/syscalls/recvfrom/recvfrom01.c
index 171b3ab..b5ab4a0 100644
--- a/testcases/kernel/syscalls/recvfrom/recvfrom01.c
+++ b/testcases/kernel/syscalls/recvfrom/recvfrom01.c
@@ -181,10 +181,6 @@ void setup(void)
 {
        TEST_PAUSE;
 
-       /* initialize sockaddr's */
-       sin1.sin_family = AF_INET;
-       sin1.sin_port = htons((getpid() % 32768) + 11000);
-       sin1.sin_addr.s_addr = INADDR_ANY;
        pid = start_server(&sin1);
 }
 
@@ -248,15 +244,19 @@ void cleanup1(void)
 
 pid_t start_server(struct sockaddr_in *sin0)
 {
-       struct sockaddr_in sin1 = *sin0;
        pid_t pid;
+       socklen_t slen = sizeof(*sin0);
+
+       sin0->sin_family = AF_INET;
+       sin0->sin_port = 0; /* pick random free port */
+       sin0->sin_addr.s_addr = INADDR_ANY;
 
        sfd = socket(PF_INET, SOCK_STREAM, 0);
        if (sfd < 0) {
                tst_brkm(TBROK | TERRNO, cleanup, "server socket failed");
                return -1;
        }
-       if (bind(sfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
+       if (bind(sfd, (struct sockaddr *)sin0, sizeof(*sin0)) < 0) {
                tst_brkm(TBROK | TERRNO, cleanup, "server bind failed");
                return -1;
        }
@@ -264,6 +264,9 @@ pid_t start_server(struct sockaddr_in *sin0)
                tst_brkm(TBROK | TERRNO, cleanup, "server listen failed");
                return -1;
        }
+       if (getsockname(sfd, (struct sockaddr *)sin0, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        switch ((pid = FORK_OR_VFORK())) {
        case 0:         /* child */
 #ifdef UCLINUX
diff --git a/testcases/kernel/syscalls/recvmsg/recvmsg01.c 
b/testcases/kernel/syscalls/recvmsg/recvmsg01.c
index 847c0d1..dd6b3d5 100644
--- a/testcases/kernel/syscalls/recvmsg/recvmsg01.c
+++ b/testcases/kernel/syscalls/recvmsg/recvmsg01.c
@@ -260,10 +260,6 @@ void setup(void)
        int tfd;
        TEST_PAUSE;
 
-       /* initialize sockaddr's */
-       sin1.sin_family = AF_INET;
-       sin1.sin_port = htons((getpid() % 32768) + 11000);
-       sin1.sin_addr.s_addr = INADDR_ANY;
        tst_tmpdir();
        (void)strcpy(tmpsunpath, "udsockXXXXXX");
        tfd = mkstemp(tmpsunpath);
@@ -380,6 +376,11 @@ void cleanup2(void)
 pid_t start_server(struct sockaddr_in *ssin, struct sockaddr_un *ssun)
 {
        pid_t pid;
+       socklen_t slen = sizeof(*ssin);
+
+       ssin->sin_family = AF_INET;
+       ssin->sin_port = 0; /* pick random free port */
+       ssin->sin_addr.s_addr = INADDR_ANY;
 
        /* set up inet socket */
        sfd = socket(PF_INET, SOCK_STREAM, 0);
@@ -395,6 +396,9 @@ pid_t start_server(struct sockaddr_in *ssin, struct 
sockaddr_un *ssun)
                tst_brkm(TBROK | TERRNO, cleanup, "server listen failed");
                return -1;
        }
+       if (getsockname(sfd, (struct sockaddr *)ssin, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        /* set up UNIX-domain socket */
        ufd = socket(PF_UNIX, SOCK_STREAM, 0);
        if (ufd < 0) {
diff --git a/testcases/kernel/syscalls/send/send01.c 
b/testcases/kernel/syscalls/send/send01.c
index 6ebe131..5df4a55 100644
--- a/testcases/kernel/syscalls/send/send01.c
+++ b/testcases/kernel/syscalls/send/send01.c
@@ -165,15 +165,19 @@ static char *argv0;
 
 static pid_t start_server(struct sockaddr_in *sin0)
 {
-       struct sockaddr_in sin1 = *sin0;
        pid_t pid;
+       socklen_t slen = sizeof(*sin0);
+
+       sin0->sin_family = AF_INET;
+       sin0->sin_port = 0; /* pick random free port */
+       sin0->sin_addr.s_addr = INADDR_ANY;
 
        sfd = socket(PF_INET, SOCK_STREAM, 0);
        if (sfd < 0) {
                tst_brkm(TBROK | TERRNO, cleanup, "server socket failed");
                return -1;
        }
-       if (bind(sfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
+       if (bind(sfd, (struct sockaddr *)sin0, sizeof(*sin0)) < 0) {
                tst_brkm(TBROK | TERRNO, cleanup, "server bind failed");
                return -1;
        }
@@ -181,6 +185,9 @@ static pid_t start_server(struct sockaddr_in *sin0)
                tst_brkm(TBROK | TERRNO, cleanup, "server listen failed");
                return -1;
        }
+       if (getsockname(sfd, (struct sockaddr *)sin0, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        switch ((pid = FORK_OR_VFORK())) {
        case 0:
 #ifdef UCLINUX
@@ -299,10 +306,6 @@ static void setup(void)
 {
        TEST_PAUSE;
 
-       /* initialize sockaddr's */
-       sin1.sin_family = AF_INET;
-       sin1.sin_port = htons((getpid() % 32768) + 11000);
-       sin1.sin_addr.s_addr = INADDR_ANY;
        server_pid = start_server(&sin1);
 
        signal(SIGPIPE, SIG_IGN);
diff --git a/testcases/kernel/syscalls/sendfile/sendfile02.c 
b/testcases/kernel/syscalls/sendfile/sendfile02.c
index 8d60c44..d96e12e 100644
--- a/testcases/kernel/syscalls/sendfile/sendfile02.c
+++ b/testcases/kernel/syscalls/sendfile/sendfile02.c
@@ -232,6 +232,7 @@ void cleanup()
 int create_server(void)
 {
        static int count = 0;
+       socklen_t slen = sizeof(sin1);
 
        sockfd = socket(PF_INET, SOCK_DGRAM, 0);
        if (sockfd < 0) {
@@ -240,7 +241,7 @@ int create_server(void)
                return -1;
        }
        sin1.sin_family = AF_INET;
-       sin1.sin_port = htons(((getpid() * TST_TOTAL) % 32768) + 11000 + count);
+       sin1.sin_port = 0; /* pick random free port */
        sin1.sin_addr.s_addr = INADDR_ANY;
        count++;
        if (bind(sockfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
@@ -248,6 +249,9 @@ int create_server(void)
                         strerror(errno));
                return -1;
        }
+       if (getsockname(sockfd, (struct sockaddr *)&sin1, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        child_pid = FORK_OR_VFORK();
        if (child_pid < 0) {
                tst_brkm(TBROK, cleanup, "client/server fork failed: %s",
diff --git a/testcases/kernel/syscalls/sendfile/sendfile04.c 
b/testcases/kernel/syscalls/sendfile/sendfile04.c
index b366231..0444b12 100644
--- a/testcases/kernel/syscalls/sendfile/sendfile04.c
+++ b/testcases/kernel/syscalls/sendfile/sendfile04.c
@@ -218,6 +218,7 @@ void cleanup()
 int create_server(void)
 {
        static int count = 0;
+       socklen_t slen = sizeof(sin1);
 
        sockfd = socket(PF_INET, SOCK_DGRAM, 0);
        if (sockfd < 0) {
@@ -226,7 +227,7 @@ int create_server(void)
                return -1;
        }
        sin1.sin_family = AF_INET;
-       sin1.sin_port = htons(((getpid() * TST_TOTAL) % 32768) + 11000 + count);
+       sin1.sin_port = 0; /* pick random free port */
        sin1.sin_addr.s_addr = INADDR_ANY;
        count++;
        if (bind(sockfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
@@ -234,6 +235,9 @@ int create_server(void)
                         strerror(errno));
                return -1;
        }
+       if (getsockname(sockfd, (struct sockaddr *)&sin1, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        child_pid = FORK_OR_VFORK();
        if (child_pid < 0) {
                tst_brkm(TBROK, cleanup, "client/server fork failed: %s",
diff --git a/testcases/kernel/syscalls/sendfile/sendfile05.c 
b/testcases/kernel/syscalls/sendfile/sendfile05.c
index 09148f2..d4b302a 100644
--- a/testcases/kernel/syscalls/sendfile/sendfile05.c
+++ b/testcases/kernel/syscalls/sendfile/sendfile05.c
@@ -182,6 +182,7 @@ void cleanup()
 int create_server(void)
 {
        static int count = 0;
+       socklen_t slen = sizeof(sin1);
 
        sockfd = socket(PF_INET, SOCK_DGRAM, 0);
        if (sockfd < 0) {
@@ -190,7 +191,7 @@ int create_server(void)
                return -1;
        }
        sin1.sin_family = AF_INET;
-       sin1.sin_port = htons((getpid() % 32768) + 11000 + count);
+       sin1.sin_port = 0; /* pick random free port */
        sin1.sin_addr.s_addr = INADDR_ANY;
        count++;
        if (bind(sockfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
@@ -198,6 +199,9 @@ int create_server(void)
                         strerror(errno));
                return -1;
        }
+       if (getsockname(sockfd, (struct sockaddr *)&sin1, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        child_pid = FORK_OR_VFORK();
        if (child_pid < 0) {
                tst_brkm(TBROK, cleanup, "client/server fork failed: %s",
diff --git a/testcases/kernel/syscalls/sendfile/sendfile06.c 
b/testcases/kernel/syscalls/sendfile/sendfile06.c
index 2f253be..de512a9 100644
--- a/testcases/kernel/syscalls/sendfile/sendfile06.c
+++ b/testcases/kernel/syscalls/sendfile/sendfile06.c
@@ -204,6 +204,7 @@ void cleanup()
 int create_server(void)
 {
        static int count = 0;
+       socklen_t slen = sizeof(sin1);
 
        sockfd = socket(PF_INET, SOCK_DGRAM, 0);
        if (sockfd < 0) {
@@ -212,7 +213,7 @@ int create_server(void)
                return -1;
        }
        sin1.sin_family = AF_INET;
-       sin1.sin_port = htons((getpid() % 32768) + 11000 + count);
+       sin1.sin_port = 0; /* pick random free port */
        sin1.sin_addr.s_addr = INADDR_ANY;
        count++;
        if (bind(sockfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
@@ -220,6 +221,9 @@ int create_server(void)
                         strerror(errno));
                return -1;
        }
+       if (getsockname(sockfd, (struct sockaddr *)&sin1, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        child_pid = FORK_OR_VFORK();
        if (child_pid < 0) {
                tst_brkm(TBROK, cleanup, "client/server fork failed: %s",
diff --git a/testcases/kernel/syscalls/sendmsg/sendmsg01.c 
b/testcases/kernel/syscalls/sendmsg/sendmsg01.c
index 81d5770..c2b329d 100644
--- a/testcases/kernel/syscalls/sendmsg/sendmsg01.c
+++ b/testcases/kernel/syscalls/sendmsg/sendmsg01.c
@@ -461,8 +461,12 @@ int main(int argc, char *argv[])
 
 static pid_t start_server(struct sockaddr_in *sin0, struct sockaddr_un *sun0)
 {
-       struct sockaddr_in sin1 = *sin0;
        pid_t pid;
+       socklen_t slen = sizeof(*sin0);
+
+       sin0->sin_family = AF_INET;
+       sin0->sin_port = 0; /* pick random free port */
+       sin0->sin_addr.s_addr = INADDR_ANY;
 
        /* set up inet socket */
        sfd = socket(PF_INET, SOCK_STREAM, 0);
@@ -471,7 +475,7 @@ static pid_t start_server(struct sockaddr_in *sin0, struct 
sockaddr_un *sun0)
                         strerror(errno));
                return -1;
        }
-       if (bind(sfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
+       if (bind(sfd, (struct sockaddr *)sin0, sizeof(*sin0)) < 0) {
                tst_brkm(TBROK, cleanup, "server bind failed: %s",
                         strerror(errno));
                return -1;
@@ -481,6 +485,9 @@ static pid_t start_server(struct sockaddr_in *sin0, struct 
sockaddr_un *sun0)
                         strerror(errno));
                return -1;
        }
+       if (getsockname(sfd, (struct sockaddr *)sin0, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        /* set up UNIX-domain socket */
        ufd = socket(PF_UNIX, SOCK_DGRAM, 0);
        if (ufd < 0) {
@@ -577,10 +584,6 @@ static void setup(void)
        tst_sig(FORK, DEF_HANDLER, cleanup);
        TEST_PAUSE;
 
-       /* initialize sockaddr's */
-       sin1.sin_family = AF_INET;
-       sin1.sin_port = htons((getpid() % 32768) + 11000);
-       sin1.sin_addr.s_addr = INADDR_ANY;
 
        tst_tmpdir();
        snprintf(tmpsunpath, 1024, "udsock%ld", (long)time(NULL));
@@ -713,7 +716,7 @@ static void setup5(void)
         * 5-tuple than already connected
         */
        sin2 = sin1;
-       sin2.sin_port++;
+       sin2.sin_port = tst_get_unused_port(AF_INET, SOCK_STREAM, NULL);
 }
 
 static void setup6(void)
diff --git a/testcases/kernel/syscalls/sendto/sendto01.c 
b/testcases/kernel/syscalls/sendto/sendto01.c
index e2422ea..723ffde 100644
--- a/testcases/kernel/syscalls/sendto/sendto01.c
+++ b/testcases/kernel/syscalls/sendto/sendto01.c
@@ -237,15 +237,19 @@ static char *argv0;
 
 static pid_t start_server(struct sockaddr_in *sin0)
 {
-       struct sockaddr_in sin1 = *sin0;
        pid_t pid;
+       socklen_t slen = sizeof(*sin0);
+
+       sin0->sin_family = AF_INET;
+       sin0->sin_port = 0; /* pick random free port */
+       sin0->sin_addr.s_addr = INADDR_ANY;
 
        sfd = socket(PF_INET, SOCK_STREAM, 0);
        if (sfd < 0) {
                tst_brkm(TBROK | TERRNO, cleanup, "server socket failed");
                return -1;
        }
-       if (bind(sfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
+       if (bind(sfd, (struct sockaddr *)sin0, sizeof(*sin0)) < 0) {
                tst_brkm(TBROK | TERRNO, cleanup, "server bind failed");
                return -1;
        }
@@ -253,6 +257,9 @@ static pid_t start_server(struct sockaddr_in *sin0)
                tst_brkm(TBROK | TERRNO, cleanup, "server listen failed");
                return -1;
        }
+       if (getsockname(sfd, (struct sockaddr *)sin0, &slen) == -1)
+               tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed");
+
        switch ((pid = FORK_OR_VFORK())) {
        case 0:
 #ifdef UCLINUX
@@ -372,10 +379,6 @@ static void setup(void)
 {
        TEST_PAUSE;
 
-       /* initialize sockaddr's */
-       sin1.sin_family = AF_INET;
-       sin1.sin_port = htons((getpid() % 32768) + 11000);
-       sin1.sin_addr.s_addr = INADDR_ANY;
        server_pid = start_server(&sin1);
 
        signal(SIGPIPE, SIG_IGN);
-- 
1.7.1


------------------------------------------------------------------------------
Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce.
With Perforce, you get hassle-free workflows. Merge that actually works. 
Faster operations. Version large binaries.  Built-in WAN optimization and the
freedom to use Git, Perforce or both. Make the move to Perforce.
http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to