On 2023/09/28 22:10:08 +0300, Mikhail <mp39...@gmail.com> wrote:
> Core was generated by `rofi'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  strlen () at /usr/src/lib/libc/arch/amd64/string/strlen.S:125
> 125             movq    (%rax),%rdx             /* get bytes to check */
> (gdb) bt
> #0  strlen () at /usr/src/lib/libc/arch/amd64/string/strlen.S:125
> #1  0x00000c011b001558 in __vfprintf (fp=<optimized out>, fmt0=<optimized 
> out>, ap=<optimized out>) at /usr/src/lib/libc/stdio/vfprintf.c:877
> #2  0x00000c011affa5a5 in _libc_vasprintf (str=0x76d393e72e40, 
> fmt=0xbfe638afa35 "Found window manager: |%s|", ap=0x76d393e73030) at 
> /usr/src/lib/libc/stdio/vasprintf.c:43
> #3  0x00000c010a1f0ac7 in g_vasprintf () from 
> /usr/local/lib/libglib-2.0.so.4201.10
> #4  0x00000c010a1b512d in g_strdup_vprintf () from 
> /usr/local/lib/libglib-2.0.so.4201.10
> #5  0x00000c010a197b3b in g_logv () from /usr/local/lib/libglib-2.0.so.4201.10
> #6  0x00000c010a197a55 in g_log () from /usr/local/lib/libglib-2.0.so.4201.10
> #7  0x00000bfe638f8a5e in display_setup ()
> #8  0x00000bfe638d8c8f in main ()

I managed to reproduce it.  It doesn't seem to fail with CWM, so I run
fvwm3 inside Xephyr.

The issue seems to be in source/xcb.c:

(gdb) p wtitle.strings
$2 = 0xf9d9ce2ce30 "FVWM", '\004' <repeats 12 times>, '\337' <repeats 183 
times>, <incomplete sequence \337>...

wtitle.strings is not NUL terminated, so it later crashes in strlen
(via __vfprintf) after it goes out of the bounds.

This seems to fix it, but I'm not knowledgable enough to tell whether
this is a FVWM3 issue.  (i assume so tho since it's intermittent.)

Can you give this diff a spin?  I don't use nor rofi anymore nor
fvwm3.

(more below the diff)

Index: Makefile
===================================================================
RCS file: /home/cvs/ports/sysutils/rofi/Makefile,v
retrieving revision 1.41
diff -u -p -r1.41 Makefile
--- Makefile    27 Sep 2023 17:16:33 -0000      1.41
+++ Makefile    30 Sep 2023 08:53:55 -0000
@@ -2,7 +2,7 @@ COMMENT =               window switcher, run dialog a
 
 V =                    1.7.5
 DISTNAME =             rofi-${V}
-REVISION =             0
+REVISION =             1
 
 CATEGORIES =           sysutils x11
 HOMEPAGE =             https://github.com/davatorium/rofi
@@ -35,6 +35,8 @@ CONFIGURE_STYLE =     gnu
 CONFIGURE_ARGS =       --disable-check
 CONFIGURE_ENV =                CPPFLAGS="-I${LOCALBASE}/include 
-I${X11BASE}/include" \
                        YACC="bison -y"
+
+DEBUG_PACKAGES =       ${BUILD_PACKAGES}
 
 pre-configure:
        sed -i 's,/usr/bin/env bash,/bin/sh,' ${WRKSRC}/script/get_git_rev.sh
Index: patches/patch-source_xcb_c
===================================================================
RCS file: patches/patch-source_xcb_c
diff -N patches/patch-source_xcb_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-source_xcb_c  30 Sep 2023 08:54:47 -0000
@@ -0,0 +1,14 @@
+fwm3 doesn't always NUL terminate the response
+
+Index: source/xcb.c
+--- source/xcb.c.orig
++++ source/xcb.c
+@@ -1475,7 +1475,7 @@ static void x11_helper_discover_window_manager(void) {
+         xcb_ewmh_get_wm_name_unchecked(&(xcb->ewmh), wm_win);
+     if (xcb_ewmh_get_wm_name_reply(&(xcb->ewmh), cookie, &wtitle, (void *)0)) 
{
+       if (wtitle.strings_len > 0) {
+-        g_debug("Found window manager: |%s|", wtitle.strings);
++        g_debug("Found window manager: |%.*s|", wtitle.strings_len, 
wtitle.strings);
+         if (g_strcmp0(wtitle.strings, "i3") == 0) {
+           current_window_manager =
+               WM_DO_NOT_CHANGE_CURRENT_DESKTOP | WM_PANGO_WORKSPACE_NAMES;


> As a side note - yesterday I got very suspicious crash in fvwm3
> during simple fvwm restart, I can't reproduce it, but the bt also had
> __vfprintf in it, fvwm3 dev's said that it was very strange segfault and
> they have no idea what has happened, but with fvwm the snapshot wasn't
> very new.
> 
> Reading symbols from fvwm3...
> Reading symbols from /usr/local/bin/.debug/fvwm3.dbg...
> [New process 532945]
> Core was generated by `fvwm3'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  strlen () at /usr/src/lib/libc/arch/amd64/string/strlen.S:125
> 125             movq    (%rax),%rdx             /* get bytes to check */
> (gdb) bt
> #0  strlen () at /usr/src/lib/libc/arch/amd64/string/strlen.S:125
> #1  0x00000141784fd6d8 in __vfprintf (fp=<optimized out>, fmt0=<optimized 
> out>, ap=<optimized out>) at /usr/src/lib/libc/stdio/vfprintf.c:877
> #2  0x00000141784fa996 in _libc_vfprintf (fp=0x14178548630 <usual>, 
> fmt0=0x13f0429b0be "    [KEY] %s\n", ap=0x7a1e8b73bb80) at 
> /usr/src/lib/libc/stdio/vfprintf.c:263
> #3  0x000001417852784c in _libc_fprintf (fp=0x14169019ff0, fmt=0x0) at 
> /usr/src/lib/libc/stdio/fprintf.c:44
> #4  0x0000013f04319b60 in SaveGlobalState (f=0x14178548630 <usual>) at 
> session.c:183

