Skip to contentSkip to conversation

do not pick free/unused port by chance

PATCH Superseded Jan Stancek 3 participants 7 messages Mar 7, 2014 – Mar 11, 2014 Library code

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

cover do not pick free/unused port by chance

I'm rarely seeing tests like bind01, connect01, recv01, recvfrom01, recvmsg01, send01, sendfile0X, sendmsg01 and sendto01 failing. All these are picking ports with
formula: (getpid() % 32768) + 11000, which occasionally collides with test harness (beah) used in automated environment, which is running on ports 12432/12434.

This series removes that formula and lets kernel pick random free unused port instead. If test has no intention of binding any server on that port, but still needs some unused port number it can use newly added tst_get_unused_port() function.

Jan Stancek (2):
add tst_get_unused_port()
do not pick free/unused port by chance

 include/test.h                                  |    7 ++
 lib/tst_net.c                                   |   81 +++++++++++++++++++++++
 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 +++--
 14 files changed, 173 insertions(+), 47 deletions(-)
 create mode 100644 lib/tst_net.c

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

#1 lore raw

PATCH 1/2 add tst_get_unused_port()

Returns unused port number for specified domain/type.

---
 include/test.h |    7 +++++
 lib/tst_net.c  |   81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 0 deletions(-)
 create mode 100644 lib/tst_net.c
include/test.h +7 -0
index 81fca3e..49a0f47 100644
@@ -288,6 +288,13 @@ int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount);
 uid_t tst_get_unused_uid(void);
 gid_t tst_get_unused_gid(void);
 
+/* lib/tst_net.c
+ *
+ * Return unused port
+ */
+unsigned short tst_get_unused_port(unsigned short family, int type,
+	void (cleanup_fn)(void));
+
 #ifdef TST_USE_COMPAT16_SYSCALL
 #define TCID_BIT_SUFFIX "_16"
 #elif  TST_USE_NEWER64_SYSCALL
lib/tst_net.c new file +81 -0

81 lines not on this page · raw message

Signature · 13 lines
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
#2 lore raw

Re: [LTP] [PATCH 1/2] add tst_get_unused_port()

Quoted 1 line · On Fri 07 Mar 2014 12:39:24 Jan Stancek wrote:

Returns unused port number for specified domain/type.

the new func isn't race free, but it is way better than the current code, and the race is pretty small. so LGTM.

lib/tst_net.c line 34

Quoted 6 lines
lib/tst_net.c new file +6 -0
+unsigned short tst_get_unused_port(unsigned short family, int type,
+	void (cleanup_fn)(void))
+{
+	int sock;
+	struct sockaddr_in addr4;
+	struct sockaddr_in6 addr6;

the current code works, but isn't the point of sockaddr_storage to avoid this duplicated storage logic ? so you could just do:

	struct sockaddr_storage _addr;
	struct sockaddr *addr = (struct sockaddr *)&_addr;
	struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
	struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;

-mike

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

#3 lore raw

[LTP] (no subject)

In reply to Jan Stancek

From: Jan Stancek <[email protected]>
Date: Fri, 7 Mar 2014 10:08:30 +0100
Subject: [PATCH v2 1/2] add tst_get_unused_port()

Returns unused port number for specified domain/type.

---
 include/test.h |    7 +++++
 lib/tst_net.c  |   80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 0 deletions(-)
 create mode 100644 lib/tst_net.c

Changes in v2:
- use sockaddr_storage as suggested by Mike

include/test.h +7 -0
index 81fca3e..49a0f47 100644
@@ -288,6 +288,13 @@ int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount);
 uid_t tst_get_unused_uid(void);
 gid_t tst_get_unused_gid(void);
 
+/* lib/tst_net.c
+ *
+ * Return unused port
+ */
+unsigned short tst_get_unused_port(unsigned short family, int type,
+	void (cleanup_fn)(void));
+
 #ifdef TST_USE_COMPAT16_SYSCALL
 #define TCID_BIT_SUFFIX "_16"
 #elif  TST_USE_NEWER64_SYSCALL
