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

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