NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: PR/53998 CVS commit: src/sys/kern



The following reply was made to PR kern/53998; it has been noted by GNATS.

From: =?UTF-8?Q?BERTRAND_Jo=c3=abl?= <joel.bertrand%systella.fr@localhost>
To: gnats-bugs%NetBSD.org@localhost, kern-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost,
        netbsd-bugs%netbsd.org@localhost
Cc: 
Subject: Re: PR/53998 CVS commit: src/sys/kern
Date: Sat, 23 Feb 2019 11:04:16 +0100

 This is a multi-part message in MIME format.
 --------------C83B134363CD954F89200937
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 7bit
 
 	Hello,
 
 	I have found another strange behavior with POSIX semaphores that could
 be related to this PR. I have attached a little test program. This
 program only does two fork() to daemonize itself.
 
 	Please note that it creates two named semaphores, one in main program
 and another one in daemonized process.
 
 schwarz# gcc daemon.c -g -lrt
 schwarz# ./a.out
 > /TEST-29002
 Parent process
 < /TEST-29002
 [1]   Segmentation fault (core dumped) ./a.out
 schwarz# End of second process
 Daemonized process
 > /TEST-19064
 Closing semaphore
 < /TEST-19064
 
 	sem_close() raises a segfault:
 
 Program terminated with signal SIGSEGV, Segmentation fault.
 #0  0x0000759346a017b8 in sem_close () from /usr/lib/librt.so.1
 (gdb) bt
 #0  0x0000759346a017b8 in sem_close () from /usr/lib/librt.so.1
 #1  0x0000000000400c1a in sem_delete (semaphore=0x7f7fff6b44f0) at
 daemon.c:36
 #2  0x0000000000400d1c in main () at daemon.c:84
 
 	To be clear, each segfault triggers a segfault and a.out generates two
 a.out.core (one for main program, second one for daemonized process).
 
 	Same program perfetcly runs on a Linux workstation :
 
 hilbert:[~] > ./a.out
 > /TEST-26345
 Parent process
 < /TEST-26345
 sem_close: Invalid argument
 After sem_close()
 End of parent process
 hilbert:[~] > End of second process
 Daemonized process
 > /TEST-26347
 Closing semaphore
 < /TEST-26347
 sem_close: Invalid argument
 After sem_close()
 End
 
 	Best regards,
 
 	JKB
 
 
 --------------C83B134363CD954F89200937
 Content-Type: text/x-csrc;
  name="daemon.c"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
  filename="daemon.c"
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <semaphore.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 
 static void
 sem_create(sem_t *semaphore)
 {
 	char	name[15];
 
 	sprintf(name, "/TEST-%d", getpid());
 	printf("> %s\n", name);
 	fflush(NULL);
 
 	if ((semaphore = sem_open(name, O_RDWR | O_CREAT | O_EXCL,
 			S_IRUSR | S_IWUSR, 0)) == SEM_FAILED)
 	{
 		perror("sem_open()");
 		fflush(NULL);
 	}
 
 	return;
 }
 
 static void
 sem_delete(sem_t *semaphore)
 {
 	char	name[15];
 
 	sprintf(name, "/TEST-%d", getpid());
 	printf("< %s\n", name);
 	fflush(NULL);
 
 	if (sem_close(semaphore) != 0)
 	{
 		perror("sem_close");
 		fflush(NULL);
 	}
 
 	printf("After sem_close()\n");
 	sem_unlink(name);
 
 	return;
 }
 
 int
 main()
 {
 	int		pid;
 	sem_t	semaphore;
 
 	sem_create(&semaphore);
 
 	pid = fork();
 
 	if (pid > 0)
 	{
 		printf("Parent process\n");
 		sem_delete(&semaphore);
 		printf("End of parent process\n");
 		fflush(NULL);
 		_exit(EXIT_SUCCESS);
 	}
 
 	sleep(1);
 
 	setsid();
 	pid = fork();
 
 	if (pid > 0)
 	{
 		printf("End of second process\n");
 		fflush(NULL);
 		_exit(EXIT_SUCCESS);
 	}
 
 	printf("Daemonized process\n");
 	fflush(NULL);
 	sem_create(&semaphore);
 	printf("Closing semaphore\n");
 	fflush(NULL);
 	sem_delete(&semaphore);
 	printf("End\n");
 	fflush(NULL);
 
 	sleep(1);
 
 	exit(EXIT_SUCCESS);
 }
 
 --------------C83B134363CD954F89200937--
 


Home | Main Index | Thread Index | Old Index