Blame SOURCES/0031-avoid-zero-length-VLA-in-evdev_c.patch

2eae47
Index: strace-4.24/evdev.c
2eae47
===================================================================
2eae47
--- strace-4.24.orig/evdev.c	2019-06-13 23:42:43.294304862 +0200
2eae47
+++ strace-4.24/evdev.c	2019-06-13 23:43:35.588294946 +0200
2eae47
@@ -143,6 +143,14 @@
2eae47
 	return RVAL_IOCTL_DECODED;
2eae47
 }
2eae47
 
2eae47
+# ifndef ROUNDUP_DIV
2eae47
+#  define ROUNDUP_DIV(val_, div_) (((val_) + (div_) - 1) / (div_))
2eae47
+# endif
2eae47
+
2eae47
+# ifndef ROUNDUP
2eae47
+#  define ROUNDUP(val_, div_) (ROUNDUP_DIV((val_), (div_)) * (div_))
2eae47
+# endif
2eae47
+
2eae47
 static int
2eae47
 decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg,
2eae47
 	       const struct xlat decode_nr[], const unsigned int max_nr,
2eae47
@@ -151,25 +159,36 @@
2eae47
 	tprints(", ");
2eae47
 
2eae47
 	unsigned int size;
2eae47
-	if ((kernel_ulong_t) tcp->u_rval > max_nr / 8)
2eae47
-		size = max_nr;
2eae47
+	unsigned int size_bits;
2eae47
+
2eae47
+	if ((kernel_ulong_t) tcp->u_rval > max_nr / CHAR_BIT)
2eae47
+		size_bits = max_nr;
2eae47
 	else
2eae47
-		size = tcp->u_rval * 8;
2eae47
+		size_bits = tcp->u_rval * CHAR_BIT;
2eae47
+
2eae47
+	size = ROUNDUP(ROUNDUP_DIV(size_bits, CHAR_BIT), current_wordsize);
2eae47
+
2eae47
+	if (syserror(tcp) || !size) {
2eae47
+		printaddr(arg);
2eae47
+
2eae47
+		return RVAL_IOCTL_DECODED;
2eae47
+	}
2eae47
+
2eae47
 	char decoded_arg[size];
2eae47
 
2eae47
-	if (umove_or_printaddr(tcp, arg, &decoded_arg))
2eae47
+	if (umoven_or_printaddr(tcp, arg, size, decoded_arg))
2eae47
 		return RVAL_IOCTL_DECODED;
2eae47
 
2eae47
 	tprints("[");
2eae47
 
2eae47
 	int bit_displayed = 0;
2eae47
-	int i = next_set_bit(decoded_arg, 0, size);
2eae47
+	int i = next_set_bit(decoded_arg, 0, size_bits);
2eae47
 	if (i < 0) {
2eae47
 		tprints(" 0 ");
2eae47
 	} else {
2eae47
 		printxval_dispatch(decode_nr, decode_nr_size, i, dflt, xt);
2eae47
 
2eae47
-		while ((i = next_set_bit(decoded_arg, i + 1, size)) > 0) {
2eae47
+		while ((i = next_set_bit(decoded_arg, i + 1, size_bits)) > 0) {
2eae47
 			if (abbrev(tcp) && bit_displayed >= 3) {
2eae47
 				tprints(", ...");
2eae47
 				break;