On Tue, Sep 17, 2019 at 03:48:42PM -0600, Jordan Crouse wrote: > It is possible for unaware callers of several idr functions to accidentally > underflow the index by specifying a id that is less than the idr base. Hi Jordan. Thanks for the patch, but this seems like a distinction without a difference. > void *idr_remove(struct idr *idr, unsigned long id) > { > + if (id < idr->idr_base) > + return NULL; > + > return radix_tree_delete_item(&idr->idr_rt, id - idr->idr_base, NULL); If this underflows, we'll try to delete an index which doesn't exist, which will return NULL. > void *idr_find(const struct idr *idr, unsigned long id) > { > + if (id < idr->idr_base) > + return NULL; > + > return radix_tree_lookup(&idr->idr_rt, id - idr->idr_base); If this underflows, we'll look up an entry which doesn't exist, which will return NULL. > @@ -302,6 +308,9 @@ void *idr_replace(struct idr *idr, void *ptr, unsigned long id) > void __rcu **slot = NULL; > void *entry; > > + if (id < idr->idr_base) > + return ERR_PTR(-ENOENT); > + > id -= idr->idr_base; > > entry = __radix_tree_lookup(&idr->idr_rt, id, &node, &slot); ... just outside the context is this line: if (!slot || radix_tree_tag_get(&idr->idr_rt, id, IDR_FREE)) return ERR_PTR(-ENOENT); Looking up an index which doesn't exist gets you a NULL slot, so you get -ENOENT anyway. I did think about these possibilities when I was writing the code and convinced myself I didn't need them. If you have an example of a case where I got thast wrong, I'd love to see it. More generally, the IDR is deprecated; I'm trying to convert users to the XArray. If you're adding a new user, can you use the XArray API instead?