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

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