I think the issue is that xsel.c allocates "int nr_bytes;" in
change_property(), and then passes it to XChangeProperty with
format==32.  However, XChangeProperty() documents that format==32
specifically means a pointer to long (even on LP64 platforms).

I suspect changing "int nr_bytes" to "long nr_bytes" should fix the bug.

On Tue, Jun 17, 2014 at 1:56 AM, patrick keshishian <pkesh...@gmail.com> wrote:
> Hi,
>
> I use xsel (from ports) pretty often, and every so often it
> crashes:
>
> $ gdb `which xsel` xsel.core
> GNU gdb 6.3
> Copyright 2004 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB.  Type "show warranty" for details.
> This GDB was configured as "amd64-unknown-openbsd5.5"...
> Core was generated by `xsel'.
> Program terminated with signal 11, Segmentation fault.
> Loaded symbols ...
> [...]
> #0  0x000005adb1e28f40 in _XData32 () from /usr/X11R6/lib/libX11.so.16.0
> (gdb) bt
> #0  0x000005adb1e28f40 in _XData32 () from /usr/X11R6/lib/libX11.so.16.0
> #1  0x000005adb1e05629 in XChangeProperty () from 
> /usr/X11R6/lib/libX11.so.16.0
> #2  0x000005aba4a03d75 in change_property (display=0x5adb3b07000,
>     requestor=20978267, property=482, target=4, format=32, mode=0,
>     data=0x5ada9647fc0 "3\001", nelements=9, selection=1, time=3242522763,
>     mparent=0x0) at /usr/build/ports/pobj/xsel-1.2.0/xsel-1.2.0/xsel.c:1177
> #3  0x000005aba4a042f9 in handle_targets (display=0x5adb3b07000,
>     requestor=20978267, property=482, selection=1, time=3242522763,
>     mparent=0x0) at /usr/build/ports/pobj/xsel-1.2.0/xsel-1.2.0/xsel.c:1307
> #4  0x000005aba4a04b48 in handle_selection_request (event=
>         {type = 30, xany = {type = 30, serial = 22, send_event = 0,
> display = 0x5adb3b07000, window = 18874369}, xkey = {type = 30, serial
> = 22, send_event = 0, display = 0x5adb3b07000, window = 18874369, root
> = 20978267, subwindow = 1, time = 311, x = 482, y = 0, x_root =
> -1052444533, y_root = 0, state = 0, keycode = 0, same_screen = 0},
> xbutton = {type = 30, serial = 22, send_event = 0, display =
> 0x5adb3b07000, window = 18874369, root = 20978267, subwindow = 1, time
> = 311, x = 482, y = 0, x_root = -1052444533, y_root = 0, state = 0,
> button = 0, same_screen = 0}, xmotion = {type = 30, serial = 22,
> send_event = 0, display = 0x5adb3b07000, window = 18874369, root =
> 20978267, subwindow = 1, time = 311, x = 482, y = 0, x_root =
> -1052444533, y_root = 0, state = 0, is_hint = 0 '\0', same_screen =
> 0}, xcrossing = {type = 30, serial = 22, send_event = 0, display =
> 0x5adb3b07000, window = 18874369, root = 20978267, subwindow = 1, time
> = 311, x = 482, y = 0, x_root = -1052444533, y_root = 0, mode = 0,
> detail = 0, same_screen = 0, focus = 0, state = 0}, xfocus = {type =
> 30, serial = 22, send_event = 0, display = 0x5adb3b07000, window =
> 18874369, mode = 20978267, detail = 0}, xexpose = {type = 30, serial =
> 22, send_event = 0, display = 0x5adb3b07000, window = 18874369, x =
> 20978267, y = 0, width = 1, height = 0, count = 311}, xgraphicsexpose
> = {type = 30, serial = 22, send_event = 0, display = 0x5adb3b07000,
> drawable = 18874369, x = 20978267, y = 0, width = 1, height = 0, count
> = 311, major_code = 0, minor_code = 482}, xnoexpose = {type = 30,
> serial = 22, send_event = 0, display = 0x5adb3b07000, drawable =
> 18874369, major_code = 20978267, minor_code = 0}, xvisibility = {type
> = 30, serial = 22, send_event = 0, display = 0x5adb3b07000, window =
> 18874369, state = 20978267}, xcreatewindow = {type = 30, serial = 22,
> send_event = 0, display = 0x5adb3b07000, parent = 18874369, window =
> 20978267, x = 1, y = 0, width = 311, height = 0, border_width = 482,
> override_redirect = 0}, xdestroywindow = {type = 30, serial = 22,
> send_event = 0, display = 0x5adb3b07000, event = 18874369, window =
> 20978267}, xunmap = {type = 30, serial = 22, send_event = 0, display =
> 0x5adb3b07000, event = 18874369, window = 20978267, from_configure =
> 1}, xmap = {type = 30, serial = 22, send_event = 0, display =
> 0x5adb3b07000, event = 18874369, window = 20978267, override_redirect
> = 1}, xmaprequest = {type = 30, serial = 22, send_event = 0, display =
> 0x5adb3b07000, parent = 18874369, window = 20978267}, xreparent =
> {type = 30, serial = 22, send_event = 0, display = 0x5adb3b07000,
> event = 18874369, window = 20978267, parent = 1, x = 311, y = 0,
> override_redirect = 482}, xconfigure = {type = 30, serial = 22,
> send_event = 0, display = 0x5adb3b07000, event = 18874369, window =
> 20978267, x = 1, y = 0, width = 311, height = 0, border_width = 482,
> above = 3242522763, override_redirect = 0}, xgravity = {type = 30,
> serial = 22, send_event = 0, display = 0x5adb3b07000, event =
> 18874369, window = 20978267, x = 1, y = 0}, xresizerequest = {type =
> 30, serial = 22, send_event = 0, display = 0x5adb3b07000, window =
> 18874369, width = 20978267, height = 0}, xconfigurerequest = {type =
> 30, serial = 22, send_event = 0, display = 0x5adb3b07000, parent =
> 18874369, window = 20978267, x = 1, y = 0, width = 311, height = 0,
> border_width = 482, above = 3242522763, detail = 0, value_mask = 0},
> xcirculate = {type = 30, serial = 22, send_event = 0, display =
> 0x5adb3b07000, event = 18874369, window = 20978267, place = 1},
> xcirculaterequest = {type = 30, serial = 22, send_event = 0, display =
> 0x5adb3b07000, parent = 18874369, window = 20978267, place = 1},
> xproperty = {type = 30, serial = 22, send_event = 0, display =
> 0x5adb3b07000, window = 18874369, atom = 20978267, time = 1, state =
> 311}, xselectionclear = {type = 30, serial = 22, send_event = 0,
> display = 0x5adb3b07000, window = 18874369, selection = 20978267, time
> = 1}, xselectionrequest = {type = 30, serial = 22, send_event = 0,
> display = 0x5adb3b07000, owner = 18874369, requestor = 20978267,
> selection = 1, target = 311, property = 482, time = 3242522763},
> xselection = {type = 30, serial = 22, send_event = 0, display =
> 0x5adb3b07000, requestor = 18874369, selection = 20978267, target = 1,
> property = 311, time = 482}, xcolormap = {type = 30, serial = 22,
> send_event = 0, display = 0x5adb3b07000, window = 18874369, colormap =
> 20978267, new = 1, state = 0}, xclient = {type = 30, serial = 22,
> send_event = 0, display = 0x5adb3b07000, window = 18874369,
> message_type = 20978267, format = 1, data = {b =
> "7\001\000\000\000\000\000\000â\001\000\000\000\000\000\000\213øDÁ", s
> = {311, 0, 0, 0, 482, 0, 0, 0, -1909, -16060}, l = {311, 482,
> 3242522763, 0, 0}}}, xmapping = {type = 30, serial = 22, send_event =
> 0, display = 0x5adb3b07000, window = 18874369, request = 20978267,
> first_keycode = 0, count = 1}, xerror = {type = 30, display = 0x16,
> resourceid = 0, serial = 6243602165760, error_code = 1 '\001',
> request_code = 0 '\0', minor_code = 32 ' '}, xkeymap = {type = 30,
> serial = 22, send_event = 0, display = 0x5adb3b07000, window =
> 18874369, key_vector =
> "[\032@\001\000\000\000\000\001\000\000\000\000\000\000\0007\001\000\000\000\000\000\000â\001\000\000\000\000\000"},
> xgeneric = {type = 30, serial = 22, send_event = 0, display =
> 0x5adb3b07000, extension = 18874369, evtype = 0}, xcookie = {type =
> 30, serial = 22, send_event = 0, display = 0x5adb3b07000, extension =
> 18874369, evtype = 0, cookie = 20978267, data = 0x1}, pad = {30, 22,
> 0, 6243602165760, 18874369, 20978267, 1, 311, 482, 3242522763, 0
> <repeats 14 times>}},
>     sel=0x5ada7dbf000 "\t")
>     at /usr/build/ports/pobj/xsel-1.2.0/xsel-1.2.0/xsel.c:1551
> #5  0x000005aba4a04e5c in set_selection (selection=1, sel=0x5ada7dbf000 "\t")
>     at /usr/build/ports/pobj/xsel-1.2.0/xsel-1.2.0/xsel.c:1637
> #6  0x000005aba4a04f08 in set_selection__daemon (selection=1,
>     sel=0x5ada7dbf000 "\t")
>     at /usr/build/ports/pobj/xsel-1.2.0/xsel-1.2.0/xsel.c:1674
> #7  0x000005aba4a06324 in main (argc=1, argv=0x5ada53e7050)
>     at /usr/build/ports/pobj/xsel-1.2.0/xsel-1.2.0/xsel.c:2143
>
>
> I finally decided to see what's going on but couldn't
> quite figure out where the client code does things
> wrong, starting off with the assumption the client is
> to blame.
>
> I don't have xenocara built with debuging symbols, so
> decided to see if other reports exist on crashes ending
> in _XData32() and found this 2007 report to NetBSD[1]
> by Pierre Pronchery.
>
> The report is far more detailed than I could ever hope
> to provide. He, I think, has isolated the issue to the
> following copy operation in _XData32():
>
>         i >>= 2;
>         while (--i >= 0)
>             *buf++ = *data++;
>
> Noting that buf is of type "int *" while data is "long *".
> So, every so often, *data++ will read beyond bounds.
> No? Causing the segfault on amd64 OpenBSD, while
> Pierre Pronchery observes the bus error for unaligned
> access on sparc64 NetBSD.
>
> Hoping this issue gets better traction here with some
> X11 wizards.
>
> --patrick
>
> [1] http://mail-index.netbsd.org/netbsd-bugs/2007/10/02/0005.html

Reply via email to