iio: buffer: document known issue
authorMatti Vaittinen <mazziesaccount@gmail.com>
Mon, 16 Oct 2023 11:04:55 +0000 (14:04 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 16 Nov 2023 19:10:28 +0000 (19:10 +0000)
Add documentation explaining why the code which scans all available scan
masks is checking only a single long worth of bits even though the code
was intended to be supporting masks wider than single long.

Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Link: https://lore.kernel.org/r/ef61c2c1e9a1c5e9f713f656871fdcb1652afdc2.1697452986.git.mazziesaccount@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/industrialio-buffer.c

index 176d31d9f9d807ed2b8d83ab706c085cf2e56590..09c41e9ccf874808b6e07a263712bdd07d70f506 100644 (file)
@@ -413,6 +413,22 @@ static const unsigned long *iio_scan_mask_match(const unsigned long *av_masks,
 {
        if (bitmap_empty(mask, masklength))
                return NULL;
+       /*
+        * The condition here do not handle multi-long masks correctly.
+        * It only checks the first long to be zero, and will use such mask
+        * as a terminator even if there was bits set after the first long.
+        *
+        * Correct check would require using:
+        * while (!bitmap_empty(av_masks, masklength))
+        * instead. This is potentially hazardous because the
+        * avaliable_scan_masks is a zero terminated array of longs - and
+        * using the proper bitmap_empty() check for multi-long wide masks
+        * would require the array to be terminated with multiple zero longs -
+        * which is not such an usual pattern.
+        *
+        * As writing of this no multi-long wide masks were found in-tree, so
+        * the simple while (*av_masks) check is working.
+        */
        while (*av_masks) {
                if (strict) {
                        if (bitmap_equal(mask, av_masks, masklength))