diff options
| author | Steve Muckle <smuckle@google.com> | 2019-07-20 12:21:44 +0800 |
|---|---|---|
| committer | Steve Muckle <smuckle@google.com> | 2019-07-23 10:44:05 -0700 |
| commit | e20c7804907ae45e58371095ed0177b448c415d8 (patch) | |
| tree | 897d45f2601301b1f5aad20fc783cace1428fa74 | |
| parent | 8b6eb1f29b7c75722f9b3cce21bfce8c09571e2c (diff) | |
| download | platform_external_ltp-android10-tests-release.tar.gz platform_external_ltp-android10-tests-release.tar.bz2 platform_external_ltp-android10-tests-release.zip | |
fix race in sendmmsg01android-vts-10.0_r5android-vts-10.0_r4android-vts-10.0_r3android-vts-10.0_r2android-cts-10.0_r5android-cts-10.0_r4android-cts-10.0_r3android-cts-10.0_r2android10-tests-releaseandroid10-tests-dev
If the sender executes sendmmsg() before the receiver executes bind(),
the sender's message will lost.
Bug: 137941427
Test: ./sendmmsg01
Reported-by: caixu3@hisilicon.com
Change-Id: I2922149c9b3f2d4a083e9b9fd00990b5bb7bafc1
Signed-off-by: Steve Muckle <smuckle@google.com>
| -rw-r--r-- | testcases/kernel/syscalls/sendmmsg/sendmmsg01.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/testcases/kernel/syscalls/sendmmsg/sendmmsg01.c b/testcases/kernel/syscalls/sendmmsg/sendmmsg01.c index d1bdf40a1..ce100b2ee 100644 --- a/testcases/kernel/syscalls/sendmmsg/sendmmsg01.c +++ b/testcases/kernel/syscalls/sendmmsg/sendmmsg01.c @@ -5,6 +5,7 @@ #define _GNU_SOURCE #include <netinet/ip.h> +#include <semaphore.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -18,6 +19,8 @@ #define BUFSIZE 16 #define VLEN 2 +static sem_t send_sem; + static void *sender_thread(LTP_ATTRIBUTE_UNUSED void *arg) { struct sockaddr_in addr; @@ -50,6 +53,8 @@ static void *sender_thread(LTP_ATTRIBUTE_UNUSED void *arg) msg[1].msg_hdr.msg_iov = &msg2; msg[1].msg_hdr.msg_iovlen = 1; + sem_wait(&send_sem); + retval = sendmmsg(send_sockfd, msg, 2, 0); if (retval < 0) tst_brk(TFAIL|TTERRNO, "sendmmsg failed"); @@ -74,6 +79,8 @@ static void *receiver_thread(LTP_ATTRIBUTE_UNUSED void *arg) addr.sin_port = htons(1234); SAFE_BIND(receive_sockfd, (struct sockaddr *)&addr, sizeof(addr)); + sem_post(&send_sem); + memset(msgs, 0, sizeof(msgs)); for (i = 0; i < VLEN; i++) { iovecs[i].iov_base = bufs[i]; @@ -112,6 +119,8 @@ static void run(void) pthread_t sender; pthread_t receiver; + sem_init(&send_sem, 0, 0); + SAFE_PTHREAD_CREATE(&sender, NULL, sender_thread, NULL); SAFE_PTHREAD_CREATE(&receiver, NULL, receiver_thread, NULL); SAFE_PTHREAD_JOIN(sender, NULL); |
