* bug#11984: 24.1; segfault while deleting a window
@ 2012-07-18 22:08 Russell Sim
2012-07-19 3:05 ` Eli Zaretskii
0 siblings, 1 reply; 22+ messages in thread
From: Russell Sim @ 2012-07-18 22:08 UTC (permalink / raw)
To: 11984
Hi,
So I recently started playing around with the python-mode test cases and
during the batch mode execution I seem to be able to induce a segfault
every time. I'm running a build of the emacs24.1 tag from the git
repository, the ref is d2ba302127b8dac9b3e02db5c403293982e60e84.
This isn't strictly run with -Q because there are a bunch of tests that
are loaded but it is a consistent case and I can easily gather more
information if needed. Here is the core dump from one of the crashes
http://russellsim.org/emacs-24.d2ba302.core I made it with debug enabled
if you would like any more info i would be glad to provide it.
Cheers,
Russell
#0 0x000000000048c435 in Fdelete_other_windows_internal (window=24353749, root=24387925) at window.c:2649
#1 0x0000000000602831 in Ffuncall (nargs=3, args=0x7ffffffe3e30) at eval.c:3005
#2 0x000000000064dc18 in exec_byte_code (bytestr=9704177, vector=9704229, maxdepth=20, args_template=12726818, nargs=0, args=0x0) at bytecode.c:785
#3 0x000000000064d183 in Fbyte_code (bytestr=9704177, vector=9704229, maxdepth=20) at bytecode.c:423
#4 0x00000000006011ef in eval_sub (form=9704150) at eval.c:2356
#5 0x00000000005fee2b in internal_catch (tag=13220914, func=0x600b55 <eval_sub>, arg=9704150) at eval.c:1272
#6 0x000000000064e877 in exec_byte_code (bytestr=9703985, vector=9704021, maxdepth=16, args_template=12726818, nargs=0, args=0x0) at bytecode.c:966
#7 0x0000000000603231 in funcall_lambda (fun=9703925, nargs=0, arg_vector=0x7ffffffe48f0) at eval.c:3233
#8 0x0000000000602d38 in apply_lambda (fun=9703925, args=12726818) at eval.c:3110
#9 0x00000000006013b4 in eval_sub (form=22167222) at eval.c:2395
#10 0x00000000005fd383 in Fprogn (args=24543862) at eval.c:364
#11 0x00000000005fea78 in Flet (args=24543814) at eval.c:1120
#12 0x0000000000600eae in eval_sub (form=24543798) at eval.c:2298
#13 0x0000000000601488 in eval_sub (form=23627398) at eval.c:2411
#14 0x00000000005fd383 in Fprogn (args=23627494) at eval.c:364
#15 0x00000000005fea78 in Flet (args=23627382) at eval.c:1120
#16 0x0000000000600eae in eval_sub (form=23627318) at eval.c:2298
#17 0x00000000005fd383 in Fprogn (args=23627510) at eval.c:364
#18 0x00000000006031cc in funcall_lambda (fun=23627526, nargs=1, arg_vector=0x7ffffffe53d8) at eval.c:3226
#19 0x0000000000602acd in Ffuncall (nargs=2, args=0x7ffffffe53d0) at eval.c:3063
#20 0x00000000005fcaa6 in Fcall_interactively (function=22507826, record_flag=12726818, keys=12773141) at callint.c:852
#21 0x0000000000602860 in Ffuncall (nargs=4, args=0x7ffffffe56f0) at eval.c:3009
#22 0x0000000000602066 in call3 (fn=12867138, arg1=22507826, arg2=12726818, arg3=12726818) at eval.c:2802
#23 0x00000000005767d7 in Fcommand_execute (cmd=22507826, record_flag=12726818, keys=12726818, special=12726818) at keyboard.c:10330
#24 0x0000000000602893 in Ffuncall (nargs=2, args=0x7ffffffe5910) at eval.c:3013
#25 0x000000000064dc18 in exec_byte_code (bytestr=9958345, vector=9958381, maxdepth=88, args_template=1028, nargs=1, args=0x7ffffffe5e10) at bytecode.c:785
#26 0x0000000000602f5b in funcall_lambda (fun=9958293, nargs=1, arg_vector=0x7ffffffe5e08) at eval.c:3167
#27 0x0000000000602a19 in Ffuncall (nargs=2, args=0x7ffffffe5e00) at eval.c:3051
#28 0x000000000064dc18 in exec_byte_code (bytestr=9934113, vector=9934149, maxdepth=72, args_template=0, nargs=0, args=0x7ffffffe6350) at bytecode.c:785
#29 0x0000000000602f5b in funcall_lambda (fun=9934061, nargs=0, arg_vector=0x7ffffffe6350) at eval.c:3167
#30 0x0000000000602a19 in Ffuncall (nargs=1, args=0x7ffffffe6348) at eval.c:3051
#31 0x000000000064dc18 in exec_byte_code (bytestr=9928657, vector=9928693, maxdepth=32, args_template=0, nargs=0, args=0x7ffffffe6780) at bytecode.c:785
#32 0x0000000000602f5b in funcall_lambda (fun=9928605, nargs=0, arg_vector=0x7ffffffe6780) at eval.c:3167
#33 0x0000000000602d38 in apply_lambda (fun=9928605, args=12726818) at eval.c:3110
#34 0x00000000006013b4 in eval_sub (form=13141254) at eval.c:2395
#35 0x0000000000600b43 in Feval (form=13141254, lexical=12726818) at eval.c:2204
#36 0x0000000000563b51 in top_level_2 () at keyboard.c:1169
#37 0x00000000005ff4a1 in internal_condition_case (bfun=0x563b34 <top_level_2>, handlers=12779106, hfun=0x563710 <cmd_error>) at eval.c:1515
#38 0x0000000000563b8b in top_level_1 (ignore=12726818) at keyboard.c:1177
#39 0x00000000005fee2b in internal_catch (tag=12774850, func=0x563b53 <top_level_1>, arg=12726818) at eval.c:1272
#40 0x0000000000563aaf in command_loop () at keyboard.c:1132
#41 0x0000000000563254 in recursive_edit_1 () at keyboard.c:759
#42 0x00000000005633f7 in Frecursive_edit () at keyboard.c:823
#43 0x0000000000561494 in main (argc=1739, argv=0x7ffffffe71a8) at emacs.c:1715
In GNU Emacs 24.1.1 (x86_64-unknown-linux-gnu, GTK+ Version 2.24.10)
of 2012-07-18 on marvin
Windowing system distributor `The X.Org Foundation', version 11.0.11104000
Configured using:
`configure 'CFLAGS=-ggdb3 -O0' 'CXXFLAGS=-ggdb3 -O0' 'LDFLAGS=-ggdb3''
Important settings:
value of $LC_ALL: nil
value of $LC_COLLATE: nil
value of $LC_CTYPE: nil
value of $LC_MESSAGES: nil
value of $LC_MONETARY: nil
value of $LC_NUMERIC: nil
value of $LC_TIME: nil
value of $LANG: en_AU.UTF-8
value of $XMODIFIERS: nil
locale-coding-system: utf-8-unix
default enable-multibyte-characters: t
Major mode: Comint
Minor modes in effect:
shell-dirtrack-mode: t
compilation-shell-minor-mode: t
tooltip-mode: t
mouse-wheel-mode: t
tool-bar-mode: t
menu-bar-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
blink-cursor-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
line-number-mode: t
transient-mark-mode: t
Recent input:
M-x r e p <tab> o r t <tab> <return>
Recent messages:
Saving file /home/russell/tmp/classblah.py...
Wrote /home/russell/tmp/classblah.py
Can't find completion for "CLASS_INS.someDe"
Scanning for dabbrevs...done
Expansion found in 'classblah.py'
pycomplete-same-folder-class-lp:889052-test passed
python-shell-complete-test passed
usr-bin-python2.7-shell-complete-test passed
progn: Wrong type argument: char-or-string-p, nil
Making completion list...
Load-path shadows:
None found.
Features:
(shadow sort gnus-util mail-extr emacsbug message byte-opt format-spec
rfc822 mml mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231
mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums
mm-util mail-prsvr mail-utils help-mode view vc-git thingatpt dabbrev
noutline outline py-shell-completion-tests python-extended-executes-test
python-mode-test py-bug-numbered-tests pycomplete python-mode easymenu
easy-mmode edmacro kmacro imenu flymake rx shell pcomplete compile
skeleton bytecomp byte-compile cconv macroexp comint derived ansi-color
ring cl cc-cmds cc-engine cc-vars cc-defs regexp-opt cc-bytecomp pymacs
advice help-fns advice-preload time-date tooltip ediff-hook vc-hooks
lisp-float-type mwheel x-win x-dnd tool-bar dnd fontset image fringe
lisp-mode register page menu-bar rfn-eshadow timer select scroll-bar
mouse jit-lock font-lock syntax facemenu font-core frame cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese hebrew greek romanian slovak czech european ethiopic indian
cyrillic chinese case-table epa-hook jka-cmpr-hook help simple abbrev
minibuffer loaddefs button faces cus-face files text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote make-network-process dbusbind
dynamic-setting system-font-setting font-render-setting move-toolbar gtk
x-toolkit x multi-tty emacs)
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-18 22:08 bug#11984: 24.1; segfault while deleting a window Russell Sim
@ 2012-07-19 3:05 ` Eli Zaretskii
2012-07-19 3:39 ` Chong Yidong
0 siblings, 1 reply; 22+ messages in thread
From: Eli Zaretskii @ 2012-07-19 3:05 UTC (permalink / raw)
To: Russell Sim; +Cc: 11984
> From: Russell Sim <russell.sim@gmail.com>
> Date: Thu, 19 Jul 2012 08:08:32 +1000
>
> So I recently started playing around with the python-mode test cases and
> during the batch mode execution I seem to be able to induce a segfault
> every time. I'm running a build of the emacs24.1 tag from the git
> repository, the ref is d2ba302127b8dac9b3e02db5c403293982e60e84.
>
>
> This isn't strictly run with -Q because there are a bunch of tests that
> are loaded but it is a consistent case and I can easily gather more
> information if needed. Here is the core dump from one of the crashes
> http://russellsim.org/emacs-24.d2ba302.core I made it with debug enabled
> if you would like any more info i would be glad to provide it.
>
> Cheers,
> Russell
>
>
>
> #0 0x000000000048c435 in Fdelete_other_windows_internal (window=24353749, root=24387925) at window.c:2649
> #1 0x0000000000602831 in Ffuncall (nargs=3, args=0x7ffffffe3e30) at eval.c:3005
Please see if this isn't a duplicate of #11677.
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-19 3:05 ` Eli Zaretskii
@ 2012-07-19 3:39 ` Chong Yidong
2012-07-19 10:41 ` martin rudalics
2012-07-20 23:44 ` Russell Sim
0 siblings, 2 replies; 22+ messages in thread
From: Chong Yidong @ 2012-07-19 3:39 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Russell Sim, 11984
Eli Zaretskii <eliz@gnu.org> writes:
> Please see if this isn't a duplicate of #11677.
I think the fix for 11677 doesn't go far enough. I can still produce a
crash on trunk by calling delete-other-windows-internal for a window on
a dead frame:
M-: (setq w (selected-window)) RET
M-: (setq f (selected-frame)) RET
C-x 5 2
M-: (delete-frame f) RET
M-: (delete-other-windows-internal w) RET
Fatal error (11)Segmentation fault (core dumped)
There's a similar problem with window-absolute-pixel-edges.
I committed a fix to the emacs-24 branch adding CHECK_LIVE_FRAME calls
to those two functions (patch below). But for long-term safety, I think
decode_any_windows had better signal an error if the window's frame
isn't live. But I'm not sure if there's any subtle reliance in existing
code on allowing window functions to be called for windows on dead
frames---anyone know?
*** src/ChangeLog 2012-07-14 10:46:56 +0000
--- src/ChangeLog 2012-07-19 03:33:08 +0000
***************
*** 1,3 ****
--- 1,9 ----
+ 2012-07-19 Chong Yidong <cyd@gnu.org>
+
+ * window.c (Fwindow_absolute_pixel_edges)
+ (Fdelete_other_windows_internal): Signal an error if the window is
+ on a dead frame (Bug#11984).
+
2012-07-14 Eli Zaretskii <eliz@gnu.org>
Remove FILE_SYSTEM_CASE.
=== modified file 'src/window.c'
*** src/window.c 2012-04-23 16:22:23 +0000
--- src/window.c 2012-07-19 03:33:08 +0000
***************
*** 484,492 ****
(Lisp_Object window, Lisp_Object limit)
{
register struct window *w = decode_any_window (window);
-
w->combination_limit = limit;
-
return w->combination_limit;
}
--- 484,490 ----
***************
*** 800,805 ****
--- 798,805 ----
{
register struct window *w = decode_any_window (window);
int add_x, add_y;
+
+ CHECK_LIVE_FRAME (w->frame);
calc_absolute_offset (w, &add_x, &add_y);
return Fcons (make_number (WINDOW_LEFT_EDGE_X (w) + add_x),
***************
*** 2568,2573 ****
--- 2568,2574 ----
Mouse_HLInfo *hlinfo;
w = decode_any_window (window);
+ CHECK_LIVE_FRAME (w->frame);
XSETWINDOW (window, w);
f = XFRAME (w->frame);
***************
*** 2581,2586 ****
--- 2582,2588 ----
/* ROOT must be an ancestor of WINDOW. */
{
r = decode_any_window (root);
+ CHECK_LIVE_FRAME (r->frame);
pwindow = XWINDOW (window)->parent;
while (!NILP (pwindow))
if (EQ (pwindow, root))
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-19 3:39 ` Chong Yidong
@ 2012-07-19 10:41 ` martin rudalics
2012-07-21 6:18 ` Chong Yidong
2012-07-20 23:44 ` Russell Sim
1 sibling, 1 reply; 22+ messages in thread
From: martin rudalics @ 2012-07-19 10:41 UTC (permalink / raw)
To: Chong Yidong; +Cc: Russell Sim, 11984
> But for long-term safety, I think
> decode_any_windows had better signal an error if the window's frame
> isn't live. But I'm not sure if there's any subtle reliance in existing
> code on allowing window functions to be called for windows on dead
> frames---anyone know?
Maybe the best way to find out is to install such a change?
martin
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-19 3:39 ` Chong Yidong
2012-07-19 10:41 ` martin rudalics
@ 2012-07-20 23:44 ` Russell Sim
2012-07-21 0:12 ` Russell Sim
1 sibling, 1 reply; 22+ messages in thread
From: Russell Sim @ 2012-07-20 23:44 UTC (permalink / raw)
To: Chong Yidong; +Cc: 11984
Chong Yidong <cyd@gnu.org> writes:
> Eli Zaretskii <eliz@gnu.org> writes:
>
>> Please see if this isn't a duplicate of #11677.
>
> I think the fix for 11677 doesn't go far enough. I can still produce a
> crash on trunk by calling delete-other-windows-internal for a window on
> a dead frame:
>
> M-: (setq w (selected-window)) RET
> M-: (setq f (selected-frame)) RET
> C-x 5 2
> M-: (delete-frame f) RET
> M-: (delete-other-windows-internal w) RET
> Fatal error (11)Segmentation fault (core dumped)
>
> There's a similar problem with window-absolute-pixel-edges.
>
> I committed a fix to the emacs-24 branch adding CHECK_LIVE_FRAME calls
> to those two functions (patch below). But for long-term safety, I think
> decode_any_windows had better signal an error if the window's frame
> isn't live. But I'm not sure if there's any subtle reliance in existing
> code on allowing window functions to be called for windows on dead
> frames---anyone know?
Thanks for the champion effort, but I can still create the bug on
emacs-24 3770cb4 which includes Chongs patch.
Here is a full backtrace, and another core
http://russellsim.org/emacs-24.3770cb4.core
Cheers,
Russell
#0 0x000000000048c56f in Fdelete_other_windows_internal (window=23377989, root=24273109) at window.c:2651
w = 0x164b840
r = 0x17260d0
s = 0xc59212
f = 0xc390d0
sibling = 812
pwindow = 23377989
swindow = 13333010
delta = 12726818
startpos = 1
top = 4
new_top = 32767
resize_failed = -115344
hlinfo = 0xc23222
#1 0x00000000006029a1 in Ffuncall (nargs=3, args=0x7ffffffe3e30) at eval.c:3005
fun = 9345349
original_fun = 12950978
funcar = 103079215107
numargs = 2
lisp_numargs = 12782626
val = 12726818
backtrace = {next = 0x7ffffffe42e0, function = 0x7ffffffe3e30, args = 0x7ffffffe3e38, nargs = 2, debug_on_exit = 0}
internal_args = 0x7ffffffe3e38
i = 12726818
#2 0x000000000064dd88 in exec_byte_code (bytestr=9699617, vector=9699669, maxdepth=20, args_template=12726818, nargs=0, args=0x0) at bytecode.c:785
count = 25
op = 2
vectorp = 0x940160
stack = {pc = 0xb6f0b9 "\210\323\r!\210\324\r!\210Շ", byte_string = 9699617, byte_string_start = 0xb6f058 "\b\204U", constants = 9699669, next = 0x7ffffffe4540}
top = 0x7ffffffe3e30
result = 140737488241984
#3 0x000000000064d2f3 in Fbyte_code (bytestr=9699617, vector=9699669, maxdepth=20) at bytecode.c:423
No locals.
#4 0x000000000060135f in eval_sub (form=9699590) at eval.c:2356
numargs = 12
args_left = 12726818
i = 3
maxargs = 3
argvals = {9699617, 9699669, 20, 140737488241376, 140737488241384, 1, 140737488241296, 5816636}
fun = 12107941
val = 12816597
original_fun = 12866754
original_args = 9699606
funcar = 5815311
backtrace = {next = 0x7ffffffe4a80, function = 0x7ffffffe4310, args = 0x7ffffffe4240, nargs = 3, debug_on_exit = 0}
gcpro1 = {next = 0x7ffffffe4310, var = 0x60212c, nvars = 12864482}
gcpro2 = {next = 0xc23222, var = 0xc23222, nvars = 12726818}
gcpro3 = {next = 0x1, var = 0x7ffffffe4240, nvars = 3}
#5 0x00000000005fef9b in internal_catch (tag=13220914, func=0x600cc5 <eval_sub>, arg=9699590) at eval.c:1272
c = {tag = 13220914, val = 12726818, next = 0x7ffffffe6a50, gcpro = 0x0, jmp = {{__jmpbuf = {140737488242928, -6975756009278694919, 140737488242928, 140737488243584, 0, 0, -6975756009104631303,
6975756540123650553}, __mask_was_saved = 0, __saved_mask = {__val = {6302601, 140737488241872, 16, 12726818, 94489280514, 140737488241872, 2, 140737488243328, 140737488241872, 140737488241880,
1, 24501732, 12769218, 12726818, 13453714, 1}}}}, backlist = 0x7ffffffe4a80, handlerlist = 0x7ffffffe6a20, lisp_eval_depth = 10, pdlcount = 25, poll_suppress_count = 1,
interrupt_input_blocked = 0, byte_stack = 0x7ffffffe4540}
#6 0x000000000064e9e7 in exec_byte_code (bytestr=9699425, vector=9699461, maxdepth=16, args_template=12726818, nargs=0, args=0x0) at bytecode.c:966
v1 = 9699590
count = 20
op = 141
vectorp = 0x940090
stack = {pc = 0xb6f0e2 "-\207", byte_string = 9699425, byte_string_start = 0xb6f0c5 "\306\b!\020\307\b!\031\310\b\311\"\032\310\b\303\"\033ʉ\034\035\313\t!\210\314͍-\207", constants = 9699461,
next = 0x7ffffffe59a0}
top = 0x7ffffffe44d0
result = 9465332
#7 0x00000000006033a1 in funcall_lambda (fun=9699365, nargs=0, arg_vector=0x7ffffffe48f0) at eval.c:3233
val = 24501733
syms_left = 12726818
next = 12782626
lexenv = 12726818
count = 19
i = 0
optional = 1
rest = 0
#8 0x0000000000602ea8 in apply_lambda (fun=9699365, args=12726818) at eval.c:3110
args_left = 12726818
i = 0
numargs = 0
arg_vector = 0x7ffffffe48f0
gcpro1 = {next = 0x7ffffffe49b0, var = 0x5fd422, nvars = 0}
gcpro2 = {next = 0xc40d72, var = 0xc23222, nvars = 12726818}
gcpro3 = {next = 0x7ffffffe49b0, var = 0xc23222, nvars = 9469820}
tem = 24501733
sa_count = 19
sa_must_free = 0
#9 0x0000000000601524 in eval_sub (form=22141830) at eval.c:2395
fun = 9699365
val = 24501733
original_fun = 13582674
original_args = 12726818
funcar = 4307814658
backtrace = {next = 0x7ffffffe4d50, function = 0x7ffffffe4ab0, args = 0x7ffffffe48f0, nargs = 0, debug_on_exit = 0}
gcpro1 = {next = 0xc23222, var = 0x7ffffffe4b80, nvars = 140737488243344}
gcpro2 = {next = 0x16e1ee0, var = 0xbfbf10, nvars = 83}
gcpro3 = {next = 0xbfbf10, var = 0xc23252, nvars = 2}
#10 0x00000000005fd4f3 in Fprogn (args=24304358) at eval.c:364
val = 24501733
gcpro1 = {next = 0x14ca9d2, var = 0xc23222, nvars = 0}
#11 0x00000000005febe8 in Flet (args=24304310) at eval.c:1120
temps = 0x7ffffffe4b80
tem = 12726818
lexenv = 12726818
elt = 19830738
varlist = 12726818
count = 11
argnum = 8
gcpro1 = {next = 0xc23222, var = 0x172daa6, nvars = 140737488243824}
gcpro2 = {next = 0xc23222, var = 0x100000000, nvars = 8}
sa_count = 11
sa_must_free = 0
#12 0x000000000060101e in eval_sub (form=24304294) at eval.c:2298
numargs = 48
args_left = 24304310
i = 23618246
maxargs = 12726818
argvals = {24304294, 22139094, 23038731, 140737488243936, 140737488244112, 6298491, 22139094, 23618230}
fun = 12098237
val = 2
original_fun = 12849106
original_args = 24304310
funcar = 12726818
backtrace = {next = 0x7ffffffe4ec0, function = 0x7ffffffe4d80, args = 0x7ffffffe4d78, nargs = -1, debug_on_exit = 0}
gcpro1 = {next = 0x12c, var = 0x602d3a, nvars = 4}
gcpro2 = {next = 0x7ffffffe4df0, var = 0x10, nvars = 140737488244144}
gcpro3 = {next = 0xc860c2, var = 0x14caa02, nvars = 140737488244112}
#13 0x00000000006015f8 in eval_sub (form=23618198) at eval.c:2411
fun = 22139110
val = 21801474
original_fun = 21801378
original_args = 23618246
funcar = 12847362
backtrace = {next = 0x7ffffffe5160, function = 0x7ffffffe4ef0, args = 0x7ffffffe4ee8, nargs = -1, debug_on_exit = 0}
gcpro1 = {next = 0x7ffffffe4ed0, var = 0x123b6a6, nvars = 19886944}
gcpro2 = {next = 0x7ffffffe4ff0, var = 0x60101e, nvars = 0}
gcpro3 = {next = 0x10, var = 0x168cae1, nvars = 140737488253344}
#14 0x00000000005fd4f3 in Fprogn (args=23618294) at eval.c:364
val = 12726818
gcpro1 = {next = 0x7ffffffe4e40, var = 0xc23222, nvars = 23596737}
#15 0x00000000005febe8 in Flet (args=23618182) at eval.c:1120
temps = 0x7ffffffe4fc0
tem = 23644897
lexenv = 12726818
elt = 23618134
varlist = 12726818
count = 10
argnum = 1
gcpro1 = {next = 0xc23222, var = 0xc1e0d6, nvars = 23487648}
gcpro2 = {next = 0x7ffffffe5040, var = 0x5fd4f3, nvars = 1}
sa_count = 10
sa_must_free = 0
#16 0x000000000060101e in eval_sub (form=23618118) at eval.c:2298
numargs = 8
args_left = 23618182
i = 12726818
maxargs = 12778914
argvals = {1040, 4294967298, 140737263341256, 4294967297, 140737488241632, 20, 3, 3}
fun = 12098237
val = 12726818
original_fun = 12849106
original_args = 23618182
funcar = 6097238
backtrace = {next = 0x7ffffffe5300, function = 0x7ffffffe5190, args = 0x7ffffffe5188, nargs = -1, debug_on_exit = 0}
gcpro1 = {next = 0x7ffffffe5190, var = 0x5d, nvars = 45}
gcpro2 = {next = 0x7ffffffe71a0, var = 0x0, nvars = 0}
gcpro3 = {next = 0x17b3b00, var = 0x7ffffffe57d0, nvars = 140737263341152}
#17 0x00000000005fd4f3 in Fprogn (args=23618310) at eval.c:364
val = 12726818
gcpro1 = {next = 0xbfbe50, var = 0x1, nvars = 14170053}
#18 0x000000000060333c in funcall_lambda (fun=23618326, nargs=1, arg_vector=0x7ffffffe53d8) at eval.c:3226
val = 6187332
syms_left = 12726818
next = 22878050
lexenv = 12726818
count = 8
i = 1
optional = 1
rest = 0
#19 0x0000000000602c3d in Ffuncall (nargs=2, args=0x7ffffffe53d0) at eval.c:3063
fun = 23618326
original_fun = 22815506
funcar = 12778914
numargs = 1
lisp_numargs = 12726818
val = 0
backtrace = {next = 0x7ffffffe5650, function = 0x7ffffffe53d0, args = 0x7ffffffe53d8, nargs = 1, debug_on_exit = 0}
internal_args = 0x7ffffffe53d8
i = 5650438
#20 0x00000000005fcc16 in Fcall_interactively (function=22815506, record_flag=12726818, keys=12773141) at callint.c:852
val = 140737488246352
args = 0x7ffffffe53d0
visargs = 0x7ffffffe53b0
specs = 23644801
filter_specs = 23644801
teml = 3
up_event = 12726818
enable = 12726818
speccount = 6
next_event = 0
prefix_arg = 12726818
string = 0x7ffffffe53f0 "p"
tem = 0x6b49cc ""
varies = 0x7ffffffe5390 ""
i = 2
nargs = 2
foo = 0
arg_from_tty = 0
gcpro1 = {next = 0x18, var = 0x16693d0, nvars = 140737488246000}
gcpro2 = {next = 0x1669588, var = 0xc2fda2, nvars = 0}
gcpro3 = {next = 0x7ffffffe5d80, var = 0x9, nvars = 2}
gcpro4 = {next = 0x7ffffffe54e0, var = 0x5e2ae8, nvars = 2}
gcpro5 = {next = 0x7ffffffe54e0, var = 0x602c3d, nvars = 256}
key_count = 0
record_then_fail = 0
save_this_command = 12726818
save_last_command = 12726818
save_this_original_command = 12726818
save_real_this_command = 12726818
#21 0x00000000006029d0 in Ffuncall (nargs=4, args=0x7ffffffe56f0) at eval.c:3009
fun = 12097229
original_fun = 12867138
funcar = 15073441
numargs = 3
lisp_numargs = 140737488246704
val = 0
backtrace = {next = 0x7ffffffe5820, function = 0x7ffffffe56f0, args = 0x7ffffffe56f8, nargs = 3, debug_on_exit = 0}
internal_args = 0x7ffffffe56f8
i = 140737488253344
#22 0x00000000006021d6 in call3 (fn=12867138, arg1=22815506, arg2=12726818, arg3=12726818) at eval.c:2802
ret_ungc_val = 140737488246736
gcpro1 = {next = 0x7ffffffe5730, var = 0x1686316, nvars = 4}
args = {12867138, 22815506, 12726818, 12726818}
#23 0x0000000000576933 in Fcommand_execute (cmd=22815506, record_flag=12726818, keys=12726818, special=12726818) at keyboard.c:10330
final = 23618326
tem = 12778914
prefixarg = 12726818
#24 0x0000000000602a03 in Ffuncall (nargs=2, args=0x7ffffffe5910) at eval.c:3013
fun = 9363453
original_fun = 12774274
funcar = 9955025
numargs = 1
lisp_numargs = 140737488246928
val = 12726866
backtrace = {next = 0x7ffffffe5d80, function = 0x7ffffffe5910, args = 0x7ffffffe5918, nargs = 1, debug_on_exit = 0}
internal_args = 0x7ffffffe57d0
i = 4
#25 0x000000000064dd88 in exec_byte_code (bytestr=9953465, vector=9953501, maxdepth=88, args_template=1028, nargs=1, args=0x7ffffffe5e10) at bytecode.c:785
count = 4
op = 1
vectorp = 0x97e0e8
stack = {
pc = 0xb5ae54 "\210\202\201\003\006\b \210\202\201\003\016A❃V\001\331\026B\343\344\003\206P\001\n\211A\022@!!\210\202\201\003\016A坃\220\001\346\347\003\206h\001\n\211A\022@!!\262\t\006\a\203\203\001\006\a\006\t\006\tAB\241\210\006\aA\262\b\202\201\003\006\b\016CB\211\026C\262\b\202\201\003\016A蝃\270\001\347\002\206\241\001\n\211A\022@!\346\001!\351\001!\203\256\001\211\262\002\352\002\314\331#\266\003\202\201\003\016A띃\330\001\347\002\206\311\001\n\211A\022@!\346\001!\352\001\314ى$\266\003\202\201\003\016A욃\001\002\331\026B\001\206\353\001\n\211A\022@\262\t\006\b;\204\367\001\332\355!\210", <incomplete sequence \356>..., byte_string = 9953465, byte_string_start = 0xb5ad24 "\306 \210\b\203\021", constants = 9953501, next = 0x7ffffffe5ee0}
top = 0x7ffffffe5910
result = 140737488253344
#26 0x00000000006030cb in funcall_lambda (fun=9953413, nargs=1, arg_vector=0x7ffffffe5e08) at eval.c:3167
val = 16336112
syms_left = 1028
next = 5
lexenv = 12565392
count = 4
i = 12754864
optional = 0
rest = 15091217
#27 0x0000000000602b89 in Ffuncall (nargs=2, args=0x7ffffffe5e00) at eval.c:3051
fun = 9953413
original_fun = 13735682
funcar = 12889074
numargs = 1
lisp_numargs = 140737488253344
val = 18937910
backtrace = {next = 0x7ffffffe62c0, function = 0x7ffffffe5e00, args = 0x7ffffffe5e08, nargs = 1, debug_on_exit = 0}
internal_args = 0xa0
i = 6185953
#28 0x000000000064dd88 in exec_byte_code (bytestr=9929121, vector=9929157, maxdepth=72, args_template=0, nargs=0, args=0x7ffffffe6350) at bytecode.c:785
count = 4
op = 1
vectorp = 0x9781d0
stack = {pc = 0xb5d7f8 "\210\016H\203\224\006\201", <incomplete sequence \330>, byte_string = 9929121, byte_string_start = 0xb5d170 "\306 \020\307\021\n\023\307\024\310\311!\211\307=\204\060",
constants = 9929157, next = 0x7ffffffe63d0}
top = 0x7ffffffe5e00
result = 64
#29 0x00000000006030cb in funcall_lambda (fun=9929069, nargs=0, arg_vector=0x7ffffffe6350) at eval.c:3167
val = 5
syms_left = 0
next = 140737488250752
lexenv = 5
count = 4
i = 140737488249688
optional = 0
rest = 6156621
#30 0x0000000000602b89 in Ffuncall (nargs=1, args=0x7ffffffe6348) at eval.c:3051
fun = 9929069
original_fun = 13184834
funcar = 12760706
numargs = 0
lisp_numargs = 140737488250752
val = 12726818
backtrace = {next = 0x7ffffffe6910, function = 0x7ffffffe6348, args = 0x7ffffffe6350, nargs = 0, debug_on_exit = 0}
internal_args = 0x80
i = 6185953
#31 0x000000000064dd88 in exec_byte_code (bytestr=9923665, vector=9923701, maxdepth=32, args_template=0, nargs=0, args=0x7ffffffe6780) at bytecode.c:785
count = 3
op = 0
vectorp = 0x976c80
stack = {pc = 0xb5e13d "\210)\210\346\347\350\"\210\351\317\352\"\211;\203\240", byte_string = 9923665, byte_string_start = 0xb5e0b6 "\b\203\b", constants = 9923701, next = 0x0}
top = 0x7ffffffe6348
result = 140737488250848
#32 0x00000000006030cb in funcall_lambda (fun=9923613, nargs=0, arg_vector=0x7ffffffe6780) at eval.c:3167
val = 140737353853576
syms_left = 0
next = 8227920807149371393
lexenv = 16
count = 3
i = 140737259718280
optional = 32767
rest = 2
#33 0x0000000000602ea8 in apply_lambda (fun=9923613, args=12726818) at eval.c:3110
args_left = 12726818
i = 0
numargs = 0
arg_vector = 0x7ffffffe6780
gcpro1 = {next = 0x8, var = 0x7ffff26f1cc0, nvars = 0}
gcpro2 = {next = 0xffffffffffffff00, var = 0x7, nvars = 140737488251280}
gcpro3 = {next = 0x8, var = 0x7fffee437000, nvars = 888944}
tem = 0
sa_count = 3
sa_must_free = 0
#34 0x0000000000601524 in eval_sub (form=13140662) at eval.c:2395
fun = 9923613
val = 140737488251672
original_fun = 13834530
args_left = 12726818
i = 0
numargs = 0
arg_vector = 0x7ffffffe6780
gcpro1 = {next = 0x8, var = 0x7ffff26f1cc0, nvars = 0}
gcpro2 = {next = 0xffffffffffffff00, var = 0x7, nvars = 140737488251280}
gcpro3 = {next = 0x8, var = 0x7fffee437000, nvars = 888944}
tem = 0
sa_count = 3
sa_must_free = 0
#34 0x0000000000601524 in eval_sub (form=13140662) at eval.c:2395
fun = 9923613
val = 140737488251672
original_fun = 13834530
original_args = 12726818
funcar = 0
backtrace = {next = 0x0, function = 0x7ffffffe6940, args = 0x7ffffffe6780, nargs = 0, debug_on_exit = 0}
gcpro1 = {next = 0x7fff00000017, var = 0x102a10a06, nvars = 140737259669880}
gcpro2 = {next = 0xa8428197, var = 0xc23222, nvars = 140737488251232}
gcpro3 = {next = 0x10822fdb, var = 0x7ffffffe6930, nvars = 140737353853264}
#35 0x0000000000600cb3 in Feval (form=13140662, lexical=12726818) at eval.c:2204
count = 2
#36 0x0000000000563cad in top_level_2 () at keyboard.c:1169
No locals.
#37 0x00000000005ff611 in internal_condition_case (bfun=0x563c90 <top_level_2>, handlers=12779106, hfun=0x56386c <cmd_error>) at eval.c:1515
val = 5651631
c = {tag = 12726818, val = 12726818, next = 0x7ffffffe6bc0, gcpro = 0x0, jmp = {{__jmpbuf = {0, -6975756009930909191, 4278368, 140737488253344, 0, 0, -6975756009891063303, 6975756539251497465},
__mask_was_saved = 0, __saved_mask = {__val = {4294967295, 13595766, 1, 9336904, 0, 0, 0, 0, 140737351952882, 1, 0, 0, 140737259697808, 0, 0, 140737488252112}}}}, backlist = 0x0,
handlerlist = 0x0, lisp_eval_depth = 0, pdlcount = 2, poll_suppress_count = 1, interrupt_input_blocked = 0, byte_stack = 0x0}
h = {handler = 12779106, var = 12726818, chosen_clause = 48, tag = 0x7ffffffe6a50, next = 0x0}
#38 0x0000000000563ce7 in top_level_1 (ignore=12726818) at keyboard.c:1177
No locals.
#39 0x00000000005fef9b in internal_catch (tag=12774850, func=0x563caf <top_level_1>, arg=12726818) at eval.c:1272
c = {tag = 12774850, val = 12726818, next = 0x0, gcpro = 0x0, jmp = {{__jmpbuf = {0, -6975756010086098439, 4278368, 140737488253344, 0, 0, -6975756009903646215, 6975756540123650553},
__mask_was_saved = 0, __saved_mask = {__val = {6187332, 100, 4294967296, 352, 30064771072, 12121664, 12754864, 344, 0, 140737488252064, 12952912, 14, 0, 4278368, 140737488253344,
140737488252144}}}}, backlist = 0x0, handlerlist = 0x0, lisp_eval_depth = 0, pdlcount = 2, poll_suppress_count = 1, interrupt_input_blocked = 0, byte_stack = 0x0}
#40 0x0000000000563c0b in command_loop () at keyboard.c:1132
No locals.
#41 0x00000000005633b0 in recursive_edit_1 () at keyboard.c:759
count = 1
val = 12726818
#42 0x0000000000563553 in Frecursive_edit () at keyboard.c:823
count = 0
buffer = 12726818
#43 0x00000000005615f0 in main (argc=1739, argv=0x7ffffffe71a8) at emacs.c:1715
dummy = 4239669
stack_bottom_variable = 0 '\000'
do_initial_setlocale = 1
skip_args = 1
rlim = {rlim_cur = 8720000, rlim_max = 18446744073709551615}
no_loadup = 0
junk = 0x0
dname_arg = 0x0
ch_to_dir = 0x7ffff7fc8d38 "\200\344\377\367\377\177"
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-20 23:44 ` Russell Sim
@ 2012-07-21 0:12 ` Russell Sim
2012-07-21 6:31 ` Chong Yidong
2012-07-21 8:02 ` Eli Zaretskii
0 siblings, 2 replies; 22+ messages in thread
From: Russell Sim @ 2012-07-21 0:12 UTC (permalink / raw)
To: Chong Yidong; +Cc: 11984
Russell Sim <russell.sim@gmail.com> writes:
> Chong Yidong <cyd@gnu.org> writes:
>> I committed a fix to the emacs-24 branch adding CHECK_LIVE_FRAME calls
>> to those two functions (patch below). But for long-term safety, I think
>> decode_any_windows had better signal an error if the window's frame
>> isn't live. But I'm not sure if there's any subtle reliance in existing
>> code on allowing window functions to be called for windows on dead
>> frames---anyone know?
>
> Thanks for the champion effort, but I can still create the bug on
> emacs-24 3770cb4 which includes Chongs patch.
>
> Here is a full backtrace, and another core
> http://russellsim.org/emacs-24.3770cb4.core
Oh crap, I just realised that you didn't add you full patch in the
commit. I have re-compiled and included the extra in
window-absolute-pixel-edges and delete-other-windows-internal changes.
Unfortunately I still get the error.
I here is an updated core
file. http://russellsim.org/emacs-24.3770cb4-patch.core
This may or may not help since I have no idea what extra would be
included in a core file, line 2653 has the contents:
hlinfo = MOUSE_HL_INFO (f);
Thanks,
Russell
#0 0x000000000048c5cc in Fdelete_other_windows_internal (window=24470869, root=24128309) at window.c:2653
w = 0x1756550
r = 0x1702b30
s = 0xc59212
f = 0xc390d0
sibling = 812
pwindow = 24470869
swindow = 13333010
delta = 12726818
startpos = 1
top = 4
new_top = 32767
resize_failed = -115344
hlinfo = 0xc23222
#1 0x0000000000602a69 in Ffuncall (nargs=3, args=0x7ffffffe3e30) at eval.c:3005
fun = 9345541
original_fun = 12950978
funcar = 103079215107
numargs = 2
lisp_numargs = 12782626
val = 12726818
backtrace = {next = 0x7ffffffe42e0, function = 0x7ffffffe3e30, args = 0x7ffffffe3e38, nargs = 2, debug_on_exit = 0}
internal_args = 0x7ffffffe3e38
i = 12726818
#2 0x000000000064de50 in exec_byte_code (bytestr=9699809, vector=9699861, maxdepth=20, args_template=12726818, nargs=0, args=0x0) at bytecode.c:785
count = 25
op = 2
vectorp = 0x940220
stack = {pc = 0xb6f179 "\210\323\r!\210\324\r!\210Շ", byte_string = 9699809, byte_string_start = 0xb6f118 "\b\204U", constants = 9699861, next = 0x7ffffffe4540}
top = 0x7ffffffe3e30
result = 140737488241984
#3 0x000000000064d3bb in Fbyte_code (bytestr=9699809, vector=9699861, maxdepth=20) at bytecode.c:423
No locals.
#4 0x0000000000601427 in eval_sub (form=9699782) at eval.c:2356
numargs = 12
args_left = 12726818
i = 3
maxargs = 3
argvals = {9699809, 9699861, 20, 140737488241376, 140737488241384, 1, 140737488241296, 5816836}
fun = 12108133
val = 12816597
original_fun = 12866754
original_args = 9699798
funcar = 5815511
backtrace = {next = 0x7ffffffe4a80, function = 0x7ffffffe4310, args = 0x7ffffffe4240, nargs = 3, debug_on_exit = 0}
gcpro1 = {next = 0x7ffffffe4310, var = 0x6021f4, nvars = 12864482}
gcpro2 = {next = 0xc23222, var = 0xc23222, nvars = 12726818}
gcpro3 = {next = 0x1, var = 0x7ffffffe4240, nvars = 3}
#5 0x00000000005ff063 in internal_catch (tag=13220914, func=0x600d8d <eval_sub>, arg=9699782) at eval.c:1272
c = {tag = 13220914, val = 12726818, next = 0x7ffffffe6a50, gcpro = 0x0, jmp = {{__jmpbuf = {140737488242928, 1568579509601815893, 140737488242928, 140737488243584, 0, 0, 1568579509629078869,
-1568579215016735403}, __mask_was_saved = 0, __saved_mask = {__val = {6302801, 140737488241872, 16, 12726818, 94489280514, 140737488241872, 2, 140737488243328, 140737488241872, 140737488241880,
1, 24566916, 12769218, 12726818, 13453714, 1}}}}, backlist = 0x7ffffffe4a80, handlerlist = 0x7ffffffe6a20, lisp_eval_depth = 10, pdlcount = 25, poll_suppress_count = 1,
interrupt_input_blocked = 0, byte_stack = 0x7ffffffe4540}
#6 0x000000000064eaaf in exec_byte_code (bytestr=9699617, vector=9699653, maxdepth=16, args_template=12726818, nargs=0, args=0x0) at bytecode.c:966
v1 = 9699782
count = 20
op = 141
vectorp = 0x940150
stack = {pc = 0xb6f1a2 "-\207", byte_string = 9699617, byte_string_start = 0xb6f185 "\306\b!\020\307\b!\031\310\b\311\"\032\310\b\303\"\033ʉ\034\035\313\t!\210\314͍-\207", constants = 9699653,
next = 0x7ffffffe59a0}
top = 0x7ffffffe44d0
result = 9465524
#7 0x0000000000603469 in funcall_lambda (fun=9699557, nargs=0, arg_vector=0x7ffffffe48f0) at eval.c:3233
val = 24566917
syms_left = 12726818
next = 12782626
lexenv = 12726818
count = 19
i = 0
optional = 1
rest = 0
#8 0x0000000000602f70 in apply_lambda (fun=9699557, args=12726818) at eval.c:3110
args_left = 12726818
i = 0
numargs = 0
arg_vector = 0x7ffffffe48f0
gcpro1 = {next = 0x7ffffffe49b0, var = 0x5fd4ea, nvars = 0}
gcpro2 = {next = 0xc40d72, var = 0xc23222, nvars = 12726818}
gcpro3 = {next = 0x7ffffffe49b0, var = 0xc23222, nvars = 9470012}
tem = 24566917
sa_count = 19
sa_must_free = 0
#9 0x00000000006015ec in eval_sub (form=22159046) at eval.c:2395
fun = 9699557
val = 24566917
original_fun = 13582674
original_args = 12726818
funcar = 4307814658
backtrace = {next = 0x7ffffffe4d50, function = 0x7ffffffe4ab0, args = 0x7ffffffe48f0, nargs = 0, debug_on_exit = 0}
gcpro1 = {next = 0xc23222, var = 0x7ffffffe4b80, nvars = 140737488243344}
gcpro2 = {next = 0x16f1e00, var = 0xbfbfd0, nvars = 1}
gcpro3 = {next = 0xbfbfd0, var = 0xc23252, nvars = 2}
#10 0x00000000005fd5bb in Fprogn (args=24433798) at eval.c:364
val = 24566917
gcpro1 = {next = 0x14bcf42, var = 0xc23222, nvars = 0}
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-19 10:41 ` martin rudalics
@ 2012-07-21 6:18 ` Chong Yidong
2012-07-21 11:03 ` martin rudalics
0 siblings, 1 reply; 22+ messages in thread
From: Chong Yidong @ 2012-07-21 6:18 UTC (permalink / raw)
To: martin rudalics; +Cc: Russell Sim, 11984
martin rudalics <rudalics@gmx.at> writes:
>> But for long-term safety, I think
>> decode_any_windows had better signal an error if the window's frame
>> isn't live. But I'm not sure if there's any subtle reliance in existing
>> code on allowing window functions to be called for windows on dead
>> frames---anyone know?
>
> Maybe the best way to find out is to install such a change?
Done in the trunk.
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-21 0:12 ` Russell Sim
@ 2012-07-21 6:31 ` Chong Yidong
2012-07-21 9:00 ` Russell Sim
2012-07-21 8:02 ` Eli Zaretskii
1 sibling, 1 reply; 22+ messages in thread
From: Chong Yidong @ 2012-07-21 6:31 UTC (permalink / raw)
To: Russell Sim; +Cc: 11984
Russell Sim <russell.sim@gmail.com> writes:
> Oh crap, I just realised that you didn't add you full patch in the
> commit. I have re-compiled and included the extra in
> window-absolute-pixel-edges and delete-other-windows-internal changes.
> Unfortunately I still get the error.
>
> I here is an updated core
> file. http://russellsim.org/emacs-24.3770cb4-patch.core
Hmm, I'm not sure the core file loaded properly for me. Can you trigger
the crash with Emacs running in gdb? Do you get the following strange
result from printing f->output_data?
(gdb) p f->output_data
$4 = {
tty = 0xc2,
x = 0xc2,
w32 = 0xc2,
ns = 0xc2,
nothing = 194
}
Also, please provide the step-by-step recipe that you are using to run
the tests? If I can try to reproduce the crash myself, debugging will
go faster.
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-21 0:12 ` Russell Sim
2012-07-21 6:31 ` Chong Yidong
@ 2012-07-21 8:02 ` Eli Zaretskii
2012-07-21 9:08 ` Russell Sim
1 sibling, 1 reply; 22+ messages in thread
From: Eli Zaretskii @ 2012-07-21 8:02 UTC (permalink / raw)
To: Russell Sim; +Cc: cyd, 11984
> From: Russell Sim <russell.sim@gmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>, 11984@debbugs.gnu.org
> Date: Sat, 21 Jul 2012 10:12:42 +1000
>
> Oh crap, I just realised that you didn't add you full patch in the
> commit. I have re-compiled and included the extra in
> window-absolute-pixel-edges and delete-other-windows-internal changes.
> Unfortunately I still get the error.
Please show the "extra" you included. In particular, please show
window.c around line 2653, plus/minus 20 lines.
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-21 6:31 ` Chong Yidong
@ 2012-07-21 9:00 ` Russell Sim
2012-07-21 9:32 ` Eli Zaretskii
0 siblings, 1 reply; 22+ messages in thread
From: Russell Sim @ 2012-07-21 9:00 UTC (permalink / raw)
To: Chong Yidong; +Cc: 11984
Chong Yidong <cyd@gnu.org> writes:
> Russell Sim <russell.sim@gmail.com> writes:
>
>> Oh crap, I just realised that you didn't add you full patch in the
>> commit. I have re-compiled and included the extra in
>> window-absolute-pixel-edges and delete-other-windows-internal changes.
>> Unfortunately I still get the error.
>>
>> I here is an updated core
>> file. http://russellsim.org/emacs-24.3770cb4-patch.core
>
> Hmm, I'm not sure the core file loaded properly for me. Can you trigger
> the crash with Emacs running in gdb? Do you get the following strange
> result from printing f->output_data?
>
> (gdb) p f->output_data
> $4 = {
> tty = 0xc2,
> x = 0xc2,
> w32 = 0xc2,
> ns = 0xc2,
> nothing = 194
> }
(gdb) p f->output_data
$1 = {tty = 0x0, x = 0x0, w32 = 0x0, ns = 0x0, nothing = 0}
Be aware that I am running in batch mode.
> Also, please provide the step-by-step recipe that you are using to run
> the tests? If I can try to reproduce the crash myself, debugging will
> go faster.
I wish I could offer some simple recipe, I'll see if I can narrow it
down to one test case, but because this is the test runner for the whole
python-mode you need a heap of 3rd party Python stuff to get far enough
along to cause the crash. If this is too painful, I can setup a VM with
the appropriate environment for you to access.
I'll be on IRC in the #emacs channel for a while and my handle is
arrsim, or jabber at my email address.
I have included the whole function that I am using, which is the
emacs-24 branch + your extra CHECK_LIVE_FRAME chuncks.
2548: DEFUN ("delete-other-windows-internal", Fdelete_other_windows_internal,
2549: Sdelete_other_windows_internal, 0, 2, "",
2550: doc: /* Make WINDOW fill its frame.
2551: Only the frame WINDOW is on is affected. WINDOW may be any window and
2552: defaults to the selected one.
2553:
2554: Optional argument ROOT, if non-nil, must specify an internal window such
2555: that WINDOW is in its window subtree. If this is the case, replace ROOT
2556: by WINDOW and leave alone any windows not part of ROOT's subtree.
2557:
2558: When WINDOW is live try to reduce display jumps by keeping the text
2559: previously visible in WINDOW in the same place on the frame. Doing this
2560: depends on the value of (window-start WINDOW), so if calling this
2561: function in a program gives strange scrolling, make sure the
2562: window-start value is reasonable when this function is called. */)
2563: (Lisp_Object window, Lisp_Object root)
2564: {
2565: struct window *w, *r, *s;
2566: struct frame *f;
2567: Lisp_Object sibling, pwindow, swindow IF_LINT (= Qnil), delta;
2568: EMACS_INT startpos IF_LINT (= 0);
2569: int top IF_LINT (= 0), new_top, resize_failed;
2570: Mouse_HLInfo *hlinfo;
2571:
2572: w = decode_any_window (window);
2573: CHECK_LIVE_FRAME (w->frame);
2574: XSETWINDOW (window, w);
2575: f = XFRAME (w->frame);
2576:
2577: if (NILP (root))
2578: /* ROOT is the frame's root window. */
2579: {
2580: root = FRAME_ROOT_WINDOW (f);
2581: r = XWINDOW (root);
2582: }
2583: else
2584: /* ROOT must be an ancestor of WINDOW. */
2585: {
2586: r = decode_any_window (root);
2587: CHECK_LIVE_FRAME (r->frame);
2588: pwindow = XWINDOW (window)->parent;
2589: while (!NILP (pwindow))
2590: if (EQ (pwindow, root))
2591: break;
2592: else
2593: pwindow = XWINDOW (pwindow)->parent;
2594: if (!EQ (pwindow, root))
2595: error ("Specified root is not an ancestor of specified window");
2596: }
2597:
2598: if (EQ (window, root))
2599: /* A noop. */
2600: return Qnil;
2601: /* I don't understand the "top > 0" part below. If we deal with a
2602: standalone minibuffer it would have been caught by the preceding
2603: test. */
2604: else if (MINI_WINDOW_P (w)) /* && top > 0) */
2605: error ("Can't expand minibuffer to full frame");
2606:
2607: if (!NILP (w->buffer))
2608: {
2609: startpos = marker_position (w->start);
2610: top = WINDOW_TOP_EDGE_LINE (w)
2611: - FRAME_TOP_MARGIN (XFRAME (WINDOW_FRAME (w)));
2612: /* Make sure WINDOW is the frame's selected window. */
2613: if (!EQ (window, FRAME_SELECTED_WINDOW (f)))
2614: {
2615: if (EQ (selected_frame, w->frame))
2616: Fselect_window (window, Qnil);
2617: else
2618: FRAME_SELECTED_WINDOW (f) = window;
2619: }
2620: }
2621: else
2622: {
2623: /* See if the frame's selected window is a part of the window
2624: subtree rooted at WINDOW, by finding all the selected window's
2625: parents and comparing each one with WINDOW. If it isn't we
2626: need a new selected window for this frame. */
2627: swindow = FRAME_SELECTED_WINDOW (f);
2628: while (1)
2629: {
2630: pwindow = swindow;
2631: while (!NILP (pwindow) && !EQ (window, pwindow))
2632: pwindow = XWINDOW (pwindow)->parent;
2633:
2634: if (EQ (window, pwindow))
2635: /* If WINDOW is an ancestor of SWINDOW, then SWINDOW is ok
2636: as the new selected window. */
2637: break;
2638: else
2639: /* Else try the previous window of SWINDOW. */
2640: swindow = Fprevious_window (swindow, Qlambda, Qnil);
2641: }
2642:
2643: if (!EQ (swindow, FRAME_SELECTED_WINDOW (f)))
2644: {
2645: if (EQ (selected_frame, w->frame))
2646: Fselect_window (swindow, Qnil);
2647: else
2648: FRAME_SELECTED_WINDOW (f) = swindow;
2649: }
2650: }
2651:
2652: BLOCK_INPUT;
2653: hlinfo = MOUSE_HL_INFO (f);
2654: /* We are going to free the glyph matrices of WINDOW, and with that
2655: we might lose any information about glyph rows that have some of
2656: their glyphs highlighted in mouse face. (These rows are marked
2657: with a non-zero mouse_face_p flag.) If WINDOW indeed has some
2658: glyphs highlighted in mouse face, signal to frame's up-to-date
2659: hook that mouse highlight was overwritten, so that it will
2660: arrange for redisplaying the highlight. */
2661: if (EQ (hlinfo->mouse_face_window, window))
2662: {
2663: hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1;
2664: hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1;
2665: hlinfo->mouse_face_window = Qnil;
2666: }
2667: free_window_matrices (r);
2668:
2669: windows_or_buffers_changed++;
2670: Vwindow_list = Qnil;
2671: FRAME_WINDOW_SIZES_CHANGED (f) = 1;
2672: resize_failed = 0;
2673:
2674: if (NILP (w->buffer))
2675: {
2676: /* Resize child windows vertically. */
2677: XSETINT (delta, XINT (r->total_lines) - XINT (w->total_lines));
2678: w->top_line = r->top_line;
2679: resize_root_window (window, delta, Qnil, Qnil);
2680: if (window_resize_check (w, 0))
2681: window_resize_apply (w, 0);
2682: else
2683: {
2684: resize_root_window (window, delta, Qnil, Qt);
2685: if (window_resize_check (w, 0))
2686: window_resize_apply (w, 0);
2687: else
2688: resize_failed = 1;
2689: }
2690:
2691: /* Resize child windows horizontally. */
2692: if (!resize_failed)
2693: {
2694: w->left_col = r->left_col;
2695: XSETINT (delta, XINT (r->total_cols) - XINT (w->total_cols));
2696: w->left_col = r->left_col;
2697: resize_root_window (window, delta, Qt, Qnil);
2698: if (window_resize_check (w, 1))
2699: window_resize_apply (w, 1);
2700: else
2701: {
2702: resize_root_window (window, delta, Qt, Qt);
2703: if (window_resize_check (w, 1))
2704: window_resize_apply (w, 1);
2705: else
2706: resize_failed = 1;
2707: }
2708: }
2709:
2710: if (resize_failed)
2711: /* Play safe, if we still can ... */
2712: {
2713: window = swindow;
2714: w = XWINDOW (window);
2715: }
2716: }
2717:
2718: /* Cleanly unlink WINDOW from window-tree. */
2719: if (!NILP (w->prev))
2720: /* Get SIBLING above (on the left of) WINDOW. */
2721: {
2722: sibling = w->prev;
2723: s = XWINDOW (sibling);
2724: s->next = w->next;
2725: if (!NILP (s->next))
2726: XWINDOW (s->next)->prev = sibling;
2727: }
2728: else
2729: /* Get SIBLING below (on the right of) WINDOW. */
2730: {
2731: sibling = w->next;
2732: s = XWINDOW (sibling);
2733: s->prev = Qnil;
2734: if (!NILP (XWINDOW (w->parent)->vchild))
2735: XWINDOW (w->parent)->vchild = sibling;
2736: else
2737: XWINDOW (w->parent)->hchild = sibling;
2738: }
2739:
2740: /* Delete ROOT and all child windows of ROOT. */
2741: if (!NILP (r->vchild))
2742: {
2743: delete_all_child_windows (r->vchild);
2744: r->vchild = Qnil;
2745: }
2746: else if (!NILP (r->hchild))
2747: {
2748: delete_all_child_windows (r->hchild);
2749: r->hchild = Qnil;
2750: }
2751:
2752: replace_window (root, window, 1);
2753:
2754: /* This must become SWINDOW anyway ....... */
2755: if (!NILP (w->buffer) && !resize_failed)
2756: {
2757: /* Try to minimize scrolling, by setting the window start to the
2758: point will cause the text at the old window start to be at the
2759: same place on the frame. But don't try to do this if the
2760: window start is outside the visible portion (as might happen
2761: when the display is not current, due to typeahead). */
2762: new_top = WINDOW_TOP_EDGE_LINE (w) - FRAME_TOP_MARGIN (XFRAME (WINDOW_FRAME (w)));
2763: if (new_top != top
2764: && startpos >= BUF_BEGV (XBUFFER (w->buffer))
2765: && startpos <= BUF_ZV (XBUFFER (w->buffer)))
2766: {
2767: struct position pos;
2768: struct buffer *obuf = current_buffer;
2769:
2770: Fset_buffer (w->buffer);
2771: /* This computation used to temporarily move point, but that
2772: can have unwanted side effects due to text properties. */
2773: pos = *vmotion (startpos, -top, w);
2774:
2775: set_marker_both (w->start, w->buffer, pos.bufpos, pos.bytepos);
2776: w->window_end_valid = Qnil;
2777: w->start_at_line_beg = ((pos.bytepos == BEGV_BYTE
2778: || FETCH_BYTE (pos.bytepos - 1) == '\n') ? Qt
2779: : Qnil);
2780: /* We need to do this, so that the window-scroll-functions
2781: get called. */
2782: w->optional_new_start = Qt;
2783:
2784: set_buffer_internal (obuf);
2785: }
2786: }
2787:
2788: adjust_glyphs (f);
2789: UNBLOCK_INPUT;
2790:
2791: run_window_configuration_change_hook (f);
2792:
2793: return Qnil;
2794: }
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-21 8:02 ` Eli Zaretskii
@ 2012-07-21 9:08 ` Russell Sim
0 siblings, 0 replies; 22+ messages in thread
From: Russell Sim @ 2012-07-21 9:08 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: cyd, 11984
Eli Zaretskii <eliz@gnu.org> writes:
>> From: Russell Sim <russell.sim@gmail.com>
>> Cc: Eli Zaretskii <eliz@gnu.org>, 11984@debbugs.gnu.org
>> Date: Sat, 21 Jul 2012 10:12:42 +1000
>>
>> Oh crap, I just realised that you didn't add you full patch in the
>> commit. I have re-compiled and included the extra in
>> window-absolute-pixel-edges and delete-other-windows-internal changes.
>> Unfortunately I still get the error.
>
> Please show the "extra" you included. In particular, please show
> window.c around line 2653, plus/minus 20 lines.
I have push the code I am running here.
https://github.com/russell/emacs/tree/bug-11984
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-21 9:00 ` Russell Sim
@ 2012-07-21 9:32 ` Eli Zaretskii
2012-07-21 9:45 ` Russell Sim
0 siblings, 1 reply; 22+ messages in thread
From: Eli Zaretskii @ 2012-07-21 9:32 UTC (permalink / raw)
To: Russell Sim; +Cc: cyd, 11984
> From: Russell Sim <russell.sim@gmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>, 11984@debbugs.gnu.org
> Date: Sat, 21 Jul 2012 19:00:36 +1000
>
> > Hmm, I'm not sure the core file loaded properly for me. Can you trigger
> > the crash with Emacs running in gdb? Do you get the following strange
> > result from printing f->output_data?
> >
> > (gdb) p f->output_data
> > $4 = {
> > tty = 0xc2,
> > x = 0xc2,
> > w32 = 0xc2,
> > ns = 0xc2,
> > nothing = 194
> > }
>
> (gdb) p f->output_data
> $1 = {tty = 0x0, x = 0x0, w32 = 0x0, ns = 0x0, nothing = 0}
This is a FRAME_INITIAL_P frame.
> 2652: BLOCK_INPUT;
> 2653: hlinfo = MOUSE_HL_INFO (f);
> 2654: /* We are going to free the glyph matrices of WINDOW, and with that
> 2655: we might lose any information about glyph rows that have some of
> 2656: their glyphs highlighted in mouse face. (These rows are marked
> 2657: with a non-zero mouse_face_p flag.) If WINDOW indeed has some
> 2658: glyphs highlighted in mouse face, signal to frame's up-to-date
> 2659: hook that mouse highlight was overwritten, so that it will
> 2660: arrange for redisplaying the highlight. */
> 2661: if (EQ (hlinfo->mouse_face_window, window))
> 2662: {
> 2663: hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1;
> 2664: hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1;
> 2665: hlinfo->mouse_face_window = Qnil;
> 2666: }
That's it your problem: you didn't include the changes below, which
make sure mouse-highlight info is never accessed for 'initial' frame
types. The changes below were only done on the trunk, they aren't in
the emacs-24 branch.
--- src/window.c 2012-06-01 03:41:03 +0000
+++ src/window.c 2012-06-16 07:18:44 +0000
@@ -2566,7 +2566,6 @@ window-start value is reasonable when th
Lisp_Object sibling, pwindow, swindow IF_LINT (= Qnil), delta;
ptrdiff_t startpos IF_LINT (= 0);
int top IF_LINT (= 0), new_top, resize_failed;
- Mouse_HLInfo *hlinfo;
w = decode_any_window (window);
XSETWINDOW (window, w);
@@ -2647,19 +2646,23 @@ window-start value is reasonable when th
}
BLOCK_INPUT;
- hlinfo = MOUSE_HL_INFO (f);
- /* We are going to free the glyph matrices of WINDOW, and with that
- we might lose any information about glyph rows that have some of
- their glyphs highlighted in mouse face. (These rows are marked
- with a non-zero mouse_face_p flag.) If WINDOW indeed has some
- glyphs highlighted in mouse face, signal to frame's up-to-date
- hook that mouse highlight was overwritten, so that it will
- arrange for redisplaying the highlight. */
- if (EQ (hlinfo->mouse_face_window, window))
- {
- hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1;
- hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1;
- hlinfo->mouse_face_window = Qnil;
+ if (!FRAME_INITIAL_P (f))
+ {
+ Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
+
+ /* We are going to free the glyph matrices of WINDOW, and with
+ that we might lose any information about glyph rows that have
+ some of their glyphs highlighted in mouse face. (These rows
+ are marked with a non-zero mouse_face_p flag.) If WINDOW
+ indeed has some glyphs highlighted in mouse face, signal to
+ frame's up-to-date hook that mouse highlight was overwritten,
+ so that it will arrange for redisplaying the highlight. */
+ if (EQ (hlinfo->mouse_face_window, window))
+ {
+ hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1;
+ hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1;
+ hlinfo->mouse_face_window = Qnil;
+ }
}
free_window_matrices (r);
@@ -3903,7 +3906,6 @@ Signal an error when WINDOW is the only
&& EQ (r->new_total, (horflag ? r->total_cols : r->total_lines)))
/* We can delete WINDOW now. */
{
- Mouse_HLInfo *hlinfo;
/* Block input. */
BLOCK_INPUT;
@@ -3911,9 +3913,13 @@ Signal an error when WINDOW is the only
/* If this window is referred to by the dpyinfo's mouse
highlight, invalidate that slot to be safe (Bug#9904). */
- hlinfo = MOUSE_HL_INFO (XFRAME (w->frame));
- if (EQ (hlinfo->mouse_face_window, window))
- hlinfo->mouse_face_window = Qnil;
+ if (!FRAME_INITIAL_P (f))
+ {
+ Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f);
+
+ if (EQ (hlinfo->mouse_face_window, window))
+ hlinfo->mouse_face_window = Qnil;
+ }
windows_or_buffers_changed++;
Vwindow_list = Qnil;
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-21 9:32 ` Eli Zaretskii
@ 2012-07-21 9:45 ` Russell Sim
2012-07-21 12:04 ` Eli Zaretskii
0 siblings, 1 reply; 22+ messages in thread
From: Russell Sim @ 2012-07-21 9:45 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: cyd, 11984
Eli Zaretskii <eliz@gnu.org> writes:
> That's it your problem: you didn't include the changes below, which
> make sure mouse-highlight info is never accessed for 'initial' frame
> types. The changes below were only done on the trunk, they aren't in
> the emacs-24 branch.
Worked like a charm. :)
Thanks,
Russell
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-21 6:18 ` Chong Yidong
@ 2012-07-21 11:03 ` martin rudalics
2012-07-24 12:46 ` martin rudalics
0 siblings, 1 reply; 22+ messages in thread
From: martin rudalics @ 2012-07-21 11:03 UTC (permalink / raw)
To: Chong Yidong; +Cc: Russell Sim, 11984
>>> But for long-term safety, I think
>>> decode_any_windows had better signal an error if the window's frame
>>> isn't live. But I'm not sure if there's any subtle reliance in existing
>>> code on allowing window functions to be called for windows on dead
>>> frames---anyone know?
>> Maybe the best way to find out is to install such a change?
>
> Done in the trunk.
I must admit that I never looked at the definition of decode_any_window.
I always assumed that it _does_ check whether the window either has a
buffer or is in a window tree. So I think behavior is still broken
because a window can have been deleted while its frame is still alive.
IMHO the right fix is to throw an error for
if (NILP (w->buffer) && NILP (w->hchild) && NILP (w->vchild))
which means that some functions when called on dead windows (like
`delete-window') will now throw an error. These will have to be caught
on the Elisp level.
martin
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-21 9:45 ` Russell Sim
@ 2012-07-21 12:04 ` Eli Zaretskii
0 siblings, 0 replies; 22+ messages in thread
From: Eli Zaretskii @ 2012-07-21 12:04 UTC (permalink / raw)
To: Russell Sim; +Cc: cyd, 11984-done
> From: Russell Sim <russell.sim@gmail.com>
> Cc: cyd@gnu.org, 11984@debbugs.gnu.org
> Date: Sat, 21 Jul 2012 19:45:08 +1000
>
> Eli Zaretskii <eliz@gnu.org> writes:
>
> > That's it your problem: you didn't include the changes below, which
> > make sure mouse-highlight info is never accessed for 'initial' frame
> > types. The changes below were only done on the trunk, they aren't in
> > the emacs-24 branch.
>
> Worked like a charm. :)
Thanks, I'm closing this bug, then.
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-21 11:03 ` martin rudalics
@ 2012-07-24 12:46 ` martin rudalics
2012-07-24 16:36 ` Eli Zaretskii
0 siblings, 1 reply; 22+ messages in thread
From: martin rudalics @ 2012-07-24 12:46 UTC (permalink / raw)
To: Chong Yidong; +Cc: Russell Sim, 11984
[-- Attachment #1: Type: text/plain, Size: 526 bytes --]
> IMHO the right fix is to throw an error for
>
> if (NILP (w->buffer) && NILP (w->hchild) && NILP (w->vchild))
>
> which means that some functions when called on dead windows (like
> `delete-window') will now throw an error. These will have to be caught
> on the Elisp level.
I think `delete-window-internal' can keep its decode_any_window. I'm
not sure about `window-buffer'. For the remainder, the attached patch
should be applied IMO. Eli can you check whether this interferes with
tooltip creation?
martin
[-- Attachment #2: window.diff --]
[-- Type: text/plain, Size: 9981 bytes --]
=== modified file 'src/lisp.h'
--- src/lisp.h 2012-07-24 06:45:44 +0000
+++ src/lisp.h 2012-07-24 08:32:47 +0000
@@ -1732,6 +1732,13 @@
#define CHECK_LIVE_WINDOW(x) \
CHECK_TYPE (WINDOWP (x) && !NILP (XWINDOW (x)->buffer), Qwindow_live_p, x)
+#define CHECK_VALID_WINDOW(x) \
+ CHECK_TYPE (WINDOWP (x) \
+ && (!NILP (XWINDOW (x)->buffer) \
+ || !NILP (XWINDOW (x)->vchild) \
+ || !NILP (XWINDOW (x)->hchild)), \
+ Qwindow_valid_p, x)
+
#define CHECK_PROCESS(x) \
CHECK_TYPE (PROCESSP (x), Qprocessp, x)
=== modified file 'src/window.c'
--- src/window.c 2012-07-23 16:57:20 +0000
+++ src/window.c 2012-07-24 10:33:45 +0000
@@ -51,7 +51,7 @@
#include "nsterm.h"
#endif
-Lisp_Object Qwindowp, Qwindow_live_p;
+Lisp_Object Qwindowp, Qwindow_live_p, Qwindow_valid_p;
static Lisp_Object Qwindow_configuration_p, Qrecord_window_buffer;
static Lisp_Object Qwindow_deletable_p, Qdelete_window, Qdisplay_buffer;
static Lisp_Object Qreplace_buffer_in_windows, Qget_mru_window;
@@ -156,6 +156,19 @@
return w;
}
+static struct window *
+decode_valid_window (register Lisp_Object window)
+{
+ struct window *w;
+
+ if (NILP (window))
+ return XWINDOW (selected_window);
+
+ CHECK_VALID_WINDOW (window);
+ w = XWINDOW (window);
+ return w;
+}
+
DEFUN ("windowp", Fwindowp, Swindowp, 1, 1, 0,
doc: /* Return t if OBJECT is a window and nil otherwise. */)
(Lisp_Object object)
@@ -178,7 +191,7 @@
If WINDOW is omitted or nil, it defaults to the selected window. */)
(Lisp_Object window)
{
- return decode_any_window (window)->frame;
+ return decode_valid_window (window)->frame;
}
DEFUN ("frame-root-window", Fframe_root_window, Sframe_root_window, 0, 1, 0,
@@ -193,7 +206,10 @@
if (NILP (frame_or_window))
window = SELECTED_FRAME ()->root_window;
else if (WINDOWP (frame_or_window))
- window = XFRAME (WINDOW_FRAME (XWINDOW (frame_or_window)))->root_window;
+ {
+ CHECK_VALID_WINDOW (frame_or_window);
+ window = XFRAME (XWINDOW (frame_or_window)->frame)->root_window;
+ }
else
{
CHECK_LIVE_FRAME (frame_or_window);
@@ -220,7 +236,7 @@
If WINDOW is omitted or nil, it defaults to the selected window. */)
(Lisp_Object window)
{
- return MINI_WINDOW_P (decode_any_window (window)) ? Qt : Qnil;
+ return MINI_WINDOW_P (decode_valid_window (window)) ? Qt : Qnil;
}
/* Don't move this to window.el - this must be a safe routine. */
@@ -427,7 +443,7 @@
Return nil for a window with no parent (e.g. a root window). */)
(Lisp_Object window)
{
- return decode_any_window (window)->parent;
+ return decode_valid_window (window)->parent;
}
DEFUN ("window-top-child", Fwindow_top_child, Swindow_top_child, 1, 1, 0,
@@ -438,7 +454,7 @@
(Lisp_Object window)
{
CHECK_WINDOW (window);
- return decode_any_window (window)->vchild;
+ return decode_valid_window (window)->vchild;
}
DEFUN ("window-left-child", Fwindow_left_child, Swindow_left_child, 1, 1, 0,
@@ -449,7 +465,7 @@
(Lisp_Object window)
{
CHECK_WINDOW (window);
- return decode_any_window (window)->hchild;
+ return decode_valid_window (window)->hchild;
}
DEFUN ("window-next-sibling", Fwindow_next_sibling, Swindow_next_sibling, 0, 1, 0,
@@ -458,7 +474,7 @@
Return nil if WINDOW has no next sibling. */)
(Lisp_Object window)
{
- return decode_any_window (window)->next;
+ return decode_valid_window (window)->next;
}
DEFUN ("window-prev-sibling", Fwindow_prev_sibling, Swindow_prev_sibling, 0, 1, 0,
@@ -467,7 +483,7 @@
Return nil if WINDOW has no previous sibling. */)
(Lisp_Object window)
{
- return decode_any_window (window)->prev;
+ return decode_valid_window (window)->prev;
}
DEFUN ("window-combination-limit", Fwindow_combination_limit, Swindow_combination_limit, 1, 1, 0,
@@ -477,7 +493,7 @@
WINDOW are never \(re-)combined with WINDOW's siblings. */)
(Lisp_Object window)
{
- return decode_any_window (window)->combination_limit;
+ return decode_valid_window (window)->combination_limit;
}
DEFUN ("set-window-combination-limit", Fset_window_combination_limit, Sset_window_combination_limit, 2, 2, 0,
@@ -488,7 +504,7 @@
for future use. */)
(Lisp_Object window, Lisp_Object limit)
{
- register struct window *w = decode_any_window (window);
+ register struct window *w = decode_valid_window (window);
w->combination_limit = limit;
return w->combination_limit;
}
@@ -516,7 +532,7 @@
integer multiple of the default character height. */)
(Lisp_Object window)
{
- return decode_any_window (window)->total_lines;
+ return decode_valid_window (window)->total_lines;
}
DEFUN ("window-total-width", Fwindow_total_width, Swindow_total_width, 0, 1, 0,
@@ -531,7 +547,7 @@
integer multiple of the default character width. */)
(Lisp_Object window)
{
- return decode_any_window (window)->total_cols;
+ return decode_valid_window (window)->total_cols;
}
DEFUN ("window-new-total", Fwindow_new_total, Swindow_new_total, 0, 1, 0,
@@ -539,7 +555,7 @@
If WINDOW is omitted or nil, it defaults to the selected window. */)
(Lisp_Object window)
{
- return decode_any_window (window)->new_total;
+ return decode_valid_window (window)->new_total;
}
DEFUN ("window-normal-size", Fwindow_normal_size, Swindow_normal_size, 0, 2, 0,
@@ -549,9 +565,9 @@
(Lisp_Object window, Lisp_Object horizontal)
{
if (NILP (horizontal))
- return decode_any_window (window)->normal_lines;
+ return decode_valid_window (window)->normal_lines;
else
- return decode_any_window (window)->normal_cols;
+ return decode_valid_window (window)->normal_cols;
}
DEFUN ("window-new-normal", Fwindow_new_normal, Swindow_new_normal, 0, 1, 0,
@@ -559,7 +575,7 @@
If WINDOW is omitted or nil, it defaults to the selected window. */)
(Lisp_Object window)
{
- return decode_any_window (window)->new_normal;
+ return decode_valid_window (window)->new_normal;
}
DEFUN ("window-left-column", Fwindow_left_column, Swindow_left_column, 0, 1, 0,
@@ -571,7 +587,7 @@
If WINDOW is omitted or nil, it defaults to the selected window. */)
(Lisp_Object window)
{
- return decode_any_window (window)->left_col;
+ return decode_valid_window (window)->left_col;
}
DEFUN ("window-top-line", Fwindow_top_line, Swindow_top_line, 0, 1, 0,
@@ -583,7 +599,7 @@
If WINDOW is omitted or nil, it defaults to the selected window. */)
(Lisp_Object window)
{
- return decode_any_window (window)->top_line;
+ return decode_valid_window (window)->top_line;
}
/* Return the number of lines of W's body. Don't count any mode or
@@ -751,7 +767,7 @@
just the text area, use `window-inside-edges'. */)
(Lisp_Object window)
{
- register struct window *w = decode_any_window (window);
+ register struct window *w = decode_valid_window (window);
return Fcons (make_number (WINDOW_LEFT_EDGE_COL (w)),
Fcons (make_number (WINDOW_TOP_EDGE_LINE (w)),
@@ -772,7 +788,7 @@
of just the text area, use `window-inside-pixel-edges'. */)
(Lisp_Object window)
{
- register struct window *w = decode_any_window (window);
+ register struct window *w = decode_valid_window (window);
return Fcons (make_number (WINDOW_LEFT_EDGE_X (w)),
Fcons (make_number (WINDOW_TOP_EDGE_Y (w)),
@@ -816,7 +832,7 @@
of just the text area, use `window-inside-absolute-pixel-edges'. */)
(Lisp_Object window)
{
- register struct window *w = decode_any_window (window);
+ register struct window *w = decode_valid_window (window);
int add_x, add_y;
calc_absolute_offset (w, &add_x, &add_y);
@@ -1700,7 +1716,7 @@
elements of the form (PARAMETER . VALUE). */)
(Lisp_Object window)
{
- return Fcopy_alist (decode_any_window (window)->window_parameters);
+ return Fcopy_alist (decode_valid_window (window)->window_parameters);
}
DEFUN ("window-parameter", Fwindow_parameter, Swindow_parameter,
@@ -1711,7 +1727,7 @@
{
Lisp_Object result;
- result = Fassq (parameter, decode_any_window (window)->window_parameters);
+ result = Fassq (parameter, decode_valid_window (window)->window_parameters);
return CDR_SAFE (result);
}
@@ -1721,7 +1737,7 @@
WINDOW defaults to the selected window. Return VALUE. */)
(Lisp_Object window, Lisp_Object parameter, Lisp_Object value)
{
- register struct window *w = decode_any_window (window);
+ register struct window *w = decode_valid_window (window);
Lisp_Object old_alist_elt;
old_alist_elt = Fassq (parameter, w->window_parameters);
@@ -2585,7 +2601,7 @@
ptrdiff_t startpos IF_LINT (= 0);
int top IF_LINT (= 0), new_top, resize_failed;
- w = decode_any_window (window);
+ w = decode_valid_window (window);
XSETWINDOW (window, w);
f = XFRAME (w->frame);
@@ -2598,7 +2614,7 @@
else
/* ROOT must be an ancestor of WINDOW. */
{
- r = decode_any_window (root);
+ r = decode_valid_window (root);
pwindow = XWINDOW (window)->parent;
while (!NILP (pwindow))
if (EQ (pwindow, root))
@@ -3325,7 +3341,7 @@
Note: This function does not operate on any child windows of WINDOW. */)
(Lisp_Object window, Lisp_Object size, Lisp_Object add)
{
- struct window *w = decode_any_window (window);
+ struct window *w = decode_valid_window (window);
CHECK_NUMBER (size);
if (NILP (add))
@@ -3343,7 +3359,7 @@
Note: This function does not operate on any child windows of WINDOW. */)
(Lisp_Object window, Lisp_Object size)
{
- struct window *w = decode_any_window (window);
+ struct window *w = decode_valid_window (window);
w->new_normal = size;
return w->new_normal;
@@ -6491,6 +6507,7 @@
DEFSYM (Qwindowp, "windowp");
DEFSYM (Qwindow_configuration_p, "window-configuration-p");
DEFSYM (Qwindow_live_p, "window-live-p");
+ DEFSYM (Qwindow_valid_p, "window-valid-p");
DEFSYM (Qwindow_deletable_p, "window-deletable-p");
DEFSYM (Qdelete_window, "delete-window");
DEFSYM (Qwindow_resize_root_window, "window--resize-root-window");
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-24 12:46 ` martin rudalics
@ 2012-07-24 16:36 ` Eli Zaretskii
2012-07-25 7:15 ` martin rudalics
0 siblings, 1 reply; 22+ messages in thread
From: Eli Zaretskii @ 2012-07-24 16:36 UTC (permalink / raw)
To: martin rudalics; +Cc: cyd, 11984, russell.sim
> Date: Tue, 24 Jul 2012 14:46:46 +0200
> From: martin rudalics <rudalics@gmx.at>
> CC: Russell Sim <russell.sim@gmail.com>, 11984@debbugs.gnu.org,
> "eliz@gnu.org" <eliz@gnu.org>
>
> I think `delete-window-internal' can keep its decode_any_window. I'm
> not sure about `window-buffer'. For the remainder, the attached patch
> should be applied IMO. Eli can you check whether this interferes with
> tooltip creation?
If you built Emacs with the change, and tooltips work for you, then I
see no reason why they won't for me.
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-24 16:36 ` Eli Zaretskii
@ 2012-07-25 7:15 ` martin rudalics
2012-07-25 15:27 ` Eli Zaretskii
0 siblings, 1 reply; 22+ messages in thread
From: martin rudalics @ 2012-07-25 7:15 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: cyd, 11984, russell.sim
> If you built Emacs with the change, and tooltips work for you,
How do I test it? Is evaluating
(x-show-tip "???")
enough?
> then I
> see no reason why they won't for me.
Because tooltip frames appear fragile. x_create_tip_frame uses
Fset_window_buffer (FRAME_ROOT_WINDOW (f), buffer, Qnil);
while make_frame has
/* Use set_window_buffer, not Fset_window_buffer, and don't let
hooks be run by it. The reason is that the whole frame/window
arrangement is not yet fully initialized at this point. Windows
don't have the right size, glyph matrices aren't initialized
etc. Running Lisp functions at this point surely ends in a
SEGV. */
set_window_buffer (root_window, buf, 0, 0);
Wouldn't the fact that the frame has not been set up completely when
assigning a buffer to its root window suggest that Fset_window_buffer
should not be used here either?
martin
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-25 7:15 ` martin rudalics
@ 2012-07-25 15:27 ` Eli Zaretskii
2012-07-26 9:43 ` martin rudalics
2012-08-14 9:09 ` martin rudalics
0 siblings, 2 replies; 22+ messages in thread
From: Eli Zaretskii @ 2012-07-25 15:27 UTC (permalink / raw)
To: martin rudalics; +Cc: cyd, 11984, russell.sim
> Date: Wed, 25 Jul 2012 09:15:03 +0200
> From: martin rudalics <rudalics@gmx.at>
> CC: cyd@gnu.org, russell.sim@gmail.com, 11984@debbugs.gnu.org
>
> > If you built Emacs with the change, and tooltips work for you,
>
> How do I test it? Is evaluating
>
> (x-show-tip "???")
>
> enough?
Probably, but I find it easier to move the mouse pointer over some of
the mouse-sensitive areas of the display (tool bar, menu items, mode
line), each time waiting for the tooltip to pop up and then pop down
after a few seconds.
> Because tooltip frames appear fragile. x_create_tip_frame uses
>
> Fset_window_buffer (FRAME_ROOT_WINDOW (f), buffer, Qnil);
>
> while make_frame has
>
> /* Use set_window_buffer, not Fset_window_buffer, and don't let
> hooks be run by it. The reason is that the whole frame/window
> arrangement is not yet fully initialized at this point. Windows
> don't have the right size, glyph matrices aren't initialized
> etc. Running Lisp functions at this point surely ends in a
> SEGV. */
> set_window_buffer (root_window, buf, 0, 0);
>
> Wouldn't the fact that the frame has not been set up completely when
> assigning a buffer to its root window suggest that Fset_window_buffer
> should not be used here either?
I know almost nothing about these intimate details. Exactly what is
it that makes running the hooks safe, and when does it happen during
frame creation, is not documented anywhere, AFAICS.
So feel free to replace the call to Fset_window_buffer with
set_window_buffer, if you think that's more appropriate.
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-25 15:27 ` Eli Zaretskii
@ 2012-07-26 9:43 ` martin rudalics
2012-07-26 13:58 ` martin rudalics
2012-08-14 9:09 ` martin rudalics
1 sibling, 1 reply; 22+ messages in thread
From: martin rudalics @ 2012-07-26 9:43 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: cyd, 11984, russell.sim
> Probably, but I find it easier to move the mouse pointer over some of
> the mouse-sensitive areas of the display (tool bar, menu items, mode
> line), each time waiting for the tooltip to pop up and then pop down
> after a few seconds.
OK. I asked because in your report you didn't give a detailed scenario
for how to reproduce the crash.
> So feel free to replace the call to Fset_window_buffer with
> set_window_buffer, if you think that's more appropriate.
I intend to replace all instances wherever I find them in C code. Since
set_window_buffer does run_window_configuration_change_hook anyway and
IIUC we don't forbid that, the change won't fix much of the dilemma that
we run Lisp code on unfinished frames. But Fset_window_buffer's extra
work is only wasted for minibuffers.
martin
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-26 9:43 ` martin rudalics
@ 2012-07-26 13:58 ` martin rudalics
0 siblings, 0 replies; 22+ messages in thread
From: martin rudalics @ 2012-07-26 13:58 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: cyd, 11984, russell.sim
> I intend to replace all instances wherever I find them in C code. Since
> set_window_buffer does run_window_configuration_change_hook anyway and
> IIUC we don't forbid that,
At least this remark is incorrect. All Fset_window_buffer calls I found
forbid to run hooks.
> the change won't fix much of the dilemma that
> we run Lisp code on unfinished frames.
martin
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#11984: 24.1; segfault while deleting a window
2012-07-25 15:27 ` Eli Zaretskii
2012-07-26 9:43 ` martin rudalics
@ 2012-08-14 9:09 ` martin rudalics
1 sibling, 0 replies; 22+ messages in thread
From: martin rudalics @ 2012-08-14 9:09 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: cyd, 11984, russell.sim
> So feel free to replace the call to Fset_window_buffer with
> set_window_buffer, if you think that's more appropriate.
I've done that now. Let's look at the consequences.
martin
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2012-08-14 9:09 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-18 22:08 bug#11984: 24.1; segfault while deleting a window Russell Sim
2012-07-19 3:05 ` Eli Zaretskii
2012-07-19 3:39 ` Chong Yidong
2012-07-19 10:41 ` martin rudalics
2012-07-21 6:18 ` Chong Yidong
2012-07-21 11:03 ` martin rudalics
2012-07-24 12:46 ` martin rudalics
2012-07-24 16:36 ` Eli Zaretskii
2012-07-25 7:15 ` martin rudalics
2012-07-25 15:27 ` Eli Zaretskii
2012-07-26 9:43 ` martin rudalics
2012-07-26 13:58 ` martin rudalics
2012-08-14 9:09 ` martin rudalics
2012-07-20 23:44 ` Russell Sim
2012-07-21 0:12 ` Russell Sim
2012-07-21 6:31 ` Chong Yidong
2012-07-21 9:00 ` Russell Sim
2012-07-21 9:32 ` Eli Zaretskii
2012-07-21 9:45 ` Russell Sim
2012-07-21 12:04 ` Eli Zaretskii
2012-07-21 8:02 ` Eli Zaretskii
2012-07-21 9:08 ` Russell Sim
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).