On Sun, Aug 07, 2022 at 03:38:06PM +0200, Matthieu Herrb wrote:
> Hi,
> 
> I've received a report that fvwm2 is abort(2)ing under -current, since
> the import of libX11 1.8.1. The backtrace associated with this report
> shows that it's the same issue that I fixed in xfce4-settings
> earlier.
> 
> Unfortunatly, I can't reproduce the crash with the default fvwm2
> configuration on my machines so I can't confirm if the patch below is
> enough to completely fix the issue. I'm still waiting for a report
> from the original reporter.
> 
> (There is also a NetBSD report that's probably caused by the same
> issue: https://marc.infœ?l=netbsd-current-users&m=165902977815467&w=2)
> 
> Did anyone else here stumble on fvwm2 aborting since libX11 1.8.2 was
> imported (approxymatly july 25 snapshots) ? if so can you try the
> patch below ?

Ok, following the hint in the NetBSD report (start a few urxvt in
~/.xsession) I was able to reproduce
the problem on fvwm2-2.6.9p1 and can confirm that my patches fix them.

ok?

> 
> PS: x11/fvwm3 will need a very similar change. If you see the issue
> with fvwm3, please try to adapt the patch and report.
> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/OpenBSD/ports/x11/fvwm2/Makefile,v
> retrieving revision 1.73
> diff -u -p -u -r1.73 Makefile
> --- Makefile  29 Jul 2022 07:45:04 -0000      1.73
> +++ Makefile  7 Aug 2022 13:11:02 -0000
> @@ -1,7 +1,7 @@
>  COMMENT=     multiple virtual desktop window manager
>  
>  VERSION=     2.6.9
> -REVISION=    1
> +REVISION=    2
>  DISTNAME=    fvwm-${VERSION}
>  PKGNAME=     fvwm2-${VERSION}
>  
> Index: patches/patch-fvwm_events_c
> ===================================================================
> RCS file: patches/patch-fvwm_events_c
> diff -N patches/patch-fvwm_events_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-fvwm_events_c       7 Aug 2022 13:21:18 -0000
> @@ -0,0 +1,28 @@
> +Fix for XCheckIfEvent() callback lock recursion
> +
> +Index: fvwm/events.c
> +--- fvwm/events.c.orig
> ++++ fvwm/events.c
> +@@ -258,6 +258,12 @@ static int _pred_weed_accumulate_expose(
> +     return 1;
> + }
> + 
> ++static int _pred_weed_is_expose(
> ++    Display *display, XEvent *event, XPointer arg)
> ++{
> ++    return (event->type == Expose);
> ++}
> ++
> + static int _pred_weed_handle_expose(
> +     Display *display, XEvent *event, XPointer arg)
> + {
> +@@ -4542,7 +4548,8 @@ void handle_all_expose(void)
> + 
> +     saved_event = fev_save_event();
> +     FPending(dpy);
> +-    FWeedIfEvents(dpy, _pred_weed_handle_expose, NULL);
> ++    FWeedAndHandleIfEvents(dpy, _pred_weed_is_expose,
> ++                           _pred_weed_handle_expose, NULL);
> +     fev_restore_event(saved_event);
> + 
> +     return;
> Index: patches/patch-libs_FEvent_c
> ===================================================================
> RCS file: patches/patch-libs_FEvent_c
> diff -N patches/patch-libs_FEvent_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-libs_FEvent_c       7 Aug 2022 13:21:18 -0000
> @@ -0,0 +1,34 @@
> +Fix for XCheckIfEvent() callback lock recursion
> +
> +Index: libs/FEvent.c
> +--- libs/FEvent.c.orig
> ++++ libs/FEvent.c
> +@@ -532,6 +532,28 @@ int FWeedIfEvents(
> +     return weed_args.count;
> + }
> + 
> ++int FWeedAndHandleIfEvents(
> ++    Display *display,
> ++    int (*weed_predicate) (Display *display, XEvent *event, XPointer arg),
> ++    int (*handler) (Display *display, XEvent *event, XPointer arg),
> ++    XPointer arg)
> ++{
> ++    _fev_weed_args weed_args;
> ++    XEvent e;
> ++
> ++    assert(fev_is_invalid_event_type_set);
> ++    memset(&weed_args, 0, sizeof(weed_args));
> ++    weed_args.weed_predicate = weed_predicate;
> ++    weed_args.arg = arg;
> ++    if (FCheckPeekIfEvent(display, &e, _fev_pred_weed_if,
> ++                          (XPointer)&weed_args)) {
> ++            handler(display, &e, arg);
> ++    }
> ++    _fev_pred_weed_if_finish(&weed_args);
> ++
> ++    return weed_args.count;
> ++}
> ++
> + int FWeedIfWindowEvents(
> +     Display *display, Window window,
> +     int (*weed_predicate) (
> Index: patches/patch-libs_FEvent_h
> ===================================================================
> RCS file: patches/patch-libs_FEvent_h
> diff -N patches/patch-libs_FEvent_h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-libs_FEvent_h       7 Aug 2022 13:11:02 -0000
> @@ -0,0 +1,20 @@
> +Fix for XCheckIfEvent() callback lock recursion
> +
> +Index: libs/FEvent.h
> +--- libs/FEvent.h.orig
> ++++ libs/FEvent.h
> +@@ -113,6 +113,14 @@ int FWeedIfEvents(
> +             Display *display, XEvent *current_event, XPointer arg),
> +     XPointer arg);
> + 
> ++/* Same as FWeedIfEvents but with a second callback out of XLockDisplay()
> ++ * to handle events in a lock-safe manner */
> ++int FWeedAndHandleIfEvents(
> ++    Display *display,
> ++    int (*weed_predicate) (Display *display, XEvent *event, XPointer arg),
> ++    int (*handler) (Display *display, XEvent *event, XPointer arg),
> ++    XPointer arg);
> ++
> + /* Same as FWeedIfEvents but weeds only events for the given window.  The
> +  * weed_predicate is only called for events with a matching window.  */
> + int FWeedIfWindowEvents(
> 
> -- 
> Matthieu Herrb
> 

-- 
Matthieu Herrb

Reply via email to