Comment 22 for bug 684613

Revision history for this message
Urs Fleisch (ufleisch) wrote :

I built the emacs packages myself with debugging information. The crash happens at fringe.c:1214

(gdb) r
Program received signal SIGFPE, Arithmetic exception.
0x08126361 in compute_fringe_widths (f=0x85d8d00, redraw=1) at fringe.c:1214
(gdb) bt
#0 0x08126361 in compute_fringe_widths (f=0x85d8d00, redraw=1) at fringe.c:1214
#1 0x081094ed in x_new_font (f=0x85d8d00, font_object=141700660, fontset=2) at xterm.c:8372
#2 0x08064ce9 in x_set_font (f=0x85d8d00, arg=141729051, oldval=138348745) at frame.c:3445
#3 0x08063a3b in x_set_frame_parameters (f=0x85d8d00, alist=138348745) at frame.c:3017
#4 0x080662b3 in x_default_parameter (f=0x85d8d00, alist=139436189, prop=138561249, deflt=141700660, xprop=0x825029a "font", xclass=0x8250295 "Font", type=RES_TYPE_STRING) at frame.c:4130
#5 0x08113b6b in x_default_font_parameter (f=0x85d8d00, parms=139436189) at xfns.c:3043
#6 0x0811444c in Fx_create_frame (parms=139436189) at xfns.c:3257
#7 0x081cc469 in Ffuncall (nargs=2, args=0xbfffe510) at eval.c:3045
#8 0x08209371 in Fbyte_code (bytestr=136975739, vector=136975756, maxdepth=40) at bytecode.c:678
(..)
The code there is

