digitalmars.D.dwt - Pasting illegal character causes segmentation fault
- Mitja (3/3) Dec 25 2009 When I paste illegal character (looks like rectangle) in Text widget,
- Frank Benoit (3/7) Dec 25 2009 Can you give a stack trace, the exact character you pasted and perhaps a
- Mitja (44/52) Dec 25 2009 strace output:
- Frank Benoit (9/57) Dec 25 2009 Oh, i did not mean strace (which is a trace of the OS calls a process
- Mitja (76/141) Dec 25 2009 gdb backtrace:
- Frank Benoit (3/3) Dec 26 2009 sorry, i thought i can take the time.
When I paste illegal character (looks like rectangle) in Text widget, application exits with segmentation fault. I cannot catch bad character with Verify Listener, because it's already too late. Is there any other way to detect it? Platform is Debian 5.0.3 (lenny), DMD v1.033.
Dec 25 2009
Am 25.12.2009 13:22, schrieb Mitja:When I paste illegal character (looks like rectangle) in Text widget, application exits with segmentation fault. I cannot catch bad character with Verify Listener, because it's already too late. Is there any other way to detect it? Platform is Debian 5.0.3 (lenny), DMD v1.033.Can you give a stack trace, the exact character you pasted and perhaps a compilable small example code to reproduce the bug?
Dec 25 2009
strace output:
select(4, [3], [3], NULL, NULL) = 1 (out [3])
writev(3, [{"\24\0\6\0005\2 \5\343\2\0\0\0\0\0\0\0\0\0\0\377\377\377\37"...,
24}], 1) = 24
select(4, [3], [], NULL, NULL) = 1 (in [3])
read(3, "\1\10S6\4\0\0\0006\1\0\0\0\0\0\0\17\0\0\0VJ\25\10\374\325
\10tc\346\277\203"..., 4096) = 48
read(3, 0x840a2fc, 4096) = -1 EAGAIN (Resource temporarily
unavailable)
select(4, [3], [3], NULL, NULL) = 1 (out [3])
writev(3, [{"+\0\1\0"..., 4}], 1) = 4
select(4, [3], [], NULL, NULL) = 1 (in [3])
\10tc\346\277x+\177\td\"\36\10Y3\t\10"..., 4096) = 32
read(3, 0x840a2fc, 4096) = -1 EAGAIN (Resource temporarily
unavailable)
select(4, [3], [3], NULL, NULL) = 1 (out [3])
writev(3, [{"\23\0\3\0005\2 \5\343\2\0\0+\0\1\0"..., 16}], 1) = 16
select(4, [3], [], NULL, NULL) = 1 (in [3])
read(3, "\34\"U65\2 \5\343\2\0\0\0\252Fc\1\2\0\0\4\0\0\0\1\0\0\0 B\233\t\1"...,
4096) = 64
read(3, 0x840a2fc, 4096) = -1 EAGAIN (Resource temporarily
unavailable)
--- SIGSEGV (Segmentation fault) 0 (0) ---
+++ killed by SIGSEGV +++
Example code:
module text;
import dwt.DWT;
import dwt.custom.StyleRange;
import dwt.widgets.Text;
import dwt.layout.FillLayout;
import dwt.widgets.Display;
import dwt.widgets.Shell;
void main() {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Text text = new Text(shell, DWT.BORDER);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
I cannot reproduce the character.
The way I got it was by pasting block of Japanese or Chinese characters into
text widget and then selecting by mouse and copying a few characters from that
block.
Illegal character(s) would as a result of copying appear in Klipper (KDE
clipboard), usually in front or at the end of copied selection.
Segmentation fault would occur when I pasted back the very same selection, now
with prepended or appended illegal characters.
Frank Benoit Wrote:
Am 25.12.2009 13:22, schrieb Mitja:
When I paste illegal character (looks like rectangle) in Text widget,
application exits with segmentation fault. I cannot catch bad character with
Verify Listener, because it's already too late. Is there any other way to
detect it?
Platform is Debian 5.0.3 (lenny), DMD v1.033.
Can you give a stack trace, the exact character you pasted and perhaps a
compilable small example code to reproduce the bug?
Dec 25 2009
Am 25.12.2009 23:26, schrieb Mitja:strace output: select(4, [3], [3], NULL, NULL) = 1 (out [3]) writev(3, [{"\24\0\6\0005\2 \5\343\2\0\0\0\0\0\0\0\0\0\0\377\377\377\37"..., 24}], 1) = 24 select(4, [3], [], NULL, NULL) = 1 (in [3]) read(3, "\1\10S6\4\0\0\0006\1\0\0\0\0\0\0\17\0\0\0VJ\25\10\374\325 \10tc\346\277\203"..., 4096) = 48 read(3, 0x840a2fc, 4096) = -1 EAGAIN (Resource temporarily unavailable) select(4, [3], [3], NULL, NULL) = 1 (out [3]) writev(3, [{"+\0\1\0"..., 4}], 1) = 4 select(4, [3], [], NULL, NULL) = 1 (in [3]) \10tc\346\277x+\177\td\"\36\10Y3\t\10"..., 4096) = 32 read(3, 0x840a2fc, 4096) = -1 EAGAIN (Resource temporarily unavailable) select(4, [3], [3], NULL, NULL) = 1 (out [3]) writev(3, [{"\23\0\3\0005\2 \5\343\2\0\0+\0\1\0"..., 16}], 1) = 16 select(4, [3], [], NULL, NULL) = 1 (in [3]) read(3, "\34\"U65\2 \5\343\2\0\0\0\252Fc\1\2\0\0\4\0\0\0\1\ \0\0 B\233\t\1"..., 4096) = 64 read(3, 0x840a2fc, 4096) = -1 EAGAIN (Resource temporarily unavailable) --- SIGSEGV (Segmentation fault) 0 (0) --- +++ killed by SIGSEGV +++Oh, i did not mean strace (which is a trace of the OS calls a process does), instead i mean stack trace. You can perhaps get it with the current tango (i think) or by running the program in GDC and after the segfault run the "backtrace" command in it. It show the code line where the segfault happens and the code lines where this one was called from.Example code: module text; import dwt.DWT; import dwt.custom.StyleRange; import dwt.widgets.Text; import dwt.layout.FillLayout; import dwt.widgets.Display; import dwt.widgets.Shell; void main() { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Text text = new Text(shell, DWT.BORDER); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }thanks.I cannot reproduce the character. The way I got it was by pasting block of Japanese or Chinese characters into text widget and then selecting by mouse and copying a few characters from that block. Illegal character(s) would as a result of copying appear in Klipper (KDE clipboard), usually in front or at the end of copied selection. Segmentation fault would occur when I pasted back the very same selection, now with prepended or appended illegal characters.Hm, perhaps you can paste the same into a editor and open it with a hex-view (hexdump) to make the byte values visible.
Dec 25 2009
gdb backtrace:
(gdb) run
Starting program:
[Thread debugging using libthread_db enabled]
[New Thread 0xb74fd6b0 (LWP 5486)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb74fd6b0 (LWP 5486)]
0x080a1458 in _D3dwt8graphics6Device6Device11logFunctionUPaiPaPvZv ()
Current language: auto; currently asm
(gdb) backtrace
log_level=G_LOG_LEVEL_WARNING,
format=0xb7c5b58c "Error converting selection from UTF8_STRING",
log_level=G_LOG_LEVEL_WARNING, format=0xb7c5b58c "Error converting selection
from UTF8_STRING")
at gmessages.c:517
optimized out>, latin1=0, list=0xbf971364) at gdkselection-x11.c:523
(display=0xa165020, encoding=0x4a, format=8,
at gtkselection.c:1431
selection_data=0xbf971870, data=0xa2271a0) at gtkclipboard.c:911
selection_data=0xbf971870, time=1699038784) at gtkclipboard.c:847
return_value=0x0, n_param_values=3, param_values=0xbf971618,
invocation_hint=0xbf971528, marshal_data=0xb7af6310) at gtkmarshalers.c:1584
n_param_values=3, param_values=0xbf971618, invocation_hint=0xbf971528)
at gclosure.c:490
instance=0xa1e02e8, emission_return=0x0, instance_and_params=0xbf971618)
at gsignal.c:2440
detail=0, var_args=0xbf97186c "\200]\"\nE") at gsignal.c:2199
detailed_signal=0xb7bae9df "selection_received") at gsignal.c:2267
optimized out>, format=<value optimized out>,
buffer=0xa2281f8
length=12, time=1699038784) at gtkselection.c:2772
gtkselection.c:2578
return_value=0xbf971a5c, n_param_values=2, param_values=0xbf971b38,
invocation_hint=0xbf971a48, marshal_data=0xb7a20220) at gtkmarshalers.c:84
return_value=0xbf971a5c, n_param_values=2, param_values=0xbf971b38,
invocation_hint=0xbf971a48, marshal_data=0xfc) at gclosure.c:567
return_value=0xbf971a5c, n_param_values=2, param_values=0xbf971b38,
invocation_hint=0xbf971a48)
at gclosure.c:490
instance=0xa1e02e8, emission_return=0xbf971cf8, instance_and_params=0xbf971b38)
at gsignal.c:2478
detail=0,
var_args=0xbf971d7c
002\036\nH)\027\n") at gsignal.c:2209
detail=0) at gsignal.c:2243
at gtkwidget.c:4678
l1c3gdk9_GdkEventZv ()
l1c3gdk9_GdkEventZv ()
c3gdk9_GdkEventPvZv ()
user_data=0x0) at gdkevents-x11.c:2351
gmain.c:2012
dispatch=1, self=0xa14b8e0) at gmain.c:2645
at gmain.c:2708
ext_iterationFPviZi ()
---Type <return> to continue, or q <return> to quit---
After more fiddling around with this, I think only copying from
StyledText widget to clipboard appends illegal characters, not from standard
Text widget.
There appear to be at least 7 different questionable characters.
Emacs' representation of illegal characters:
Hex dump:
00000000: beb4 20e3 8388 e383 a2e3 8387 e383 ab20 .. ............
00000010: e30a 81a8 e382 bbe3 839e e383 b3e3 8386 ................
00000020: e382 a30a 839e e383 b3e3 8386 e382 a3e3 ................
Actual text:
Frank Benoit Wrote:
Am 25.12.2009 23:26, schrieb Mitja:
strace output:
select(4, [3], [3], NULL, NULL) = 1 (out [3])
writev(3, [{"\24\0\6\0005\2 \5\343\2\0\0\0\0\0\0\0\0\0\0\377\377\377\37"...,
24}], 1) = 24
select(4, [3], [], NULL, NULL) = 1 (in [3])
read(3, "\1\10S6\4\0\0\0006\1\0\0\0\0\0\0\17\0\0\0VJ\25\10\374\325
\10tc\346\277\203"..., 4096) = 48
read(3, 0x840a2fc, 4096) = -1 EAGAIN (Resource temporarily
unavailable)
select(4, [3], [3], NULL, NULL) = 1 (out [3])
writev(3, [{"+\0\1\0"..., 4}], 1) = 4
select(4, [3], [], NULL, NULL) = 1 (in [3])
\10tc\346\277x+\177\td\"\36\10Y3\t\10"..., 4096) = 32
read(3, 0x840a2fc, 4096) = -1 EAGAIN (Resource temporarily
unavailable)
select(4, [3], [3], NULL, NULL) = 1 (out [3])
writev(3, [{"\23\0\3\0005\2 \5\343\2\0\0+\0\1\0"..., 16}], 1) = 16
select(4, [3], [], NULL, NULL) = 1 (in [3])
read(3, "\34\"U65\2 \5\343\2\0\0\0\252Fc\1\2\0\0\4\0\0\0\1\
\0\0 B\233\t\1"..., 4096) = 64
read(3, 0x840a2fc, 4096) = -1 EAGAIN (Resource temporarily
unavailable)
--- SIGSEGV (Segmentation fault) 0 (0) ---
+++ killed by SIGSEGV +++
Oh, i did not mean strace (which is a trace of the OS calls a process
does), instead i mean stack trace. You can perhaps get it with the
current tango (i think) or by running the program in GDC and after the
segfault run the "backtrace" command in it. It show the code line where
the segfault happens and the code lines where this one was called from.
Example code:
module text;
import dwt.DWT;
import dwt.custom.StyleRange;
import dwt.widgets.Text;
import dwt.layout.FillLayout;
import dwt.widgets.Display;
import dwt.widgets.Shell;
void main() {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Text text = new Text(shell, DWT.BORDER);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
thanks.
I cannot reproduce the character.
The way I got it was by pasting block of Japanese or Chinese characters into
text widget and then selecting by mouse and copying a few characters from that
block.
Illegal character(s) would as a result of copying appear in Klipper (KDE
clipboard), usually in front or at the end of copied selection.
Segmentation fault would occur when I pasted back the very same selection, now
with prepended or appended illegal characters.
Hm, perhaps you can paste the same into a editor and open it with a
hex-view (hexdump) to make the byte values visible.
Dec 25 2009
sorry, i thought i can take the time. but i haven't, so i can get you the support and fix the problem. I someone else willing to fix that?
Dec 26 2009








Frank Benoit <keinfarbton googlemail.com>