debian/changelog | 7 + debian/patches/130_tmp_touch_count_fix.patch | 125 +++++++++++++++++++++++++++ debian/patches/series | 1 3 files changed, 133 insertions(+)
New commits: commit 079e391788a079ca83489d37f1aba3ec72e8151f Author: Chase Douglas <chase.doug...@canonical.com> Date: Tue Feb 21 16:22:32 2012 +0100 releasing version 1.5.99~git20120220-0ubuntu3 diff --git a/debian/changelog b/debian/changelog index a2af8fd..14c70aa 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,9 @@ -xserver-xorg-input-synaptics (1.5.99~git20120220-0ubuntu3) UNRELEASED; urgency=low +xserver-xorg-input-synaptics (1.5.99~git20120220-0ubuntu3) precise; urgency=low * Fix crash on multitouch devices when disabled while typing (LP: #931344) - Add temporary patch 130_tmp_touch_count_fix.patch - -- Chase Douglas <chase.doug...@ubuntu.com> Tue, 21 Feb 2012 16:14:22 +0100 + -- Chase Douglas <chase.doug...@ubuntu.com> Tue, 21 Feb 2012 16:22:17 +0100 xserver-xorg-input-synaptics (1.5.99~git20120220-0ubuntu2) precise; urgency=low commit 8a746c0bed8b90a7b2954200877e70a206b481bf Author: Chase Douglas <chase.doug...@canonical.com> Date: Tue Feb 21 16:19:00 2012 +0100 Fix crash on multitouch devices when disabled while typing (LP: #931344) * Fix crash on multitouch devices when disabled while typing (LP: #931344) - Add temporary patch 130_tmp_touch_count_fix.patch diff --git a/debian/changelog b/debian/changelog index 3bcde23..a2af8fd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +xserver-xorg-input-synaptics (1.5.99~git20120220-0ubuntu3) UNRELEASED; urgency=low + + * Fix crash on multitouch devices when disabled while typing (LP: #931344) + - Add temporary patch 130_tmp_touch_count_fix.patch + + -- Chase Douglas <chase.doug...@ubuntu.com> Tue, 21 Feb 2012 16:14:22 +0100 + xserver-xorg-input-synaptics (1.5.99~git20120220-0ubuntu2) precise; urgency=low * Prevent trackpad pointer drift (LP: #921082) diff --git a/debian/patches/130_tmp_touch_count_fix.patch b/debian/patches/130_tmp_touch_count_fix.patch new file mode 100644 index 0000000..6d33056 --- /dev/null +++ b/debian/patches/130_tmp_touch_count_fix.patch @@ -0,0 +1,125 @@ +From 5739a101d2f96ba4a0854202017d31f2b3dfee26 Mon Sep 17 00:00:00 2001 +From: Chase Douglas <chase.doug...@canonical.com> +Date: Tue, 21 Feb 2012 15:54:00 +0100 +Subject: [PATCH] Update touch state when device is off too + +If the device is turned off, usually by syndaemon to disable the +touchpad while the typing, the touch state will not be updated with the +latest hardware state changes. If a touch begins while the device is +off and ends while the device is on, then the touch count will be +decremented without any previous increment. A similar effect will occur +if the device is on when the touch begins, but off when the touch ends. + +If the touch count goes negative, the index into the touch slot mask +array will be out of bounds. This can corrupt memory and cause random +crashes. + +Signed-off-by: Chase Douglas <chase.doug...@canonical.com> +--- + src/synaptics.c | 74 ++++++++++++++++++++++++++++++------------------------ + 1 files changed, 41 insertions(+), 33 deletions(-) + +diff --git a/src/synaptics.c b/src/synaptics.c +index 7b3f680..c736b6a 100644 +--- a/src/synaptics.c ++++ b/src/synaptics.c +@@ -2596,6 +2596,42 @@ repeat_scrollbuttons(const InputInfoPtr pInfo, + return delay; + } + ++/* Update the open slots and number of active touches */ ++static void ++UpdateTouchState(InputInfoPtr pInfo, struct SynapticsHwState *hw) ++{ ++#ifdef HAVE_MULTITOUCH ++ SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; ++ int i; ++ ++ for (i = 0; i < hw->num_mt_mask; i++) ++ { ++ if (hw->slot_state[i] == SLOTSTATE_OPEN) ++ { ++ priv->open_slots[priv->num_active_touches] = i; ++ priv->num_active_touches++; ++ } else if (hw->slot_state[i] == SLOTSTATE_CLOSE) ++ { ++ Bool found = FALSE; ++ int j; ++ ++ for (j = 0; j < priv->num_active_touches - 1; j++) ++ { ++ if (priv->open_slots[j] == i) ++ found = TRUE; ++ ++ if (found) ++ priv->open_slots[j] = priv->open_slots[j + 1]; ++ } ++ ++ priv->num_active_touches--; ++ } ++ } ++ ++ SynapticsResetTouchHwState(hw); ++#endif ++} ++ + static void + HandleTouches(InputInfoPtr pInfo, struct SynapticsHwState *hw) + { +@@ -2675,40 +2711,9 @@ HandleTouches(InputInfoPtr pInfo, struct SynapticsHwState *hw) + xf86PostTouchEvent(pInfo->dev, slot, XI_TouchEnd, 0, + hw->mt_mask[slot]); + } +- +-out: +- /* Update the open slots and number of active touches */ +- for (i = 0; i < hw->num_mt_mask; i++) +- { +- if (hw->slot_state[i] == SLOTSTATE_OPEN) +- { +- priv->open_slots[priv->num_active_touches] = i; +- priv->num_active_touches++; +- } else if (hw->slot_state[i] == SLOTSTATE_CLOSE) +- { +- Bool found = FALSE; +- int j; + +- for (j = 0; j < priv->num_active_touches - 1; j++) +- { +- if (priv->open_slots[j] == i) +- found = TRUE; +- +- if (found) +- priv->open_slots[j] = priv->open_slots[j + 1]; +- } +- +- priv->num_active_touches--; +- } +- } +- +- /* We calculated the value twice, might as well double check our math */ +- if (priv->num_active_touches != new_active_touches) +- xf86IDrvMsg(pInfo, X_WARNING, +- "calculated wrong number of active touches (%d vs %d)\n", +- priv->num_active_touches, new_active_touches); +- +- SynapticsResetTouchHwState(hw); ++out: ++ UpdateTouchState(pInfo, hw); + #endif + } + +@@ -2741,7 +2746,10 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now, + + /* If touchpad is switched off, we skip the whole thing and return delay */ + if (para->touchpad_off == 1) ++ { ++ UpdateTouchState(pInfo, hw); + return delay; ++ } + + /* apply hysteresis before doing anything serious. This cancels + * out a lot of noise which might surface in strange phenomena +-- +1.7.9 + diff --git a/debian/patches/series b/debian/patches/series index 2ce9188..98cd143 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -20,3 +20,4 @@ 127_default_drag_lock.patch 128_disable_three_click_action.patch 129_tmp_pointer_drift.patch +130_tmp_touch_count_fix.patch -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1s0kg6-0002s6...@vasks.debian.org