From: RĂ©mi Denis-Courmont Date: Wed, 12 Dec 2007 19:47:39 +0000 (+0000) Subject: Clear signal mask _between_ fork() and exec*(). X-Git-Tag: 0.9.0-test0~4149 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=c6b6537f4d82d799bb4ee6d4c8c1dc6b87c0542c;p=vlc Clear signal mask _between_ fork() and exec*(). Before fork() would break VLC's own sigmask. After exec*() would rely on the children program to do it (and many don't). --- diff --git a/modules/misc/screensaver.c b/modules/misc/screensaver.c index c2d76afc9d..f5fe626d1a 100644 --- a/modules/misc/screensaver.c +++ b/modules/misc/screensaver.c @@ -134,17 +134,22 @@ static void Deactivate( vlc_object_t *p_this ) *****************************************************************************/ static void Execute( intf_thread_t *p_this, const char *const *ppsz_args ) { - pid_t pid; - switch( pid = fork() ) + pid_t pid = fork(); + switch( pid ) { case 0: /* we're the child */ + { + sigset_t set; + sigemptyset (&set); + pthread_sigmask (SIG_SETMASK, &set, NULL); + /* We don't want output */ freopen( "/dev/null", "w", stdout ); freopen( "/dev/null", "w", stderr ); execv( ppsz_args[0] , (char *const *)ppsz_args ); /* If the file we want to execute doesn't exist we exit() */ - exit( 1 ); - break; + exit( EXIT_FAILURE ); + } case -1: /* we're the error */ msg_Dbg( p_this, "Couldn't fork() while launching %s", ppsz_args[0] ); diff --git a/src/extras/libc.c b/src/extras/libc.c index 03321034bf..ec6ee2e309 100644 --- a/src/extras/libc.c +++ b/src/extras/libc.c @@ -953,6 +953,11 @@ int __vlc_execve( vlc_object_t *p_object, int i_argc, char *const *ppsz_argv, return -1; case 0: + { + sigset_t set; + sigemptyset (&set); + pthread_sigmask (SIG_SETMASK, &set, NULL); + /* NOTE: * Like it or not, close can fail (and not only with EBADF) */ @@ -962,7 +967,8 @@ int __vlc_execve( vlc_object_t *p_object, int i_argc, char *const *ppsz_argv, && ((psz_cwd == NULL) || (chdir (psz_cwd) == 0))) execve (ppsz_argv[0], ppsz_argv, ppsz_env); - exit (1); + exit (EXIT_FAILURE); + } } close (fds[1]);