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

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 )
*****************************************************************************/
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] );
......
......@@ -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]);
......
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