use egdb to go to this frame (f 4) and inspect what it's doing there.
It could be another not-NUL terminated string or some other garbage
pointer.

(oh, and install the fvwm3-debug package if you haven't already)

> #5  save_state_file (filename=<optimized out>) at session.c:732
> #6  0x0000013f042fc28a in Done (restart=<optimized out>, 
> command=0x141d1aceb98 "fvwm3") at fvwm3.c:589
> #7  0x0000013f042eccb5 in CMD_Restart (cond_rc=<optimized out>, 
> exc=<optimized out>, action=0x0, pc=0x2020202020202020) at builtins.c:2447
> #8  0x0000013f0431f00e in _execute_command_line (cond_rc=<optimized out>, 
> exc=<optimized out>, xaction=<optimized out>, caller_pc=<optimized out>, 
> exec_flags=<optimized out>,
>     all_pos_args_string=<optimized out>, pos_arg_tokens=0x0, 
> has_ref_window_moved=0) at functions.c:672
> #9  0x0000013f0431e992 in execute_function (cond_rc=0x14169019ff0, exc=0x0, 
> action=0x0, pc=0x2020202020202020, exec_flags=16843009) at functions.c:1245
> #10 0x0000013f042c0184 in _menu_execute_function (pexc=0x7a1e8b73c620, 
> action=0x141d1aceb90 "Restart fvwm3") at menus.c:253
> #11 0x0000013f042be924 in do_menu (pmp=<optimized out>, pmret=<optimized 
> out>) at menus.c:5825
> #12 0x0000013f0433b907 in menu_func (cond_rc=0x7a1e8b73c808, 
> exc=0x141144e7000, action=0x14172f6a54e "Nop", pc=<optimized out>, 
> fStaysUp=<optimized out>) at menucmd.c:109
> #13 0x0000013f0431f00e in _execute_command_line (cond_rc=<optimized out>, 
> exc=<optimized out>, xaction=<optimized out>, caller_pc=<optimized out>, 
> exec_flags=<optimized out>,
>     all_pos_args_string=<optimized out>, pos_arg_tokens=0x0, 
> has_ref_window_moved=0) at functions.c:672
> #14 0x0000013f0431e992 in execute_function (cond_rc=0x14169019ff0, exc=0x0, 
> action=0x0, pc=0x2020202020202020, exec_flags=16843009) at functions.c:1245
> #15 0x0000013f042dbf90 in _handle_bpress_on_root (exc=0x1414baa8300) at 
> events.c:1667
> #16 HandleButtonPress (ea=<optimized out>) at events.c:1884
> #17 0x0000013f042df666 in dispatch_event (e=0x7a1e8b73cb30) at events.c:4248
> #18 0x0000013f042dfe44 in HandleEvents () at events.c:4287
> #19 0x0000013f0430053c in main (argc=<optimized out>, argv=<optimized out>) 
> at fvwm3.c:2526

Reply via email to