[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Face alias bugs (Re: abort() in keyboard.c)
From: |
Károly Lőrentey |
Subject: |
Face alias bugs (Re: abort() in keyboard.c) |
Date: |
Wed, 13 Apr 2005 07:48:02 +0200 |
User-agent: |
Gnus/5.110003 (No Gnus v0.3) Emacs/22.0.50 (gnu/linux) |
I have received a backtrace for an aborted multi-tty session from Ami
Fischman that is relevant to the trunk as well.
The abort was caused by Emacs entering the debugger during redisplay
because of a property list on a face symbol that was not a well-formed
Lisp list (see frames #23-26 in the backtrace at the bottom).
Beside the (rare) crash condition, there are other symptoms that are
easier to reproduce. For example (in a recent CVS):
emacs -q
(setplist 'default (append (symbol-plist 'default) (cons 'foo 'bar)))
C-h i
<Redisplay loops>
Recursive aliases are fun as well:
emacs -q
(put 'foo 'face-alias 'default)
(put 'default 'face-alias 'foo)
C-h i
<unquitable loop>
The patch below fixes all these problems by protecting the call to
Fget inside resolve_face_name and limiting the number of indirections
during a single face lookup.
*** orig/src/xfaces.c
--- mod/src/xfaces.c
***************
*** 3201,3206 ****
--- 3201,3220 ----
+ static Lisp_Object
+ internal_resolve_face_name (nargs, args)
+ int nargs;
+ Lisp_Object *args;
+ {
+ return Fget (args[0], args[1]);
+ }
+
+ static Lisp_Object
+ resolve_face_name_error (ignore)
+ Lisp_Object ignore;
+ {
+ return Qnil;
+ }
/* Resolve face name FACE_NAME. If FACE_NAME is a string, intern it
to make it a symvol. If FACE_NAME is an alias for another face,
***************
*** 3211,3227 ****
Lisp_Object face_name;
{
Lisp_Object aliased;
if (STRINGP (face_name))
face_name = intern (SDATA (face_name));
! while (SYMBOLP (face_name))
{
! aliased = Fget (face_name, Qface_alias);
if (NILP (aliased))
break;
else
face_name = aliased;
}
return face_name;
--- 3225,3249 ----
Lisp_Object face_name;
{
Lisp_Object aliased;
+ Lisp_Object args[2];
+ int c = 0;
if (STRINGP (face_name))
face_name = intern (SDATA (face_name));
! /* Protect against loops by limiting the number of indirections. */
! while (SYMBOLP (face_name) && c < 10)
{
! /* Fget can signal an error; just ignore it. */
! args[0] = face_name;
! args[1] = Qface_alias;
! aliased = internal_condition_case_2 (internal_resolve_face_name, 2,
args, Qt,
! resolve_face_name_error);
if (NILP (aliased))
break;
else
face_name = aliased;
+ c++;
}
return face_name;
Ami Fischman <address@hidden> writes:
> I just had an abort hit in an emacs session running under gdb under screen,
> with X frames open at work and home. The backtrace is after my .sig. Not
> really sure what if any useful info can be gleaned from it. Does this ring
> any bells for anyone?
>
> #0 0x402feae1 in __kill () from /lib/i686/libc.so.6
> #1 0x080d8cfe in abort () at /workplace2/cvs/emacs/src/emacs.c:458
> #2 0x080dd8fd in read_char (commandflag=1, nmaps=5, maps=0xbfffbe30,
> prev_event=137388369, used_mouse_menu=0xbfffbe84)
> at /workplace2/cvs/emacs/src/keyboard.c:2633
> #3 0x080e47ad in read_key_sequence (keybuf=0xbfffbf90, bufsize=30,
> prompt=137388369, dont_downcase_last=0, can_return_switch_frame=1,
> fix_current_buffer=1) at /workplace2/cvs/emacs/src/keyboard.c:8872
> #4 0x080dbc80 in command_loop_1 () at
> /workplace2/cvs/emacs/src/keyboard.c:1523
> #5 0x081344cd in internal_condition_case (bfun=0x80db964 <command_loop_1>,
> handlers=137449369, hfun=0x80db518 <cmd_error>)
> at /workplace2/cvs/emacs/src/eval.c:1385
> #6 0x080db7d8 in command_loop_2 () at
> /workplace2/cvs/emacs/src/keyboard.c:1304
> #7 0x08134005 in internal_catch (tag=137484681, func=0x80db7b4
> <command_loop_2>, arg=137388369) at /workplace2/cvs/emacs/src/eval.c:1144
> #8 0x080db73d in command_loop () at /workplace2/cvs/emacs/src/keyboard.c:1271
> #9 0x080db2a4 in recursive_edit_1 () at
> /workplace2/cvs/emacs/src/keyboard.c:980
> #10 0x080db3e0 in Frecursive_edit () at
> /workplace2/cvs/emacs/src/keyboard.c:1041
> #11 0x08135f05 in Ffuncall (nargs=1, args=0xbfffc2d0) at
> /workplace2/cvs/emacs/src/eval.c:2783
> #12 0x0815b61c in Fbyte_code (bytestr=180765107, vector=191568892,
> maxdepth=32) at /workplace2/cvs/emacs/src/bytecode.c:686
> #13 0x0813556a in Feval (form=197747269) at
> /workplace2/cvs/emacs/src/eval.c:2138
> #14 0x08133012 in Fprogn (args=197747109) at
> /workplace2/cvs/emacs/src/eval.c:408
> #15 0x0808b687 in Fsave_window_excursion (args=197747109) at
> /workplace2/cvs/emacs/src/window.c:6123
> #16 0x0815ba35 in Fbyte_code (bytestr=180765267, vector=177288436,
> maxdepth=208) at /workplace2/cvs/emacs/src/bytecode.c:835
> #17 0x08136455 in funcall_lambda (fun=200312492, nargs=2,
> arg_vector=0xbfffc5a4) at /workplace2/cvs/emacs/src/eval.c:2974
> #18 0x08136016 in Ffuncall (nargs=3, args=0xbfffc5a0) at
> /workplace2/cvs/emacs/src/eval.c:2843
> #19 0x08135909 in Fapply (nargs=2, args=0xbfffc620) at
> /workplace2/cvs/emacs/src/eval.c:2284
> #20 0x08135c11 in apply1 (fn=137633761, arg=193985885) at
> /workplace2/cvs/emacs/src/eval.c:2545
> #21 0x08132e2c in call_debugger (arg=193985885) at
> /workplace2/cvs/emacs/src/eval.c:265
> #22 0x08134bd5 in find_handler_clause (handlers=137449369,
> conditions=137417789, sig=137449393, data=137388369,
> debugger_value_ptr=0xbfffc704)
> at /workplace2/cvs/emacs/src/eval.c:1728
> #23 0x0813485c in Fsignal (error_symbol=137449393, data=137388369) at
> /workplace2/cvs/emacs/src/eval.c:1559
> #24 0x0813c8df in Fplist_get (plist=137984389, prop=137437753) at
> /workplace2/cvs/emacs/src/fns.c:1993
> #25 0x0813c9c3 in Fget (symbol=137437321, propname=137437753) at
> /workplace2/cvs/emacs/src/fns.c:2038
> #26 0x080ad371 in resolve_face_name (face_name=137437321) at
> /workplace2/cvs/emacs/src/xfaces.c:3223
> #27 0x080ad39f in lface_from_face_name (f=0xa816d18, face_name=137437321,
> signal_p=0) at /workplace2/cvs/emacs/src/xfaces.c:3251
> #28 0x080ad412 in get_lface_attributes (f=0xa816d18, face_name=137437321,
> attrs=0xbfffc818, signal_p=0) at /workplace2/cvs/emacs/src/xfaces.c:3284
> #29 0x080ada54 in merge_named_face (f=0xa816d18, face_name=137437321,
> to=0xbfffc9a4, named_merge_points=0xbfffc810)
> at /workplace2/cvs/emacs/src/xfaces.c:3553
> #30 0x080ade7f in merge_face_ref (f=0xa816d18, face_ref=137437321,
> to=0xbfffc9a4, err_msgs=1, named_merge_points=0x0)
> at /workplace2/cvs/emacs/src/xfaces.c:3790
> #31 0x080b2db2 in face_at_buffer_position (w=0xc1a03d8, pos=215,
> region_beg=-1, region_end=-1, endptr=0xbfffca34, limit=315, mouse=0)
> at /workplace2/cvs/emacs/src/xfaces.c:7578
> #32 0x08061bd3 in handle_face_prop (it=0xbfffcdf8) at
> /workplace2/cvs/emacs/src/xdisp.c:2968
> #33 0x08061741 in handle_stop (it=0xbfffcdf8) at
> /workplace2/cvs/emacs/src/xdisp.c:2703
> #34 0x0806476d in reseat (it=0xbfffcdf8, pos={charpos = 215, bytepos = 215},
> force_p=1) at /workplace2/cvs/emacs/src/xdisp.c:4828
> #35 0x080611d7 in init_iterator (it=0xbfffcdf8, w=0xc1a03d8, charpos=215,
> bytepos=215, row=0xc0e6618, base_face_id=DEFAULT_FACE_ID)
> at /workplace2/cvs/emacs/src/xdisp.c:2378
> #36 0x08061286 in start_display (it=0xbfffcdf8, w=0xc1a03d8, pos={charpos =
> 215, bytepos = 215}) at /workplace2/cvs/emacs/src/xdisp.c:2397
> #37 0x0806b59e in redisplay_internal (preserve_echo_area=1) at
> /workplace2/cvs/emacs/src/xdisp.c:10204
> #38 0x0806beab in redisplay_preserve_echo_area (from_where=8) at
> /workplace2/cvs/emacs/src/xdisp.c:10649
> #39 0x080e61f8 in detect_input_pending_run_timers (do_display=1) at
> /workplace2/cvs/emacs/src/keyboard.c:9966
> #40 0x08161c30 in wait_reading_process_output (time_limit=30, microsecs=0,
> read_kbd=-1, do_display=1, wait_for_cell=137388369, wait_proc=0x0,
> just_wait_proc=0) at /workplace2/cvs/emacs/src/process.c:4451
> #41 0x08056d3b in sit_for (sec=30, usec=0, reading=1, display=1,
> initial_display=0) at /workplace2/cvs/emacs/src/dispnew.c:6393
> #42 0x080ddce1 in read_char (commandflag=1, nmaps=3, maps=0xbfffd5d0,
> prev_event=137388369, used_mouse_menu=0xbfffd614)
> at /workplace2/cvs/emacs/src/keyboard.c:2763
> #43 0x080e47ad in read_key_sequence (keybuf=0xbfffd720, bufsize=30,
> prompt=137388369, dont_downcase_last=0, can_return_switch_frame=1,
> fix_current_buffer=1) at /workplace2/cvs/emacs/src/keyboard.c:8872
> #44 0x080dbc80 in command_loop_1 () at
> /workplace2/cvs/emacs/src/keyboard.c:1523
> #45 0x081344cd in internal_condition_case (bfun=0x80db964 <command_loop_1>,
> handlers=137449369, hfun=0x80db518 <cmd_error>)
> at /workplace2/cvs/emacs/src/eval.c:1385
> #46 0x080db7d8 in command_loop_2 () at
> /workplace2/cvs/emacs/src/keyboard.c:1304
> #47 0x08134005 in internal_catch (tag=137443353, func=0x80db7b4
> <command_loop_2>, arg=137388369) at /workplace2/cvs/emacs/src/eval.c:1144
> #48 0x080db787 in command_loop () at /workplace2/cvs/emacs/src/keyboard.c:1283
> #49 0x080db2a4 in recursive_edit_1 () at
> /workplace2/cvs/emacs/src/keyboard.c:980
> #50 0x080db3e0 in Frecursive_edit () at
> /workplace2/cvs/emacs/src/keyboard.c:1041
> #51 0x080da0ff in main (argc=1, argv=0xbfffdcf4) at
> /workplace2/cvs/emacs/src/emacs.c:1767
> The program is running. Exit anyway? (y or n)
--
Károly
pgpasnaabOedq.pgp
Description: PGP signature
- Face alias bugs (Re: abort() in keyboard.c),
Károly Lőrentey <=