[systemd-commits] 6 commits - src/boot src/shared
Zbigniew Jędrzejewski-Szmek
zbyszek at kemper.freedesktop.org
Mon Mar 9 14:07:40 PDT 2015
src/boot/efi/boot.c | 5 -
src/shared/efivars.c | 177 +++++++++++++++------------------------------------
2 files changed, 56 insertions(+), 126 deletions(-)
New commits:
commit 7432b24b8357d913943580b442ffe7040e610f9e
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Mon Mar 9 16:09:16 2015 -0400
efivars: use greedy_realloc
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
index 8b2b6af..d3bec50 100644
--- a/src/shared/efivars.c
+++ b/src/shared/efivars.c
@@ -504,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);
@@ -514,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;
@@ -529,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);
commit 0797f2329ceeb989147416bdb368de4c21bad608
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Mon Mar 9 16:04:42 2015 -0400
efivars: use more _cleanup_
Also rename r to buf, since r is customarily reserved for the return value.
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
index 6908f23..8b2b6af 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;
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)
@@ -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));
}
commit 0aa3b7830fd59d8b4ca275e9a9c4e79f8a23ff6d
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Mon Mar 9 15:57:56 2015 -0400
efivars: do binary and before converting to bool
I'm pretty sure that this is what was meant here.
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
index 2599a1a..6908f23 100644
--- a/src/shared/efivars.c
+++ b/src/shared/efivars.c
@@ -339,7 +339,7 @@ int efi_get_boot_option(
p = NULL;
}
if (active)
- *active = !!header->attr & LOAD_OPTION_ACTIVE;
+ *active = !!(header->attr & LOAD_OPTION_ACTIVE);
return 0;
}
commit a8436474fa5fa02b8ecf3c23be04de2bca8b4c03
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Mon Mar 9 15:55:24 2015 -0400
efivars: rename last remaining err to r
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
index 40c4270..2599a1a 100644
--- a/src/shared/efivars.c
+++ b/src/shared/efivars.c
@@ -261,12 +261,12 @@ int efi_get_boot_option(
size_t title_size;
_cleanup_free_ char *s = NULL, *p = NULL;
sd_id128_t p_uuid = SD_ID128_NULL;
- int err;
+ int r;
xsprintf(boot_id, "Boot%04X", id);
- err = efi_get_variable(EFI_VENDOR_GLOBAL, boot_id, NULL, (void **)&buf, &l);
- if (err < 0)
- return err;
+ r = efi_get_variable(EFI_VENDOR_GLOBAL, boot_id, NULL, (void **)&buf, &l);
+ if (r < 0)
+ return r;
if (l < sizeof(struct boot_option))
return -ENOENT;
commit b7749eb517ff5dd379cf61ee9fb50a0105ab2c0f
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Mon Mar 9 15:54:39 2015 -0400
efivars: modernization
Fix return value if unlink fails.
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
index c6b45d2..40c4270 100644
--- a/src/shared/efivars.c
+++ b/src/shared/efivars.c
@@ -169,10 +169,9 @@ int efi_set_variable(
struct var {
uint32_t attr;
char buf[];
- } _packed_ *buf = NULL;
- char *p = NULL;
- int fd = -1;
- int r;
+ } _packed_ * _cleanup_free_ buf = NULL;
+ _cleanup_free_ char *p = NULL;
+ _cleanup_close_ int fd = -1;
assert(name);
@@ -182,42 +181,23 @@ int efi_set_variable(
return -ENOMEM;
if (size == 0) {
- r = unlink(p);
- goto finish;
+ if (unlink(p) < 0)
+ return -errno;
+ return 0;
}
fd = open(p, O_WRONLY|O_CREAT|O_NOCTTY|O_CLOEXEC, 0644);
- if (fd < 0) {
- r = -errno;
- goto finish;
- }
+ if (fd < 0)
+ return -errno;
buf = malloc(sizeof(uint32_t) + size);
- if (!buf) {
- r = -errno;
- goto finish;
- }
+ if (!buf)
+ return -ENOMEM;
buf->attr = EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS;
memcpy(buf->buf, value, size);
- r = write(fd, buf, sizeof(uint32_t) + size);
- if (r < 0) {
- r = -errno;
- goto finish;
- }
-
- if ((size_t)r != sizeof(uint32_t) + size) {
- r = -EIO;
- goto finish;
- }
-
-finish:
- if (fd >= 0)
- close(fd);
- free(buf);
- free(p);
- return r;
+ return loop_write(fd, buf, sizeof(uint32_t) + size, false);
}
int efi_get_variable_string(sd_id128_t vendor, const char *name, char **p) {
@@ -273,42 +253,17 @@ int efi_get_boot_option(
sd_id128_t *part_uuid,
char **path,
bool *active) {
- struct boot_option {
- uint32_t attr;
- uint16_t path_len;
- uint16_t title[];
- } _packed_;
-
- struct drive_path {
- uint32_t part_nr;
- uint64_t part_start;
- uint64_t part_size;
- char signature[16];
- uint8_t mbr_type;
- uint8_t signature_type;
- } _packed_;
-
- struct device_path {
- uint8_t type;
- uint8_t sub_type;
- uint16_t length;
- union {
- uint16_t path[0];
- struct drive_path drive;
- };
- } _packed_;
char boot_id[9];
_cleanup_free_ uint8_t *buf = NULL;
size_t l;
struct boot_option *header;
size_t title_size;
- char *s = NULL;
- char *p = NULL;
+ _cleanup_free_ char *s = NULL, *p = NULL;
sd_id128_t p_uuid = SD_ID128_NULL;
int err;
- snprintf(boot_id, sizeof(boot_id), "Boot%04X", id);
+ xsprintf(boot_id, "Boot%04X", id);
err = efi_get_variable(EFI_VENDOR_GLOBAL, boot_id, NULL, (void **)&buf, &l);
if (err < 0)
return err;
@@ -322,10 +277,8 @@ int efi_get_boot_option(
if (title) {
s = utf16_to_utf8(header->title, title_size);
- if (!s) {
- err = -ENOMEM;
- goto err;
- }
+ if (!s)
+ return -ENOMEM;
}
if (header->path_len > 0) {
@@ -375,20 +328,20 @@ int efi_get_boot_option(
}
}
- if (title)
+ if (title) {
*title = s;
+ s = NULL;
+ }
if (part_uuid)
*part_uuid = p_uuid;
- if (path)
+ if (path) {
*path = p;
+ p = NULL;
+ }
if (active)
*active = !!header->attr & LOAD_OPTION_ACTIVE;
return 0;
-err:
- free(s);
- free(p);
- return err;
}
static void to_utf16(uint16_t *dest, const char *src) {
@@ -439,13 +392,12 @@ int efi_add_boot_option(uint16_t id, const char *title,
uint32_t part, uint64_t pstart, uint64_t psize,
sd_id128_t part_uuid, const char *path) {
char boot_id[9];
- char *buf;
size_t size;
size_t title_len;
size_t path_len;
struct boot_option *option;
struct device_path *devicep;
- int err;
+ _cleanup_free_ char *buf = NULL;
title_len = (strlen(title)+1) * 2;
path_len = (strlen(path)+1) * 2;
@@ -453,10 +405,8 @@ int efi_add_boot_option(uint16_t id, const char *title,
buf = calloc(sizeof(struct boot_option) + title_len +
sizeof(struct drive_path) +
sizeof(struct device_path) + path_len, 1);
- if (!buf) {
- err = -ENOMEM;
- goto finish;
- }
+ if (!buf)
+ return -ENOMEM;
/* header */
option = (struct boot_option *)buf;
@@ -496,18 +446,14 @@ int efi_add_boot_option(uint16_t id, const char *title,
devicep->length = offsetof(struct device_path, path);
size += devicep->length;
- snprintf(boot_id, sizeof(boot_id), "Boot%04X", id);
- err = efi_set_variable(EFI_VENDOR_GLOBAL, boot_id, buf, size);
-
-finish:
- free(buf);
- return err;
+ xsprintf(boot_id, "Boot%04X", id);
+ return efi_set_variable(EFI_VENDOR_GLOBAL, boot_id, buf, size);
}
int efi_remove_boot_option(uint16_t id) {
char boot_id[9];
- snprintf(boot_id, sizeof(boot_id), "Boot%04X", id);
+ xsprintf(boot_id, "Boot%04X", id);
return efi_set_variable(EFI_VENDOR_GLOBAL, boot_id, NULL, 0);
}
@@ -563,8 +509,8 @@ static int cmp_uint16(const void *_a, const void *_b) {
int efi_get_boot_options(uint16_t **options) {
_cleanup_closedir_ DIR *dir = NULL;
struct dirent *de;
- uint16_t *list = NULL;
- int count = 0, r;
+ _cleanup_free_ uint16_t *list = NULL;
+ int count = 0;
assert(options);
@@ -572,7 +518,7 @@ int efi_get_boot_options(uint16_t **options) {
if (!dir)
return -errno;
- FOREACH_DIRENT(de, dir, r = -errno; goto fail) {
+ FOREACH_DIRENT(de, dir, return -errno) {
int id;
uint16_t *t;
@@ -590,10 +536,8 @@ int efi_get_boot_options(uint16_t **options) {
continue;
t = realloc(list, (count + 1) * sizeof(uint16_t));
- if (!t) {
- r = -ENOMEM;
- goto fail;
- }
+ if (!t)
+ return -ENOMEM;
list = t;
list[count ++] = id;
@@ -602,11 +546,8 @@ int efi_get_boot_options(uint16_t **options) {
qsort_safe(list, count, sizeof(uint16_t), cmp_uint16);
*options = list;
+ list = NULL;
return count;
-
-fail:
- free(list);
- return r;
}
static int read_usec(sd_id128_t vendor, const char *name, usec_t *u) {
commit 56c70b32af20a267c66e5e5179cc176ecf57d635
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Mon Mar 9 15:12:17 2015 -0400
boot/efi: do not assign variable twice
If the highlighted line did not move outside of the visible
region, it should not be necessary to update idx_last.
CID #1287137, #1287138.
diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c
index 3f8140e..be314d8 100644
--- a/src/boot/efi/boot.c
+++ b/src/boot/efi/boot.c
@@ -809,15 +809,12 @@ static BOOLEAN menu_run(Config *config, ConfigEntry **chosen_entry, CHAR16 *load
idx_last = idx_highlight;
idx_first = 1 + idx_highlight - visible_max;
refresh = TRUE;
- }
- if (idx_highlight < idx_first) {
+ } else if (idx_highlight < idx_first) {
idx_first = idx_highlight;
idx_last = idx_highlight + visible_max-1;
refresh = TRUE;
}
- idx_last = idx_first + visible_max-1;
-
if (!refresh && idx_highlight != idx_highlight_prev)
highlight = TRUE;
}
More information about the systemd-commits
mailing list