[Pidgin] #7902: The sighandler() function in pidgin/gtkmain.c doesn't restore a SIGALRM handler.
Pidgin
trac at pidgin.im
Thu Dec 25 13:16:38 EST 2008
#7902: The sighandler() function in pidgin/gtkmain.c doesn't restore a SIGALRM
handler.
--------------------------------------+-------------------------------------
Reporter: quonsto | Owner:
Type: defect | Status: new
Milestone: | Component: pidgin (gtk)
Version: 2.5.3 | Resolution:
Keywords: pidgin SIGALRM gstreamer |
--------------------------------------+-------------------------------------
Description changed by quonsto:
Old description:
> pidgin/gtkmain.c contains code, which looks like this:
>
> {{{
> #if defined(USE_GSTREAMER) && !defined(GST_CAN_DISABLE_FORKING)
> /* ... skipped long comment ... */
> case SIGCHLD:
> /* Restore signal catching */
> signal(SIGCHLD, sighandler);
> alarm(1);
> break;
> case SIGALRM:
> #else
> case SIGCHLD:
> #endif
> clean_pid();
> /* Restore signal catching */
> signal(SIGCHLD, sighandler);
> break;
> }}}
>
> If this code is compiled with macro USE_GSTREAMER defined and
> GST_CAN_DISABLE_FORKING not defined, it may lead to an uncatched SIGALRM
> (and pidgin termination), if the pidgin process receives more than one
> SIGCHLD during its lifetime.
>
> The problem is a SIGALRM handler which erroneously restores SIGCHLD
> handler instead of SIGALRM.
>
> The code after '#endif' in this piece of code is good for the case when
> being compiled without USE_GSTREAMER macro, or with
> GST_CAN_DISABLE_FORKING. [[BR]]
> But it doesn't suit otherwise.
>
> The proposed patch is to completely split the mentioned piece of code
> into two cases: one for "defined(USE_GSTREAMER) &&
> !defined(GST_CAN_DISABLE_FORKING)" and the other for the opposite case.
>
> A variant of the patch, implemeting this idea is given below:
>
> {{{
>
> --- gtkmain.c.orig 2008-12-21 03:38:16.000000000 +0300
> +++ gtkmain.c 2008-12-25 20:51:57.949286800 +0300
> @@ -207,13 +207,17 @@
> alarm(1);
> break;
> case SIGALRM:
> + clean_pid();
> + /* Restore signal catching */
> + signal(SIGALRM, sighandler);
> + break;
> #else
> case SIGCHLD:
> -#endif
> clean_pid();
> /* Restore signal catching */
> signal(SIGCHLD, sighandler);
> break;
> +#endif
> default:
> purple_debug_warning("sighandler", "Caught signal %d\n",
> sig);
> purple_core_quit();
>
> }}}
>
> Best regards, K.S.
New description:
The sighandler() function in pidgin/gtkmain.c contains code, which looks
like this:
{{{
#if defined(USE_GSTREAMER) && !defined(GST_CAN_DISABLE_FORKING)
/* ... skipped long comment ... */
case SIGCHLD:
/* Restore signal catching */
signal(SIGCHLD, sighandler);
alarm(1);
break;
case SIGALRM:
#else
case SIGCHLD:
#endif
clean_pid();
/* Restore signal catching */
signal(SIGCHLD, sighandler);
break;
}}}
If this code is compiled with macro USE_GSTREAMER defined and
GST_CAN_DISABLE_FORKING not defined, it may lead to an uncatched SIGALRM
(and pidgin termination), if the pidgin process receives more than one
SIGCHLD during its lifetime.
The problem is a SIGALRM handler which erroneously restores SIGCHLD
handler instead of SIGALRM.
The code after '#endif' in this piece of code is good for the case when
being compiled without USE_GSTREAMER macro, or with
GST_CAN_DISABLE_FORKING. [[BR]]
But it doesn't suit otherwise.
The proposed patch is to completely split the mentioned piece of code into
two cases: one for "defined(USE_GSTREAMER) &&
!defined(GST_CAN_DISABLE_FORKING)" and the other for the opposite case.
A variant of the patch, implemeting this idea is given below:
{{{
--- gtkmain.c.orig 2008-12-21 03:38:16.000000000 +0300
+++ gtkmain.c 2008-12-25 20:51:57.949286800 +0300
@@ -207,13 +207,17 @@
alarm(1);
break;
case SIGALRM:
+ clean_pid();
+ /* Restore signal catching */
+ signal(SIGALRM, sighandler);
+ break;
#else
case SIGCHLD:
-#endif
clean_pid();
/* Restore signal catching */
signal(SIGCHLD, sighandler);
break;
+#endif
default:
purple_debug_warning("sighandler", "Caught signal %d\n",
sig);
purple_core_quit();
}}}
Best regards, K.S.
--
--
Ticket URL: <http://developer.pidgin.im/ticket/7902#comment:1>
Pidgin <http://pidgin.im>
Pidgin
More information about the Tracker
mailing list