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); -- With Best Regards, Andy Shevchenko