Package: rdesktop Version: 1.5.0-2+cvs20071006 Followup-For: Bug #445779 The problem was introduced with rev. 1.224 in rdesktop/xwin.c.
The problematic call is XGetPointerMapping, which is called with a 16 entry buffer, with the expectation that XGetPointerMapping will return 16 as a maximum value. XGetPointerMapping seems to return the number of available mappings, regardless of the buffer size. In my case, this is 32. The for-loop will then overwrite more than 16 bytes of the g_pointer_log_to_phys_map. Restricting pointer_buttons to sizeof(g_pointer_log_to_phys_map) will fix the problem. -- System Information: Debian Release: lenny/sid APT prefers unstable APT policy: (500, 'unstable') Architecture: powerpc (ppc64) Kernel: Linux 2.6.23-rc7-g7bae705e-dirty (SMP w/1 CPU core) Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968) Shell: /bin/sh linked to /bin/bash Versions of packages rdesktop depends on: ii libc6 2.6.1-5 GNU C Library: Shared libraries ii libssl0.9.8 0.9.8f-1 SSL shared libraries ii libx11-6 2:1.0.3-7 X11 client-side library rdesktop recommends no packages. -- no debconf information *** rdesktop/diff Index: xwin.c =================================================================== RCS file: /cvsroot/rdesktop/rdesktop/xwin.c,v retrieving revision 1.223 retrieving revision 1.224 diff -u -r1.223 -r1.224 --- xwin.c 12 Apr 2007 16:04:25 -0000 1.223 +++ xwin.c 14 May 2007 12:11:15 -0000 1.224 @@ -102,6 +102,9 @@ static XIM g_IM; static XIC g_IC; static XModifierKeymap *g_mod_map; +/* Maps logical (xmodmap -pp) pointing device buttons (0-based) back + to physical (1-based) indices. */ +static unsigned char g_pointer_log_to_phys_map[16]; static Cursor g_current_cursor; static RD_HCURSOR g_null_cursor = NULL; static Atom g_protocol_atom, g_kill_atom; @@ -1260,6 +1263,22 @@ return out; } +static void +xwin_refresh_pointer_map(void) +{ + unsigned char phys_to_log_map[sizeof(g_pointer_log_to_phys_map)]; + int i, pointer_buttons; + + pointer_buttons = XGetPointerMapping(g_display, phys_to_log_map, sizeof(phys_to_log_map)); + for (i = 0; i < pointer_buttons; ++i) + { + /* This might produce multiple logical buttons mapping + to a single physical one, but hey, that's + life... */ + g_pointer_log_to_phys_map[phys_to_log_map[i] - 1] = i + 1; + } +} + RD_BOOL get_key_state(unsigned int state, uint32 keysym) { @@ -1614,6 +1633,7 @@ g_width = (g_width + 3) & ~3; g_mod_map = XGetModifierMapping(g_display); + xwin_refresh_pointer_map(); xkeymap_init(); @@ -1877,6 +1897,12 @@ { uint16 button, flags = 0; g_last_gesturetime = xevent.xbutton.time; + /* Reverse the pointer button mapping, e.g. in the case of + "left-handed mouse mode"; the RDP session expects to + receive physical buttons (true in mstsc as well) and + logical button behavior depends on the remote desktop's own + mouse settings */ + xevent.xbutton.button = g_pointer_log_to_phys_map[xevent.xbutton.button - 1]; button = xkeymap_translate_button(xevent.xbutton.button); if (button == 0) return; @@ -2164,6 +2190,12 @@ XFreeModifiermap(g_mod_map); g_mod_map = XGetModifierMapping(g_display); } + + if (xevent.xmapping.request == MappingPointer) + { + xwin_refresh_pointer_map(); + } + break; /* clipboard stuff */ *** rdesktop/fix Index: xwin.c =================================================================== RCS file: /cvsroot/rdesktop/rdesktop/xwin.c,v retrieving revision 1.226 diff -u -r1.226 xwin.c --- xwin.c 30 Aug 2007 04:47:36 -0000 1.226 +++ xwin.c 17 Oct 2007 16:09:22 -0000 @@ -1283,6 +1283,9 @@ int i, pointer_buttons; pointer_buttons = XGetPointerMapping(g_display, phys_to_log_map, sizeof(phys_to_log_map)); + if (pointer_buttons > sizeof(g_pointer_log_to_phys_map)) + pointer_buttons = sizeof(g_pointer_log_to_phys_map); + for (i = 0; i < pointer_buttons; ++i) { /* This might produce multiple logical buttons mapping -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]