]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix bug #18528 with crashes at startup during frameset restoration.
authorEli Zaretskii <eliz@gnu.org>
Wed, 24 Sep 2014 07:31:11 +0000 (10:31 +0300)
committerEli Zaretskii <eliz@gnu.org>
Wed, 24 Sep 2014 07:31:11 +0000 (10:31 +0300)
 src/w32term.c (w32_read_socket): Don't use frame dimensions for
 resizing if GetClientRect returned an empty (0, 0, 0, 0)
 rectangle.  Check the return value of GetClientRect, and don't use
 the results if it didn't succeed.
 src/dispnew.c (change_frame_size_1): Recompute the frame dimensions
 in columns and lines after correcting the pixel dimensions in
 check_frame_size.
 (adjust_decode_mode_spec_buffer): Add assertion to avoid passing
 negative values to xrealloc.

src/ChangeLog
src/dispnew.c
src/w32term.c

index 4d969d73279426810893eab2044199da533189fe..a5c25ab716826ceb410d75ac6bedf66ca0dcead1 100644 (file)
@@ -1,3 +1,16 @@
+2014-09-24  Eli Zaretskii  <eliz@gnu.org>
+
+       * w32term.c (w32_read_socket): Don't use frame dimensions for
+       resizing if GetClientRect returned an empty (0, 0, 0, 0)
+       rectangle.  Check the return value of GetClientRect, and don't use
+       the results if it didn't succeed.
+
+       * dispnew.c (change_frame_size_1): Recompute the frame dimensions
+       in columns and lines after correcting the pixel dimensions in
+       check_frame_size.
+       (adjust_decode_mode_spec_buffer): Add assertion to avoid passing
+       negative values to xrealloc.  (Bug#18528)
+
 2014-09-22  Dmitry Antipov  <dmantipov@yandex.ru>
 
        On OSX, do not free font-specific data more than once (Bug#18501).
index 5bdcb279be7525e1283470f17279d93b5d2e9104..713457750453af06b638cc74be5dd4a049c76071 100644 (file)
@@ -2138,8 +2138,11 @@ adjust_frame_glyphs_for_window_redisplay (struct frame *f)
 static void
 adjust_decode_mode_spec_buffer (struct frame *f)
 {
+  ssize_t frame_message_buf_size = FRAME_MESSAGE_BUF_SIZE (f);
+
+  eassert (frame_message_buf_size >= 0);
   f->decode_mode_spec_buffer = xrealloc (f->decode_mode_spec_buffer,
-                                        FRAME_MESSAGE_BUF_SIZE (f) + 1);
+                                        frame_message_buf_size + 1);
 }
 
 
@@ -5539,10 +5542,6 @@ change_frame_size_1 (struct frame *f, int new_width, int new_height,
     {
       new_text_width = (new_width == 0) ? FRAME_TEXT_WIDTH (f) : new_width;
       new_text_height = (new_height == 0) ? FRAME_TEXT_HEIGHT (f) : new_height;
-      /* Consider rounding here: Currently, the root window can be
-        larger than the frame in terms of columns/lines.  */
-      new_cols = new_text_width / FRAME_COLUMN_WIDTH (f);
-      new_lines = new_text_height / FRAME_LINE_HEIGHT (f);
     }
   else
     {
@@ -5555,6 +5554,12 @@ change_frame_size_1 (struct frame *f, int new_width, int new_height,
   /* Compute width of windows in F.  */
   /* Round up to the smallest acceptable size.  */
   check_frame_size (f, &new_text_width, &new_text_height, 1);
+  /* Recompute the dimensions in character units, since
+     check_frame_size might have changed the pixel dimensions.  */
+  /* Consider rounding here: Currently, the root window can be
+     larger than the frame in terms of columns/lines.  */
+  new_cols = new_text_width / FRAME_COLUMN_WIDTH (f);
+  new_lines = new_text_height / FRAME_LINE_HEIGHT (f);
 
   /* This is the width of the frame without vertical scroll bars and
      fringe columns.  Do this after rounding - see discussion of
index 5f15798eeebb14d91e36721e22b1e936ff78c1b0..5a053b4fc0d3181bfcddc1cceaffa69f193763c5 100644 (file)
@@ -4754,34 +4754,42 @@ w32_read_socket (struct terminal *terminal,
              RECT rect;
              int rows, columns, width, height, text_width, text_height;
 
-             GetClientRect (msg.msg.hwnd, &rect);
-
-             height = rect.bottom - rect.top;
-             width = rect.right - rect.left;
-             text_width = FRAME_PIXEL_TO_TEXT_WIDTH (f, width);
-             text_height = FRAME_PIXEL_TO_TEXT_HEIGHT (f, height);
-             rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, height);
-             columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, width);
-
-             /* TODO: Clip size to the screen dimensions.  */
-
-             /* Even if the number of character rows and columns has
-                not changed, the font size may have changed, so we need
-                to check the pixel dimensions as well.  */
-
-             if (width != FRAME_PIXEL_WIDTH (f)
-                 || height != FRAME_PIXEL_HEIGHT (f)
-                 || text_width != FRAME_TEXT_WIDTH (f)
-                 || text_height != FRAME_TEXT_HEIGHT (f))
+             if (GetClientRect (msg.msg.hwnd, &rect)
+                 /* GetClientRect evidently returns (0, 0, 0, 0) if
+                    called on a minimized frame.  Such "dimensions"
+                    aren't useful anyway.  */
+                 && !(rect.bottom == 0
+                      && rect.top == 0
+                      && rect.left == 0
+                      && rect.right == 0))
                {
-                 change_frame_size (f, text_width, text_height, 0, 1, 0, 1);
-                 SET_FRAME_GARBAGED (f);
-                 cancel_mouse_face (f);
-                 /* Do we want to set these here ????  */
-/**              FRAME_PIXEL_WIDTH (f) = width; **/
-/**              FRAME_TEXT_WIDTH (f) = text_width; **/
-/**              FRAME_PIXEL_HEIGHT (f) = height; **/
-                 f->win_gravity = NorthWestGravity;
+                 height = rect.bottom - rect.top;
+                 width = rect.right - rect.left;
+                 text_width = FRAME_PIXEL_TO_TEXT_WIDTH (f, width);
+                 text_height = FRAME_PIXEL_TO_TEXT_HEIGHT (f, height);
+                 rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, height);
+                 columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, width);
+
+                 /* TODO: Clip size to the screen dimensions.  */
+
+                 /* Even if the number of character rows and columns
+                    has not changed, the font size may have changed,
+                    so we need to check the pixel dimensions as well.  */
+
+                 if (width != FRAME_PIXEL_WIDTH (f)
+                     || height != FRAME_PIXEL_HEIGHT (f)
+                     || text_width != FRAME_TEXT_WIDTH (f)
+                     || text_height != FRAME_TEXT_HEIGHT (f))
+                   {
+                     change_frame_size (f, text_width, text_height, 0, 1, 0, 1);
+                     SET_FRAME_GARBAGED (f);
+                     cancel_mouse_face (f);
+                     /* Do we want to set these here ????  */
+                     /**               FRAME_PIXEL_WIDTH (f) = width; **/
+                     /**               FRAME_TEXT_WIDTH (f) = text_width; **/
+                     /**               FRAME_PIXEL_HEIGHT (f) = height; **/
+                     f->win_gravity = NorthWestGravity;
+                   }
                }
            }