aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Muckle <smuckle@google.com>2019-07-20 12:21:44 +0800
committerSteve Muckle <smuckle@google.com>2019-07-23 10:44:05 -0700
commite20c7804907ae45e58371095ed0177b448c415d8 (patch)
tree897d45f2601301b1f5aad20fc783cace1428fa74
parent8b6eb1f29b7c75722f9b3cce21bfce8c09571e2c (diff)
downloadplatform_external_ltp-android10-tests-release.tar.gz
platform_external_ltp-android10-tests-release.tar.bz2
platform_external_ltp-android10-tests-release.zip
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.c9
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);