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

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