lib/tst_net.c new file +80 -0

80 lines not on this page · raw message

Signature · 13 lines
1.7.1


------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
#4 lore raw

PATCH v2 1/2 add tst_get_unused_port()

In reply to Jan Stancek

Returns unused port number for specified domain/type.

---
 include/test.h |    7 +++++
 lib/tst_net.c  |   80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 0 deletions(-)
 create mode 100644 lib/tst_net.c
include/test.h +7 -0
index 81fca3e..49a0f47 100644
@@ -288,6 +288,13 @@ int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount);
 uid_t tst_get_unused_uid(void);
 gid_t tst_get_unused_gid(void);
 
+/* lib/tst_net.c
+ *
+ * Return unused port
+ */
+unsigned short tst_get_unused_port(unsigned short family, int type,
+	void (cleanup_fn)(void));
+
 #ifdef TST_USE_COMPAT16_SYSCALL
 #define TCID_BIT_SUFFIX "_16"
 #elif  TST_USE_NEWER64_SYSCALL
lib/tst_net.c new file +80 -0

80 lines not on this page · raw message

Signature · 13 lines
1.7.1


------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
#5 lore raw

Re: [LTP] [PATCH v2 1/2] add tst_get_unused_port()

Hi!

Quoted 14 lines

Returns unused port number for specified domain/type.

---
 include/test.h |    7 +++++
 lib/tst_net.c  |   80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 0 deletions(-)
 create mode 100644 lib/tst_net.c
include/test.h +0 -0
index 81fca3e..49a0f47 100644

include/test.h int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount); · line 296

Quoted 9 lines
include/test.h +6 -0
@@ -288,6 +288,13 @@ int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount);
 uid_t tst_get_unused_uid(void);
 gid_t tst_get_unused_gid(void);
 
+/* lib/tst_net.c
+ *
+ * Return unused port
+ */
+unsigned short tst_get_unused_port(unsigned short family, int type,
+	void (cleanup_fn)(void));

Just am minor nit to the API. Most of the tst_ functions as well as SAFE_MACROS() have cleanup callback as first parameter. Let's be consistent with that.

Signature · 13 lines
Cyril Hrubis
[email protected]

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
#6 lore raw

PATCH 2/2 do not pick free/unused port by chance

In reply to Jan Stancek

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().

---
 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(-)
testcases/kernel/syscalls/bind/bind01.c +1 -1
index ed02299..a3f4d90 100644
@@ -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;
testcases/kernel/syscalls/connect/connect01.c +10 -7
index 9fab087..4ef673b 100644
@@ -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
testcases/kernel/syscalls/recv/recv01.c +9 -6
index 4966587..0615acf 100644
@@ -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
testcases/kernel/syscalls/recvfrom/recvfrom01.c +9 -6
index 171b3ab..b5ab4a0 100644
@@ -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
testcases/kernel/syscalls/recvmsg/recvmsg01.c +8 -4
index 847c0d1..dd6b3d5 100644
@@ -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) {
testcases/kernel/syscalls/send/send01.c +9 -6
index 6ebe131..5df4a55 100644
@@ -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);
testcases/kernel/syscalls/sendfile/sendfile02.c +5 -1
index 8d60c44..d96e12e 100644
@@ -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",
testcases/kernel/syscalls/sendfile/sendfile04.c +5 -1
index b366231..0444b12 100644
@@ -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",
testcases/kernel/syscalls/sendfile/sendfile05.c +5 -1
index 09148f2..d4b302a 100644
@@ -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",
testcases/kernel/syscalls/sendfile/sendfile06.c +5 -1
index 2f253be..de512a9 100644
@@ -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",
testcases/kernel/syscalls/sendmsg/sendmsg01.c +10 -7
index 81d5770..c2b329d 100644
@@ -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)
testcases/kernel/syscalls/sendto/sendto01.c +9 -6
index e2422ea..723ffde 100644
@@ -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);
Signature · 13 lines
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