diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | nptl/tst-cancel4-common.c | 18 | ||||
-rw-r--r-- | nptl/tst-cancel4-common.h | 14 | ||||
-rw-r--r-- | nptl/tst-cancel4.c | 37 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/mips/mips64/Makefile | 10 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/riscv/rv64/Makefile | 4 |
6 files changed, 47 insertions, 48 deletions
diff --git a/ChangeLog b/ChangeLog index f54496f8cb..92b86bf609 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2018-03-03 Adhemerval Zanella <adhemerval.zanella@linaro.org> + * nptl/tst-cancel4-common.h (set_socket_buffer): New function. + * nptl/tst-cancel4-common.c (do_test): Call set_socket_buffer + for socketpair endpoint. + * nptl/tst-cancel4.c (tf_send): Call set_socket_buffer and use + WRITE_BUFFER_SIZE as buffer size for sending socket. + (tf_sendto): Use SOCK_STREAM instead of SOCK_DGRAM and fix an + issue on system where send is implemented with sendto syscall. + * sysdeps/unix/sysv/linux/mips/mips64/Makefile [$(subdir) = socket] + (CFLAGS-recv.c, CFLAGS-send.c): Remove rules. + [$(subdir) = nptl] (CFLAGS-recv.c, CFLAGS-send.c): Likewise. + * sysdeps/unix/sysv/linux/riscv/rv64/Makefile: Remove file. + [BZ #21269] * sysdeps/unix/sysv/linux/i386/Makefile (tests): Add tst-bz21269. * sysdeps/unix/sysv/linux/i386/sigaction.c (SET_SA_RESTORER): Clear diff --git a/nptl/tst-cancel4-common.c b/nptl/tst-cancel4-common.c index 5bc7e44ae2..c6eee735db 100644 --- a/nptl/tst-cancel4-common.c +++ b/nptl/tst-cancel4-common.c @@ -20,29 +20,13 @@ static int do_test (void) { - int val; - socklen_t len; - if (socketpair (AF_UNIX, SOCK_STREAM, PF_UNIX, fds) != 0) { perror ("socketpair"); exit (1); } - val = 1; - len = sizeof(val); - setsockopt (fds[1], SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); - if (getsockopt (fds[1], SOL_SOCKET, SO_SNDBUF, &val, &len) < 0) - { - perror ("getsockopt"); - exit (1); - } - if (val >= WRITE_BUFFER_SIZE) - { - puts ("minimum write buffer size too large"); - exit (1); - } - setsockopt (fds[1], SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); + set_socket_buffer (fds[1]); if (mktemp (fifoname) == NULL) { diff --git a/nptl/tst-cancel4-common.h b/nptl/tst-cancel4-common.h index a526c0cca1..10cc4f36ce 100644 --- a/nptl/tst-cancel4-common.h +++ b/nptl/tst-cancel4-common.h @@ -62,6 +62,20 @@ static pthread_barrier_t b2; #define WRITE_BUFFER_SIZE 16384 +/* Set the send buffer of socket S to 1 byte so any send operation + done with WRITE_BUFFER_SIZE bytes will force syscall blocking. */ +static void +set_socket_buffer (int s) +{ + int val = 1; + socklen_t len = sizeof(val); + + TEST_VERIFY_EXIT (setsockopt (s, SOL_SOCKET, SO_SNDBUF, &val, + sizeof(val)) == 0); + TEST_VERIFY_EXIT (getsockopt (s, SOL_SOCKET, SO_SNDBUF, &val, &len) == 0); + TEST_VERIFY_EXIT (val < WRITE_BUFFER_SIZE); +} + /* Cleanup handling test. */ static int cl_called; diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c index 92a3d808bd..05325385b1 100644 --- a/nptl/tst-cancel4.c +++ b/nptl/tst-cancel4.c @@ -726,6 +726,8 @@ tf_send (void *arg) if (tempfd2 == -1) FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); + set_socket_buffer (tempfd2); + if (connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun)) != 0) FAIL_EXIT1 ("connect: %m"); @@ -738,8 +740,7 @@ tf_send (void *arg) pthread_cleanup_push (cl, NULL); - /* Very large block, so that the send call blocks. */ - char mem[700000]; + char mem[WRITE_BUFFER_SIZE]; send (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0); @@ -1230,16 +1231,11 @@ tf_msync (void *arg) static void * tf_sendto (void *arg) { - if (arg == NULL) - // XXX If somebody can provide a portable test case in which sendto() - // blocks we can enable this test to run in both rounds. - abort (); - struct sockaddr_un sun; - tempfd = socket (AF_UNIX, SOCK_DGRAM, 0); + tempfd = socket (AF_UNIX, SOCK_STREAM, 0); if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); + FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); int tries = 0; do @@ -1254,23 +1250,30 @@ tf_sendto (void *arg) while (bind (tempfd, (struct sockaddr *) &sun, offsetof (struct sockaddr_un, sun_path) + strlen (sun.sun_path) + 1) != 0); - tempfname = strdup (sun.sun_path); - tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0); + listen (tempfd, 5); + + tempfd2 = socket (AF_UNIX, SOCK_STREAM, 0); if (tempfd2 == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); + FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); - xpthread_barrier_wait (&b2); + set_socket_buffer (tempfd2); + + if (connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun)) != 0) + FAIL_EXIT1 ("connect: %m"); + + unlink (sun.sun_path); xpthread_barrier_wait (&b2); + if (arg != NULL) + xpthread_barrier_wait (&b2); + pthread_cleanup_push (cl, NULL); - char mem[1]; + char mem[WRITE_BUFFER_SIZE]; - sendto (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0, - (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) + strlen (sun.sun_path) + 1); + sendto (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0, NULL, 0); pthread_cleanup_pop (0); diff --git a/sysdeps/unix/sysv/linux/mips/mips64/Makefile b/sysdeps/unix/sysv/linux/mips/mips64/Makefile index b4fb190bba..fcb48c0f56 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/Makefile +++ b/sysdeps/unix/sysv/linux/mips/mips64/Makefile @@ -1,13 +1,3 @@ -ifeq ($(subdir),socket) -CFLAGS-recv.c += -fexceptions -CFLAGS-send.c += -fexceptions -endif - -ifeq ($(subdir),nptl) -CFLAGS-recv.c += -fexceptions -CFLAGS-send.c += -fexceptions -endif - ifeq ($(subdir),signal) # sigaction.c defines static functions in asms and refers to them from # C code, resulting in "'restore_rt' used but never defined" (which diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/Makefile b/sysdeps/unix/sysv/linux/riscv/rv64/Makefile deleted file mode 100644 index cb60d74047..0000000000 --- a/sysdeps/unix/sysv/linux/riscv/rv64/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -ifeq ($(subdir),socket) -CFLAGS-recv.c += -fexceptions -CFLAGS-send.c += -fexceptions -endif |