X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Fshared%2Fefivars.c;h=20067c601adb41d205c2a4eda7c8e7fbfbc7c333;hb=d8d5781c1eb031477670facc132e198f8fddd56c;hp=2599a1aba1d91e2e0398732732dead4f3f04f459;hpb=a8436474fa5fa02b8ecf3c23be04de2bca8b4c03;p=elogind.git diff --git a/src/shared/efivars.c b/src/shared/efivars.c index 2599a1aba..20067c601 100644 --- a/src/shared/efivars.c +++ b/src/shared/efivars.c @@ -105,7 +105,7 @@ int efi_get_variable( uint32_t a; ssize_t n; struct stat st; - void *r; + _cleanup_free_ void *buf = NULL; assert(name); assert(value); @@ -133,25 +133,22 @@ int efi_get_variable( if (n != sizeof(a)) return -EIO; - r = malloc(st.st_size - 4 + 2); - if (!r) + buf = malloc(st.st_size - 4 + 2); + if (!buf) return -ENOMEM; - n = read(fd, r, (size_t) st.st_size - 4); - if (n < 0) { - free(r); + n = read(fd, buf, (size_t) st.st_size - 4); + if (n < 0) return -errno; - } - if (n != (ssize_t) st.st_size - 4) { - free(r); + if (n != (ssize_t) st.st_size - 4) return -EIO; - } /* Always NUL terminate (2 bytes, to protect UTF-16) */ - ((char*) r)[st.st_size - 4] = 0; - ((char*) r)[st.st_size - 4 + 1] = 0; + ((char*) buf)[st.st_size - 4] = 0; + ((char*) buf)[st.st_size - 4 + 1] = 0; - *value = r; + *value = buf; + buf = NULL; *size = (size_t) st.st_size - 4; if (attribute) @@ -339,7 +336,7 @@ int efi_get_boot_option( p = NULL; } if (active) - *active = !!header->attr & LOAD_OPTION_ACTIVE; + *active = !!(header->attr & LOAD_OPTION_ACTIVE); return 0; } @@ -458,7 +455,7 @@ int efi_remove_boot_option(uint16_t id) { } int efi_get_boot_order(uint16_t **order) { - void *buf; + _cleanup_free_ void *buf = NULL; size_t l; int r; @@ -466,18 +463,15 @@ int efi_get_boot_order(uint16_t **order) { if (r < 0) return r; - if (l <= 0) { - free(buf); + if (l <= 0) return -ENOENT; - } - if ((l % sizeof(uint16_t) > 0) || - (l / sizeof(uint16_t) > INT_MAX)) { - free(buf); + if (l % sizeof(uint16_t) > 0 || + l / sizeof(uint16_t) > INT_MAX) return -EINVAL; - } *order = buf; + buf = NULL; return (int) (l / sizeof(uint16_t)); } @@ -510,6 +504,7 @@ int efi_get_boot_options(uint16_t **options) { _cleanup_closedir_ DIR *dir = NULL; struct dirent *de; _cleanup_free_ uint16_t *list = NULL; + size_t alloc = 0; int count = 0; assert(options); @@ -520,7 +515,6 @@ int efi_get_boot_options(uint16_t **options) { FOREACH_DIRENT(de, dir, return -errno) { int id; - uint16_t *t; if (strncmp(de->d_name, "Boot", 4) != 0) continue; @@ -535,12 +529,10 @@ int efi_get_boot_options(uint16_t **options) { if (id < 0) continue; - t = realloc(list, (count + 1) * sizeof(uint16_t)); - if (!t) + if (!GREEDY_REALLOC(list, alloc, count + 1)) return -ENOMEM; - list = t; - list[count ++] = id; + list[count++] = id; } qsort_safe(list, count, sizeof(uint16_t), cmp_uint16);