X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fefivars.c;h=840e4e0c350cbbbfeb873375c19f783317f523ae;hp=064746a9a89ca558e56f620664cac4bda808128e;hb=46ba8aae2b82bc5c87ba347e6bf914ecd5e9d51e;hpb=61cc634bc208b264bd2fbe6af241b345a2002509 diff --git a/src/shared/efivars.c b/src/shared/efivars.c index 064746a9a..840e4e0c3 100644 --- a/src/shared/efivars.c +++ b/src/shared/efivars.c @@ -303,11 +303,22 @@ static int boot_id_hex(const char s[4]) { return id; } +static int cmp_uint16(const void *_a, const void *_b) { + const uint16_t *a = _a, *b = _b; + + if (*a < *b) + return -1; + if (*a > *b) + return 1; + + return 0; +} + int efi_get_boot_options(uint16_t **options) { _cleanup_closedir_ DIR *dir = NULL; struct dirent *de; uint16_t *list = NULL; - int count = 0; + int count = 0, r; assert(options); @@ -315,7 +326,7 @@ int efi_get_boot_options(uint16_t **options) { if (!dir) return -errno; - while ((de = readdir(dir))) { + FOREACH_DIRENT(de, dir, r = -errno; goto fail) { int id; uint16_t *t; @@ -334,17 +345,22 @@ int efi_get_boot_options(uint16_t **options) { t = realloc(list, (count + 1) * sizeof(uint16_t)); if (!t) { - free(list); - return -ENOMEM; + r = -ENOMEM; + goto fail; } list = t; list[count ++] = id; - } + qsort(list, count, sizeof(uint16_t), cmp_uint16); + *options = list; return count; + +fail: + free(list); + return r; } static int read_usec(sd_id128_t vendor, const char *name, usec_t *u) {