(gdb) l
1209 {
1210 int left_wid = left_fringe_width >= 0 ? left_fringe_width : -left_fringe_width;
1211 int right_wid = right_fringe_width >= 0 ? right_fringe_width : -right_fringe_width;
1212 int conf_wid = left_wid + right_wid;
1213 int font_wid = FRAME_COLUMN_WIDTH (f);
1214 int cols = (left_wid + right_wid + font_wid-1) / font_wid;
1215 int real_wid = cols * font_wid;
1216 if (left_wid && right_wid)
1217 {
1218 if (left_fringe_width < 0)

A division by zero occurs because font_wid is 0.

(gdb) p font_wid
$3 = 0
(gdb) p left_wid
$4 = 8
(gdb) p right_wid
$5 = 8

font_wid is calculated using FRAME_COLUMN_WIDTH, which is defined in frame.h, 868:
#define FRAME_COLUMN_WIDTH(F) ((F)->column_width)

(gdb) p *f
$1 = {size = 1073742869, next = 0x85be378, name = 141729355, icon_name = 138348745, title = 138348745, focus_frame = 138348745, root_window = 140609412, selected_window = 140609412, minibuffer_window = 140104924, param_alist = 139429197, scroll_bars = 138348745, condemned_scroll_bars = 138348745, menu_bar_items = 138348745, face_alist = 138348745, menu_bar_vector = 138348745, buffer_predicate = 138348745, buffer_list = 139434141, buried_buffer_list = 138348745, menu_bar_window = 138348745, tool_bar_window = 138348745, tool_bar_items = 138348745, desired_tool_bar_string = 138348745, current_tool_bar_string = 138348745, face_cache = 0x0, menu_bar_items_used = 0, namebuf = 0x0, current_pool = 0x0, desired_pool = 0x0, desired_matrix = 0x0, current_matrix = 0x0, glyphs_initialized_p = 0, resized_p = 0, force_flush_display_p = 0, default_face_done_p = 0, already_hscrolled_p = 0, updated_p = 0, minimize_tool_bar_window_p = 0, tool_bar_lines = 0, n_tool_bar_rows = 0, n_tool_bar_items = 0, decode_mode_spec_buffer = 0x0, insert_line_cost = 0x0, delete_line_cost = 0x0, insert_n_lines_cost = 0x0, delete_n_lines_cost = 0x0, text_lines = 10, text_cols = 10, total_lines = 0, total_cols = 10, new_text_lines = 0, new_text_cols = 0, left_pos = 0, top_pos = 0, pixel_height = 0, pixel_width = 0, resx = 0, resy = 0, x_pixels_diff = 0, y_pixels_diff = 0, win_gravity = 0, size_hint_flags = 0, border_width = 0, internal_border_width = 0, column_width = 0, space_width = 0, line_height = 0, output_method = output_x_window, terminal = 0x85f08c0, output_data = {tty = 0x8602a90, x = 0x8602a90, w32 = 0x8602a90, ns = 0x8602a90, nothing = 140520080}, font_driver_list = 0x86684b8, font_data_list = 0x0, fringe_cols = 0, left_fringe_width = 0, right_fringe_width = 0, want_fullscreen = FULLSCREEN_NONE, menu_bar_lines = 0, external_menu_bar = 0, display_preempted = 0 '\000', visible = 0 '\000', iconified = 0 '\000', async_visible = 0 '\000', async_iconified = 0 '\000', garbaged = 1 '\001', has_minibuffer = 1 '\001', wants_modeline = 1 '\001', can_have_scroll_bars = 1 '\001', auto_raise = 0 '\000', auto_lower = 0 '\000', no_split = 0 '\000', explicit_name = 0 '\000', window_sizes_changed = 0 '\000', mouse_moved = 0 '\000', vertical_scroll_bar_type = vertical_scroll_bar_none, desired_cursor = FILLED_BOX_CURSOR, cursor_width = 0, blink_off_cursor = FILLED_BOX_CURSOR, blink_off_cursor_width = 0, message_buf = 0x0, scroll_bottom_vpos = 0, config_scroll_bar_width = 0, config_scroll_bar_cols = 0, scroll_bar_actual_width = 0, cost_calculation_baud_rate = 0, alpha = {0, 0}, gamma = 0, extra_line_spacing = 0, background_pixel = 0, foreground_pixel = 0}

If I start the debugger from a KDE session there are different values:

Breakpoint 1, compute_fringe_widths (f=0x8580f90, redraw=1) at fringe.c:1214
(gdb) p font_wid
$1 = 10
(gdb) p left_wid
$2 = 8
(gdb) p right_wid
$3 = 8

Interesting differences in the frame struct are:
LXDE: resx = 0, resy = 0, column_width = 0, space_width = 0, line_height = 0
KDE : resx = 93.068702290076331, resy = 94.953271028037378, column_width = 10, space_width = 10, line_height = 20

The patch which might cause this bug is http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/lucid/emacs23/lucid-proposed/revision/13, and there is a debian/patches/fix-huge-fonts.diff which modifies these frame fields:

172 +static void
173 +apply_xft_settings (dpyinfo, send_event_p)
174 + struct x_display_info *dpyinfo;
175 + int send_event_p;
176 +{
177 + double dpi;
178 + if (!read_xft_dpi (dpyinfo, &dpi))
179 + return;
180 +
181 + /* Change the DPI on this display and all frames on the display. */
182 + Lisp_Object frame, tail;
183 + dpyinfo->resy = dpyinfo->resx = dpi;
184 + FOR_EACH_FRAME (tail, frame)
185 + if (FRAME_X_P (XFRAME (frame))
186 + && FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo)
187 + XFRAME (frame)->resy = XFRAME (frame)->resx = dpi;
188 +}

It seems that on LXDE, a dpi value of 0 is returned, which is then set to the frame's resy and resx properties and later propagates to column_width. If I catch this case, emacs runs again:

--- debian/patches/fix-huge-fonts.diff.orig 2011-02-25 09:27:38.900821363 +0100
+++ debian/patches/fix-huge-fonts.diff 2011-02-25 08:00:53.469874683 +0100
@@ -16,7 +16,7 @@
  #ifdef USE_LUCID
  extern int xlwmenu_window_p P_ ((Widget w, Window window));
  extern void xlwmenu_redisplay P_ ((Widget));
-@@ -5829,6 +5832,237 @@ event_handler_gdk (gxev, ev, data)
+@@ -5829,6 +5832,239 @@ event_handler_gdk (gxev, ev, data)
  }
  #endif /* USE_GTK */

@@ -177,6 +177,8 @@
 + double dpi;
 + if (!read_xft_dpi (dpyinfo, &dpi))
 + return;
++ if (dpi == 0.0)
++ return;
 +
 + /* Change the DPI on this display and all frames on the display. */
 + Lisp_Object frame, tail;

Regards,
Urs