Subject: bug#16049: 24.3.50; Crash on startup on Mac OS X 10.9

From: martin rudalics <[email-masked]>
Date: Fri, 06 Dec 2013 19:56:51 +0100

> The root cause is grow_mini_window in window.c.
 >
 > It sets w->pixel_height to a large negative value, and it is all downhill from there.
 > It is called twice.  Right before w->pixel_height += pixel_height;
 >
 > the values for pixelwise, w->pixel_height, pixel_height, line_height, FRAME_LINE_HEIGTH(f), delta and XINT (height) are:
 >
 > 1 1 -47 -3 14 13 47
 >
 > The 1 for w->pixel_height looks wrong.
 > This will set w->pixel_height to -46.
 > The second call:
 >
 > 1 -46 -2147483603 .153391685 14 60 0
 >
 > I'm not sure how this function is supposed to work.  pixel_value is negative or it is a huge positive value.  Is it relying on overflow?

IIUC this occurs with pixel values not yet assigned.  That is, the
minibuffer window still has a line and pixel height of 1 but the frame's
character height has already changed so the relations are wrong.

I had this problem on Windows and did in w32fns.c

   /* PXW: This is a duplicate from below.  We have to do it here since
      otherwise x_set_tool_bar_lines will work with the character sizes
      installed by init_frame_faces while the frame's pixel size is still
      calculated from a character size of 1 and we subsequently hit the
      eassert (height >= 0) assertion in window_box_height.  The
      non-pixelwise code apparently worked around this because it had one
      frame line vs one toolbar line which left us with a zero root
      window height which was obviously wrong as well ...  */
   width = FRAME_TEXT_WIDTH (f);
   height = FRAME_TEXT_HEIGHT (f);
   FRAME_TEXT_HEIGHT (f) = 0;
   SET_FRAME_WIDTH (f, 0);
   change_frame_size (f, width, height, 1, 0, 0, 1);

and on GTK where I did in xfns.c completely the same

#ifdef USE_GTK
   /* PXW: This is a duplicate from below.  We have to do it here since
      otherwise x_set_tool_bar_lines will work with the character sizes
      installed by init_frame_faces while the frame's pixel size is still
      calculated from a character size of 1 and we subsequently hit the
      eassert (height >= 0) assertion in window_box_height.  The
      non-pixelwise code apparently worked around this because it had one
      frame line vs one toolbar line which left us with a zero root
      window height which was obviously wrong as well ...  */
   width = FRAME_TEXT_WIDTH (f);
   height = FRAME_TEXT_HEIGHT (f);
   FRAME_TEXT_HEIGHT (f) = 0;
   SET_FRAME_WIDTH (f, 0);
   change_frame_size (f, width, height, 1, 0, 0, 1);
#endif /* USE_GTK */

It's a very weird issue but you didn't make it till window_box_height
apparently, so I don't know whether it's related.

martin