Subject: Re: bug#70385: Crash in note_fringe_highlight

From: Eli Zaretskii <[email-masked]>
Date: Mon, 15 Apr 2024 16:03:27 +0300

> From: Po Lu <[email-masked]>
> Cc: [email-masked],  [email-masked],  [email-masked],
>   [email-masked]
> Date: Mon, 15 Apr 2024 19:57:44 +0800
> 
> Eli Zaretskii <[email-masked]> writes:
> 
> > Any reason you didn't include w->window_end_valid in the condition,
> > like we do for mouse-highlight?
> 
> This wasn't necessary to fix the crash for me.
> 
> > I'd like in general to have the same conditions, to avoid having
> > people wonder what they miss when they read this code.
> 
> Your wish is my command... :-)
> 
> I suspect it might fix the Bjorn's crash also.  Bjorn, please try:
> 
> diff --git a/src/xdisp.c b/src/xdisp.c
> index d984c12d1aa..51f6b1efd69 100644
> --- a/src/xdisp.c
> +++ b/src/xdisp.c
> @@ -35771,9 +35771,10 @@ note_fringe_highlight (struct frame *f, Lisp_Object window, int x, int y,
>  
>    /* Don't access the TEXT_AREA of a row that does not display text, or
>       when the window is outdated.  (bug#70385) */
> -  if (window_outdated (w)
> -      || !MATRIX_ROW_DISPLAYS_TEXT_P (MATRIX_ROW (w->current_matrix,
> -						  vpos)))
> +  if ((window_outdated (w)
> +       || !MATRIX_ROW_DISPLAYS_TEXT_P (MATRIX_ROW (w->current_matrix,
> +						   vpos)))
> +      && w->window_end_valid)

I think this should be

  if ((window_outdated (w)
       || !w->window_end_valid
       || !MATRIX_ROW_DISPLAYS_TEXT_P (MATRIX_ROW (w->current_matrix,
						   vpos)))

I'm not sure it will help, because it seems the segfault happens in
the MATRIX_ROW_DISPLAYS_TEXT_P macro.  So I think we are somehow
dealing with w->current_matrix whose 'nrows' is too small.  The
mouse-highlight code detects that case in x_y_to_hpos_vpos.