On Mon, Nov 07, 2022 at 11:09:19PM +0200, Andy Shevchenko wrote: > On Mon, Nov 07, 2022 at 10:20:37AM -0800, Dmitry Torokhov wrote: > > On Mon, Nov 07, 2022 at 06:10:27PM +0200, Andy Shevchenko wrote: > > > +static unsigned int gpiochip_count_reserved_ranges(struct gpio_chip *gc) > > > +{ > > > + int size; > > > + > > > + size = fwnode_property_count_u32(gc->fwnode, "gpio-reserved-ranges"); > > > > I wonder if a comment why we need even size would not be helpful. > > Was it in the original code? > Anyway, if Bart thinks so as well, I may add it in v2. > > > > + if (size > 0 && size % 2 == 0) > > > + return size; > > > + > > > + return 0; > > > +} > > > + > > > static int gpiochip_alloc_valid_mask(struct gpio_chip *gc) > > > { > > > - if (!(of_gpio_need_valid_mask(gc) || gc->init_valid_mask)) > > > + if (!(gpiochip_count_reserved_ranges(gc) || gc->init_valid_mask)) > > > return 0; > > > > > > gc->valid_mask = gpiochip_allocate_mask(gc); > > > @@ -457,8 +468,47 @@ static int gpiochip_alloc_valid_mask(struct gpio_chip *gc) > > > return 0; > > > } > > > > > > +static int gpiochip_apply_reserved_ranges(struct gpio_chip *gc, unsigned int sz) > > > +{ > > > + u32 *ranges; > > > + int ret; > > > + > > > + ranges = kmalloc_array(sz, sizeof(*ranges), GFP_KERNEL); > > > + if (!ranges) > > > + return -ENOMEM; > > > + > > > + ret = fwnode_property_read_u32_array(gc->fwnode, "gpio-reserved-ranges", ranges, sz); > > > + if (ret) { > > > + kfree(ranges); > > > + return ret; > > > + } > > > + > > > + while (sz) { > > > + u32 count = ranges[--sz]; > > > + u32 start = ranges[--sz]; > > > > I know we checked sz validity, but I wonder if re-checking it in this > > function would not insulate us from errors creeping in after some other > > code refactoring. > > I'm not sure I understand what you meant. The fwnode_property_read_u32_array() > will fail if the given sz is too big for the real data, so while (sz) would > never even go on the invalid data. I am more worried about sz being odd and the loop ending up trying to dereference ranges[-1]. Thanks. -- Dmitry