Subject: bug#54183: 28.0.91; Emacs crashes on bookmark-jump

From: Eli Zaretskii <[email-masked]>
Date: Thu, 03 Mar 2022 16:14:22 +0200

> From: Gustavo Barros <[email-masked]>
> Cc: [email-masked]
> Date: Thu, 03 Mar 2022 10:13:47 -0300
> 
> >   M-| patch -d /path/to/emacs -p1
> >
> > where /path/to/emacs is the absolute file name of the top-level
> > directory of the Emacs source tree, the one which has the src, lisp,
> > etc. as its immediate subdirectories.
> 
> Done, no errors occurred.  Thank you for the instructions.
> 
> > Please just say "make" in the top-level directory after patching the
> > sources, and then use the resulting src/emacs binary instead of your
> > installed Emacs, to verify that the problem is solved.  Let's see what
> > the patch does for the build you have with the configure options you
> > used.  If needed, we will reconfigure later.
> 
> I did just that, except I ran lib-src/emacsclient, exactly as I was 
> doing to generate the reported crash. Unfortunately, a crash still 
> happens.

I suspect that the way you started Emacs actually ran the installed
executable of Emacs, without the patch.  Can you verify which
executable file is being run?  One way to be sure is to try this
command after you attach to a running Emacs:

  (gdb) break gui_define_fringe_bitmap

If this says the function gui_define_fringe_bitmap is not defined, you
are running the old unpatched executable.

If the executable being run is the patched one, from the Emacs's src/
directory, and it still crashes, then please set a breakpoint in this
part of xterm.c, on the indicated line:

      if (!fringe_bmp[p->which])  <<<<<<<<<<<<<<<<<<<<<<<<<<
	{
	  /* This fringe bitmap is known to fringe.c, but lacks the
	     cairo_pattern_t pattern which shadows that bitmap.  This
	     is typical to define-fringe-bitmap being called when the
	     selected frame was not a GUI frame, for example, when
	     packages that define fringe bitmaps are loaded by a
	     daemon Emacs.  Create the missing pattern now.  */
	  gui_define_fringe_bitmap (f, p->which);
	}
      x_cr_draw_image (f, gc, fringe_bmp[p->which], 0, p->dh,
		       p->wd, p->h, p->x, p->y, p->overlay_p);

and step through this code with a debugger, one line at a time.  When
fringe_bmp[p->which] is NULL pointer (zero), the code should call
gui_define_fringe_bitmap, and when that call returns,
fringe_bmp[p->which] should no longer be zero.