On Mon, Mar 7, 2022 at 10:53 AM Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> wrote: > > On Mon, Mar 07, 2022 at 12:23:03AM +0200, Andy Shevchenko wrote: > > On Mon, Mar 7, 2022 at 12:19 AM Andy Shevchenko > > <andy.shevchenko@xxxxxxxxx> wrote: > > > On Mon, Mar 7, 2022 at 12:11 AM Bartosz Golaszewski <brgl@xxxxxxxx> wrote: > > > > > > > > The ngpio fields both in struct gpio_device as well as gpio_chip are > > > > 16-bit unsigned integers. Let's not risk an overflow and check if the > > > > property value represented as a 32-bit unsigned integer is not greater > > > > than U16_MAX. > > > > > > ... > > > > > > > + if (ngpios > U16_MAX) { > > > > + ret = EINVAL; > > > > + goto err_free_descs; > > > > + } > > > > > > I don't think it's a fatal error in this case. I would perhaps print a > > > warning and simply use a masked (which is done implicitly by an > > > assignment of the different type) value. Note, the above is buggy on > > > the buggy DTs, where the upper part of the value is not used. After > > > this patch you effectively make a regression on, yes, broken DTs. > > > > Like > > > > if (ngpios > U16_MAX) > > chip_warn(gc, "line cnt %u is greater than supported; use > > %u\n", ngpios, (u16)ngpio); > > Or to be on safer side move this after == 0 check as > > if (gc->ngpio != ngpios) > chip_warn(gc, "line cnt %u is greater than supported; use %u\n", ngpios, gc->ngpio); > ngpios is not necessarily used so this check must be in the scope of the device property read (inside the if (gc->ngpio == 0) { block). Bart > -- > With Best Regards, > Andy Shevchenko > >