Skip to contentSkip to conversation

gpiolib: shifters used as flags in gpio_ioctl()

PATCH In review Dan Carpenter 2 participants 2 messages Feb 23, 2016

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 gpiolib: shifters used as flags in gpio_ioctl()

We weren't testing whether the bits were set correctly because we used shifters as flags. It means that we give the user incorrect line information in this new ioctl.

Fixes 521a2ad6f862 ('gpio: add userspace ABI for GPIO line information')
drivers/gpio/gpiolib.c +9 -7
index b816469..d609e03 100644
@@ -380,17 +380,19 @@ static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 		 * this GPIO so it can't use it.
 		 */
 		lineinfo.flags = 0;
-		if (desc->flags & (FLAG_REQUESTED | FLAG_IS_HOGGED |
-				   FLAG_USED_AS_IRQ | FLAG_EXPORT |
-				   FLAG_SYSFS))
+		if (desc->flags & ((1 << FLAG_REQUESTED) |
+				   (1 << FLAG_IS_HOGGED) |
+				   (1 << FLAG_USED_AS_IRQ) |
+				   (1 << FLAG_EXPORT) |
+				   (1 << FLAG_SYSFS)))
 			lineinfo.flags |= GPIOLINE_FLAG_KERNEL;
-		if (desc->flags & FLAG_IS_OUT)
+		if (test_bit(FLAG_IS_OUT, &desc->flags))
 			lineinfo.flags |= GPIOLINE_FLAG_IS_OUT;
-		if (desc->flags & FLAG_ACTIVE_LOW)
+		if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
 			lineinfo.flags |= GPIOLINE_FLAG_ACTIVE_LOW;
-		if (desc->flags & FLAG_OPEN_DRAIN)
+		if (test_bit(FLAG_OPEN_DRAIN, &desc->flags))
 			lineinfo.flags |= GPIOLINE_FLAG_OPEN_DRAIN;
-		if (desc->flags & FLAG_OPEN_SOURCE)
+		if (test_bit(FLAG_OPEN_SOURCE, &desc->flags))
 			lineinfo.flags |= GPIOLINE_FLAG_OPEN_SOURCE;
 
 		if (copy_to_user(ip, &lineinfo, sizeof(lineinfo)))
#1 lore raw
Quoted 6 lines · Dan Carpenter

We weren't testing whether the bits were set correctly because we used shifters as flags. It means that we give the user incorrect line information in this new ioctl.

Fixes 521a2ad6f862 ('gpio: add userspace ABI for GPIO line information')

Already wrote and queued a similar patch yesterday, but thanks anyway Dan!

Yours,
Linus Walleij