Re: [PATCH 3/3] restorecond/user: handle SIGTERM properly

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

 



On Mon, Apr 13, 2020 at 06:24:13PM +0200, Nicolas Iooss wrote:
> When restorecond starts, it installs a SIGTERM handler in order to exit
> cleanly (by removing its PID file). When restorecond --user starts,
> there is no PID file, and g_main_loop_run() does not stop when master_fd
> is closed. This leads to an unkillable service, which is an issue.
> 
> Fix this by overriding the handler for SIGTERM in restorecond --user.
> 
> Signed-off-by: Nicolas Iooss <nicolas.iooss@xxxxxxx>

The whole patchset

Acked-by: Petr Lautrbach <plautrba@xxxxxxxxxx>

and merged.

Thanks!


> ---
>  restorecond/user.c | 54 +++++++++++++++++++++++++++++++---------------
>  1 file changed, 37 insertions(+), 17 deletions(-)
> 
> diff --git a/restorecond/user.c b/restorecond/user.c
> index f940fd4e6678..a24b8407b048 100644
> --- a/restorecond/user.c
> +++ b/restorecond/user.c
> @@ -46,6 +46,7 @@
>  #include "restorecond.h"
>  #include "stringslist.h"
>  #include <glib.h>
> +#include <glib-unix.h>
>  
>  static int local_lock_fd = -1;
>  
> @@ -250,35 +251,54 @@ static void end_local_server(void) {
>  	local_lock_fd = -1;
>  }
>  
> +static int sigterm_handler(gpointer user_data)
> +{
> +	GMainLoop *loop = user_data;
> +
> +	if (debug_mode)
> +		g_print("Received SIGTERM, exiting\n");
> +	g_main_loop_quit(loop);
> +	return FALSE;
> +}
> +
> +
>  int server(int master_fd, const char *watch_file) {
> -    GMainLoop *loop;
> +	GMainLoop *loop;
>  
> -    loop = g_main_loop_new (NULL, FALSE);
> +	loop = g_main_loop_new (NULL, FALSE);
>  
>  #ifdef HAVE_DBUS
> -    if (dbus_server(loop) != 0)
> +	if (dbus_server(loop) != 0)
>  #endif /* HAVE_DBUS */
> -	    if (local_server())
> -		    goto end;
> +		if (local_server())
> +			goto end;
>  
> -    read_config(master_fd, watch_file);
> +	read_config(master_fd, watch_file);
>  
> -    if (watch_list_isempty()) goto end;
> +	if (watch_list_isempty())
> +		goto end;
>  
> -    set_matchpathcon_flags(MATCHPATHCON_NOTRANS);
> +	set_matchpathcon_flags(MATCHPATHCON_NOTRANS);
>  
> -    GIOChannel *c = g_io_channel_unix_new(master_fd);
> +	GIOChannel *c = g_io_channel_unix_new(master_fd);
>  
> -    g_io_add_watch_full( c,
> -			 G_PRIORITY_HIGH,
> -			 G_IO_IN|G_IO_ERR|G_IO_HUP,
> -			 io_channel_callback, NULL, NULL);
> +	g_io_add_watch_full(c,
> +			    G_PRIORITY_HIGH,
> +			    G_IO_IN|G_IO_ERR|G_IO_HUP,
> +			    io_channel_callback, NULL, NULL);
>  
> -    g_main_loop_run (loop);
> +	/* Handle SIGTERM */
> +	g_unix_signal_add_full(G_PRIORITY_DEFAULT,
> +			       SIGTERM,
> +			       sigterm_handler,
> +			       loop,
> +			       NULL);
> +
> +	g_main_loop_run (loop);
>  
>  end:
> -    end_local_server();
> -    g_main_loop_unref (loop);
> -    return 0;
> +	end_local_server();
> +	g_main_loop_unref (loop);
> +	return 0;
>  }
>  
> -- 
> 2.26.0
> 

-- 
()  ascii ribbon campaign - against html e-mail 
/\  www.asciiribbon.org   - against proprietary attachments

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux