diff options
author | Arnaud Patard <arnaud.patard@rtp-net.org> | 2011-03-04 17:11:05 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2011-03-04 17:29:44 +0000 |
commit | 8b9ee531330a0e4a4f81bbe046282bfd27675015 (patch) | |
tree | ac3bbda9fd343d44f05c06ba6b667784c6a641d6 | |
parent | 38199e44ff1e87b586d51d30b69d1f70e40d27f1 (diff) |
up-input.c: fix bitmap check
In up_input_coldplug(), some checks are done on the input device found in order
to detect if it's a lid switch or not.
The following one is problematic :
/* convert to a bitmask */
num_bits = up_input_str_to_bitmask (contents, bitmask, sizeof (bitmask));
if (num_bits != 1) {
g_debug ("not one bitmask entry for %s", native_path);
ret = FALSE;
goto out;
}
Checking if there's only 1 bit set is wrong. It's nice if you have a x86 with
acpi using 1 input device for the lid switch but it's not always nice.
One can create input devices with gpios-keys like this:
static struct gpio_keys_button keys[] = {
{
.code = SW_LID,
.gpio = ...,
.type = EV_SW,
.desc = "Lid Switch",
},
{
.code = SW_RFKILL_ALL,
.gpio = ...,
.type = EV_SW,
.desc = "rfkill",
},
};
The resulting SW bitmap will be 9 and thus there are 2 bits sets and due to the
mentionned check, the device is ignored by upower.
As a fix, I'm checking if the number of bits is between 0 and SW_CNT
bits.
Signed-off-by: Arnaud Patard <arnaud.patard@rtp-net.org>
Signed-off-by: Richard Hughes <richard@hughsie.com>
-rw-r--r-- | src/linux/up-input.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/linux/up-input.c b/src/linux/up-input.c index 8721ee4..553bd9a 100644 --- a/src/linux/up-input.c +++ b/src/linux/up-input.c @@ -197,8 +197,8 @@ up_input_coldplug (UpInput *input, UpDaemon *daemon, GUdevDevice *d) /* convert to a bitmask */ num_bits = up_input_str_to_bitmask (contents, bitmask, sizeof (bitmask)); - if (num_bits != 1) { - g_debug ("not one bitmask entry for %s", native_path); + if ((num_bits == 0) || (num_bits >= SW_CNT)) { + g_debug ("invalid bitmask entry for %s", native_path); ret = FALSE; goto out; } |