Commit c6b6537f authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

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).
parent 6c62642f
...@@ -134,17 +134,22 @@ static void Deactivate( vlc_object_t *p_this ) ...@@ -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 ) static void Execute( intf_thread_t *p_this, const char *const *ppsz_args )
{ {
pid_t pid; pid_t pid = fork();
switch( pid = fork() ) switch( pid )
{ {
case 0: /* we're the child */ case 0: /* we're the child */
{
sigset_t set;
sigemptyset (&set);
pthread_sigmask (SIG_SETMASK, &set, NULL);
/* We don't want output */ /* We don't want output */
freopen( "/dev/null", "w", stdout ); freopen( "/dev/null", "w", stdout );
freopen( "/dev/null", "w", stderr ); freopen( "/dev/null", "w", stderr );
execv( ppsz_args[0] , (char *const *)ppsz_args ); execv( ppsz_args[0] , (char *const *)ppsz_args );
/* If the file we want to execute doesn't exist we exit() */ /* If the file we want to execute doesn't exist we exit() */
exit( 1 ); exit( EXIT_FAILURE );
break; }
case -1: /* we're the error */ case -1: /* we're the error */
msg_Dbg( p_this, "Couldn't fork() while launching %s", msg_Dbg( p_this, "Couldn't fork() while launching %s",
ppsz_args[0] ); ppsz_args[0] );
......
...@@ -953,6 +953,11 @@ int __vlc_execve( vlc_object_t *p_object, int i_argc, char *const *ppsz_argv, ...@@ -953,6 +953,11 @@ int __vlc_execve( vlc_object_t *p_object, int i_argc, char *const *ppsz_argv,
return -1; return -1;
case 0: case 0:
{
sigset_t set;
sigemptyset (&set);
pthread_sigmask (SIG_SETMASK, &set, NULL);
/* NOTE: /* NOTE:
* Like it or not, close can fail (and not only with EBADF) * 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, ...@@ -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))) && ((psz_cwd == NULL) || (chdir (psz_cwd) == 0)))
execve (ppsz_argv[0], ppsz_argv, ppsz_env); execve (ppsz_argv[0], ppsz_argv, ppsz_env);
exit (1); exit (EXIT_FAILURE);
}
} }
close (fds[1]); close (fds[1]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment