diff options
Diffstat (limited to 'lib/idr.c')
-rw-r--r-- | lib/idr.c | 10 |
1 files changed, 10 insertions, 0 deletions
@@ -569,6 +569,7 @@ void idr_remove(struct idr *idp, int id) | |||
569 | struct idr_layer *p; | 569 | struct idr_layer *p; |
570 | struct idr_layer *to_free; | 570 | struct idr_layer *to_free; |
571 | 571 | ||
572 | /* see comment in idr_find_slowpath() */ | ||
572 | if (WARN_ON_ONCE(id < 0)) | 573 | if (WARN_ON_ONCE(id < 0)) |
573 | return; | 574 | return; |
574 | 575 | ||
@@ -666,6 +667,14 @@ void *idr_find_slowpath(struct idr *idp, int id) | |||
666 | int n; | 667 | int n; |
667 | struct idr_layer *p; | 668 | struct idr_layer *p; |
668 | 669 | ||
670 | /* | ||
671 | * If @id is negative, idr_find() used to ignore the sign bit and | ||
672 | * performed lookup with the rest of bits, which is weird and can | ||
673 | * lead to very obscure bugs. We're now returning NULL for all | ||
674 | * negative IDs but just in case somebody was depending on the sign | ||
675 | * bit being ignored, let's trigger WARN_ON_ONCE() so that they can | ||
676 | * be detected and fixed. WARN_ON_ONCE() can later be removed. | ||
677 | */ | ||
669 | if (WARN_ON_ONCE(id < 0)) | 678 | if (WARN_ON_ONCE(id < 0)) |
670 | return NULL; | 679 | return NULL; |
671 | 680 | ||
@@ -815,6 +824,7 @@ void *idr_replace(struct idr *idp, void *ptr, int id) | |||
815 | int n; | 824 | int n; |
816 | struct idr_layer *p, *old_p; | 825 | struct idr_layer *p, *old_p; |
817 | 826 | ||
827 | /* see comment in idr_find_slowpath() */ | ||
818 | if (WARN_ON_ONCE(id < 0)) | 828 | if (WARN_ON_ONCE(id < 0)) |
819 | return ERR_PTR(-EINVAL); | 829 | return ERR_PTR(-EINVAL); |
820 | 830 | ||