rxvt: `info' dumpes core when rxvt is resized

Brian Dessent brian@dessent.net
Sun Aug 21 08:07:00 GMT 2005


Igor Pechtchanski wrote:

> I forgot to mention that explicitly sending SIGWINCH (using "kill -WINCH")
> doesn't trigger the problem.  Also, this doesn't seem to happen when
> changing the width/height of the window by 1-2 lines/columns, only when
> the window is resized by larger amounts (5-10 lines/columns).  Either
> height or width resizing triggers this.

It happens here too.  It looks like it's happening in the signal handler:

Program received signal SIGSEGV, Segmentation fault.
[Switching to thread 12028.0x30d4]
0x00401b71 in display_update_one_window (win=0x1005d200) at ../../info/display.c:308

(gdb) bt
#0  0x00401b71 in display_update_one_window (win=0x1005d200) at ../../info/display.c:308
#1  0x00401f53 in display_update_display (window=0x1005d200) at ../../info/display.c:85
#2  0x004146e8 in reset_info_window_sizes () at ../../info/signals.c:161
#3  0x004147ef in info_signal_proc (sig=28) at ../../info/signals.c:277
#4  0x610883dc in _sigbe () at ../../../../src/winsup/cygwin/cygserver.h:82
#5  0x00000000 in ?? () from 

gdb) list 290,310
290	            }
291	
292	          /* We have the exact line as it should appear on the screen.
293	             Check to see if this line matches the one already appearing
294	             on the screen. */
295	          entry = display[line_index + win->first_row];
296	
297	          /* If the screen line is inversed, then we have to clear
298	             the line from the screen first.  Why, I don't know.
299	             (But don't do this if we have no visible entries, as can
300	             happen if the window is shrunk very small.)  */
301	          if ((entry && entry->inverse)
302		      /* Need to erase the line if it has escape sequences.  */
303		      || (raw_escapes_p && strchr (entry->text, '\033') != 0))
304	            {
305	              terminal_goto_xy (0, line_index + win->first_row);
306	              terminal_clear_to_eol ();
307	              entry->inverse = 0;
308	              entry->text[0] = '\0';
309	              entry->textlen = 0;
310	            }

(gdb) p line_index
$7 = 6

(gdb) p win->first_row
$8 = 0

(gdb) p entry
$9 = (DISPLAY_LINE *) 0x1005d518

(gdb) p *entry
$10 = {text = 0x636c6557 <Address 0x636c6557 out of bounds>, textlen = 543518063, inverse
= 0}

It seems that the display[] array is getting somehow clobbered.  The exact spot of the
fault seems to vary, I've seen it die on line 301 also where entry is an invalid (but not
null) pointer and trying to reference entry->inverse causes the fault.  display seems to
be an alias for a global variable the_display.  <wild guess mode> Do you suppose that
somehow the signal handler is being called twice recursively?  Or called at a point where
the_display is at an invalid state? </wild guess mode>

Brian

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/



More information about the Cygwin mailing list