Blame SOURCES/0031-evdev-fix-array-size-calculation-in-decode_bitset_.patch

8f7639
From 96194ed74158f0b9976fae43a910ad14eaea141e Mon Sep 17 00:00:00 2001
8f7639
From: Eugene Syromyatnikov <evgsyr@gmail.com>
8f7639
Date: Fri, 12 Jul 2019 14:57:28 +0200
8f7639
Subject: [PATCH 2/3] evdev: fix array size calculation in decode_bitset_
8f7639
8f7639
max_nr is in bits (as it is a number of flags), result is in bytes, and
8f7639
the array allocation has to be in personality words.
8f7639
8f7639
There's still an open question, however, what to do on big-endian
8f7639
architectures when a non-divisible-by-4 value is returned.
8f7639
8f7639
* evdev.c (decode_bitset_): Declare size_bits, initialise it and use it
8f7639
later instead of size; round up size by personality's word boundary.
8f7639
---
8f7639
 evdev.c | 12 ++++++++----
8f7639
 1 file changed, 8 insertions(+), 4 deletions(-)
8f7639
8f7639
diff --git a/evdev.c b/evdev.c
8f7639
index 4b811cf8..a3d9cb55 100644
8f7639
--- a/evdev.c
8f7639
+++ b/evdev.c
8f7639
@@ -151,10 +151,14 @@ decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg,
8f7639
 	tprints(", ");
8f7639
 
8f7639
 	unsigned int size;
8f7639
+	unsigned int size_bits;
8f7639
+
8f7639
 	if ((kernel_ulong_t) tcp->u_rval > max_nr / 8)
8f7639
-		size = max_nr;
8f7639
+		size_bits = max_nr;
8f7639
 	else
8f7639
-		size = tcp->u_rval * 8;
8f7639
+		size_bits = tcp->u_rval * 8;
8f7639
+
8f7639
+	size = ROUNDUP(ROUNDUP_DIV(size_bits, 8), current_wordsize);
8f7639
 
8f7639
 	if (syserror(tcp) || !size) {
8f7639
 		printaddr(arg);
8f7639
@@ -170,13 +174,13 @@ decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg,
8f7639
 	tprints("[");
8f7639
 
8f7639
 	int bit_displayed = 0;
8f7639
-	int i = next_set_bit(decoded_arg, 0, size);
8f7639
+	int i = next_set_bit(decoded_arg, 0, size_bits);
8f7639
 	if (i < 0) {
8f7639
 		tprints(" 0 ");
8f7639
 	} else {
8f7639
 		printxval_dispatch(decode_nr, decode_nr_size, i, dflt, xt);
8f7639
 
8f7639
-		while ((i = next_set_bit(decoded_arg, i + 1, size)) > 0) {
8f7639
+		while ((i = next_set_bit(decoded_arg, i + 1, size_bits)) > 0) {
8f7639
 			if (abbrev(tcp) && bit_displayed >= 3) {
8f7639
 				tprints(", ...");
8f7639
 				break;
8f7639
-- 
8f7639
2.13.6
8f7639