From cc10c90a378db31a880b510c0d6c21a091769dd2 Mon Sep 17 00:00:00 2001 From: Zbigniew Jędrzejewski-Szmek Date: Thu, 9 Jan 2014 14:44:53 -0500 Subject: Never call qsort on potentially NULL arrays This extends 62678ded 'efi: never call qsort on potentially NULL arrays' to all other places where qsort is used and it is not obvious that the count is non-zero. Signed-off-by: Anthony G. Basile --- src/libudev/conf-files.c | 2 +- src/libudev/libudev-enumerate.c | 2 +- src/libudev/util.h | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/libudev/conf-files.c b/src/libudev/conf-files.c index 2baefffad5..2d413999f9 100644 --- a/src/libudev/conf-files.c +++ b/src/libudev/conf-files.c @@ -127,7 +127,7 @@ static int conf_files_list_strv_internal(char ***strv, const char *suffix, const return -ENOMEM; } - qsort(files, hashmap_size(fh), sizeof(char *), base_cmp); + qsort_safe(files, hashmap_size(fh), sizeof(char *), base_cmp); *strv = files; hashmap_free(fh); diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c index 8146f27e4f..e71d766c02 100644 --- a/src/libudev/libudev-enumerate.c +++ b/src/libudev/libudev-enumerate.c @@ -276,7 +276,7 @@ _public_ struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enume size_t move_later_prefix = 0; udev_list_cleanup(&udev_enumerate->devices_list); - qsort(udev_enumerate->devices, udev_enumerate->devices_cur, sizeof(struct syspath), syspath_cmp); + qsort_safe(udev_enumerate->devices, udev_enumerate->devices_cur, sizeof(struct syspath), syspath_cmp); max = udev_enumerate->devices_cur; for (i = 0; i < max; i++) { diff --git a/src/libudev/util.h b/src/libudev/util.h index 18109938e0..88bd771a82 100644 --- a/src/libudev/util.h +++ b/src/libudev/util.h @@ -283,3 +283,11 @@ static inline void _reset_errno_(int *saved_errno) { } #define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno + +static inline void qsort_safe(void *base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *)) { + if (nmemb) { + assert(base); + qsort(base, nmemb, size, compar); + } +} -- cgit v1.2.3-54-g00ecf