diff options
Diffstat (limited to 'debian/patches/fix-console0002-console-client-Fix-lower-range-of-binary-search.patch')
-rw-r--r-- | debian/patches/fix-console0002-console-client-Fix-lower-range-of-binary-search.patch | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/debian/patches/fix-console0002-console-client-Fix-lower-range-of-binary-search.patch b/debian/patches/fix-console0002-console-client-Fix-lower-range-of-binary-search.patch new file mode 100644 index 00000000..e2ad448f --- /dev/null +++ b/debian/patches/fix-console0002-console-client-Fix-lower-range-of-binary-search.patch @@ -0,0 +1,47 @@ +From e974c4ce05f7dcb5e082084fc69f4b2ff2bc891d Mon Sep 17 00:00:00 2001 +From: Diego Nieto Cid <dnietoc@gmail.com> +Date: Thu, 4 Jun 2015 22:58:10 -0300 +Subject: [PATCH hurd 2/2] console-client: Fix lower range of binary search + +To prevent infinite recursion range checking was introduced +as an exit condition adding two extra comparisons on each +recursive call. + +By fixing the range used by the recursive call over the lower +half of the array one can avoid penalizing successful lookups +while still preventing infinite recursion due to `first` +parameter being greater than `last` parameter. + +* console-client/xkb/kstoucs.c (find_ucs): don't remove middle from the +lower range. Remove extra comparisons. +--- + console-client/xkb/kstoucs.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/console-client/xkb/kstoucs.c b/console-client/xkb/kstoucs.c +index fb62445..eb47bde 100644 +--- a/console-client/xkb/kstoucs.c ++++ b/console-client/xkb/kstoucs.c +@@ -17,15 +17,15 @@ find_ucs (int keysym, struct ksmap *first, struct ksmap *last) + + if (middle->keysym == keysym) + return middle->ucs; /* base case: needle found. */ +- else if (first == last /* empty search space */ +- || keysym < first->keysym /* lookup failure */ +- || keysym > last->keysym) /* lookup failure */ ++ else if (first == last) /* empty search space */ + return 0; + /* recursive cases: halve search space. */ + else if (middle->keysym < keysym) + return find_ucs (keysym, middle+1, last); + else if (middle->keysym > keysym) +- return find_ucs (keysym, first, middle-1); ++ /* don't remove middle from the range to compensate ++ for rounding down in it's calculation */ ++ return find_ucs (keysym, first, middle); + return 0; + } + +-- +2.1.4 + |