Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Mar 2019 00:24:57 +0000 (UTC)
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r345563 - projects/fuse2/tests/sys/fs/fusefs
Message-ID:  <201903270024.x2R0Ov1e073868@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: asomers
Date: Wed Mar 27 00:24:57 2019
New Revision: 345563
URL: https://svnweb.freebsd.org/changeset/base/345563

Log:
  fusefs: fix a race condition in the allow_other test
  
  The test could occasionally hang if the parent's SIGUSR2 signal arrived
  before the child had pause()d.  Using POSIX semaphores precludes that
  possibility.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  projects/fuse2/tests/sys/fs/fusefs/allow_other.cc

Modified: projects/fuse2/tests/sys/fs/fusefs/allow_other.cc
==============================================================================
--- projects/fuse2/tests/sys/fs/fusefs/allow_other.cc	Tue Mar 26 22:45:41 2019	(r345562)
+++ projects/fuse2/tests/sys/fs/fusefs/allow_other.cc	Wed Mar 27 00:24:57 2019	(r345563)
@@ -35,10 +35,11 @@
 
 extern "C" {
 #include <sys/types.h>
+#include <sys/mman.h>
 #include <sys/wait.h>
 #include <fcntl.h>
 #include <pwd.h>
-#include <signal.h>
+#include <semaphore.h>
 }
 
 #include "mockfs.hh"
@@ -101,12 +102,17 @@ TEST_F(AllowOther, allowed)
 	uint64_t ino = 42;
 	int fd;
 	pid_t child;
+	sem_t *sem;
+	int mprot = PROT_READ | PROT_WRITE;
+	int mflags = MAP_ANON | MAP_SHARED;
 	
-	signal(SIGUSR2, sighandler);
+	sem = (sem_t*)mmap(NULL, sizeof(*sem), mprot, mflags, -1, 0);
+	ASSERT_NE(NULL, sem) << strerror(errno);
+	ASSERT_EQ(0, sem_init(sem, 1, 0)) << strerror(errno);
 
 	if ((child = fork()) == 0) {
 		/* In child */
-		pause();
+		ASSERT_EQ(0, sem_wait(sem)) << strerror(errno);
 
 		/* Drop privileges before accessing */
 		if (0 != setreuid(-1, m_uid)) {
@@ -122,6 +128,8 @@ TEST_F(AllowOther, allowed)
 
 		/* Deliberately leak fd */
 	} else if (child > 0) {
+		int child_status;
+
 		/* 
 		 * In parent.  Cleanup must happen here, because it's still
 		 * privileged.
@@ -134,8 +142,7 @@ TEST_F(AllowOther, allowed)
 		expect_getattr(ino, 0);
 		m_mock->m_child_pid = child;
 		/* Signal the child process to go */
-		kill(child, SIGUSR2);
-		int child_status;
+		ASSERT_EQ(0, sem_post(sem)) << strerror(errno);
 
 		wait(&child_status);
 		ASSERT_EQ(0, WEXITSTATUS(child_status));
@@ -149,12 +156,17 @@ TEST_F(NoAllowOther, disallowed)
 	const char FULLPATH[] = "mountpoint/some_file.txt";
 	int fd;
 	pid_t child;
-	
-	signal(SIGUSR2, sighandler);
+	sem_t *sem;
+	int mprot = PROT_READ | PROT_WRITE;
+	int mflags = MAP_ANON | MAP_SHARED;
 
+	sem = (sem_t*)mmap(NULL, sizeof(*sem), mprot, mflags, -1, 0);
+	ASSERT_NE(NULL, sem) << strerror(errno);
+	ASSERT_EQ(0, sem_init(sem, 1, 0)) << strerror(errno);
+
 	if ((child = fork()) == 0) {
 		/* In child */
-		pause();
+		ASSERT_EQ(0, sem_wait(sem)) << strerror(errno);
 
 		/* Drop privileges before accessing */
 		if (0 != setreuid(-1, m_uid)) {
@@ -180,7 +192,7 @@ TEST_F(NoAllowOther, disallowed)
 		 */
 		m_mock->m_child_pid = child;
 		/* Signal the child process to go */
-		kill(child, SIGUSR2);
+		ASSERT_EQ(0, sem_post(sem)) << strerror(errno);
 		int child_status;
 
 		wait(&child_status);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201903270024.x2R0Ov1e073868>