From 1d4e7048c915565c3ac9b2fc3e631f19324354a0 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Aug 01 2014 13:50:54 +0000 Subject: Rebase to current upstream master (in preperation for 0.8.0) Signed-off-by: Peter Jones --- diff --git a/0001-Filenames-and-github-the-worst-of-both-worlds.patch b/0001-Filenames-and-github-the-worst-of-both-worlds.patch new file mode 100644 index 0000000..a431474 --- /dev/null +++ b/0001-Filenames-and-github-the-worst-of-both-worlds.patch @@ -0,0 +1,26 @@ +From 2a05511a070a56c720710b4f0410dc73b4c9b6d3 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Wed, 2 Apr 2014 10:04:52 -0400 +Subject: [PATCH 01/22] Filenames and github - the worst of both worlds. + +Signed-off-by: Peter Jones +--- + efibootmgr.spec | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/efibootmgr.spec b/efibootmgr.spec +index bd2eed0..39a5be5 100644 +--- a/efibootmgr.spec ++++ b/efibootmgr.spec +@@ -16,7 +16,7 @@ BuildRequires: efivar-libs efivar-devel + Conflicts: elilo < 3.6-6 + Obsoletes: elilo < 3.6-6 + +-Source0: https://github.com/vathpela/%{name}/archive/%{version}.tar.bz2 ++Source0: https://github.com/vathpela/%{name}/archive/%{name}-%{version}.tar.bz2 + + %description + %{name} displays and allows the user to edit the Intel Extensible +-- +1.9.3 + diff --git a/0001-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch b/0001-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch deleted file mode 100644 index 1fe8c07..0000000 --- a/0001-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 15a46a8023c9925a78ddbacc8534af17db611edb Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Tue, 17 Jun 2014 14:05:31 -0400 -Subject: [PATCH] Mitigate apple setting invalid attribute bits in boot - variables. - -Signed-off-by: Peter Jones ---- - src/efibootmgr/efibootmgr.c | 19 ++++++++++++++++++- - 1 file changed, 18 insertions(+), 1 deletion(-) - -diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c -index e2ec5cd..f596d99 100644 ---- a/src/efibootmgr/efibootmgr.c -+++ b/src/efibootmgr/efibootmgr.c -@@ -115,6 +115,13 @@ read_vars(char **namelist, - &entry->attributes); - if (rc < 0) - goto err; -+ -+ /* latest apple firmware sets high bit which appears -+ * invalid to the linux kernel if we write it back so -+ * lets zero it out if it is set since it would be -+ * invalid to set it anyway */ -+ entry->attributes = entry->attributes & ~(1 << 31); -+ - entry->name = namelist[i]; - list_add_tail(&entry->list, head); - } -@@ -299,6 +306,11 @@ read_boot_order(efi_variable_t **boot_order) - free(new); - *boot_order = NULL; - } -+ -+ /* latest apple firmware sets high bit which appears invalid -+ * to the linux kernel if we write it back so lets zero it out -+ * if it is set since it would be invalid to set it anyway */ -+ bo->attributes = bo->attributes & ~(1 << 31); - return rc; - } - -@@ -404,7 +416,7 @@ read_boot_u16(const char *name) - static int - set_boot_u16(const char *name, uint16_t num) - { -- return efi_set_variable(EFI_GLOBAL_GUID, name, (uint8_t *)&num, -+ return efi_set_variable(EFI_GLOBAL_GUID, name, (uint8_t *)&num, - sizeof (num), EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS); -@@ -577,6 +589,11 @@ construct_boot_order(char *bootorder, int keep, - return 0; - } - -+ /* latest apple firmware sets high bit which appears invalid -+ * to the linux kernel if we write it back so lets zero it out -+ * if it is set since it would be invalid to set it anyway */ -+ bo.attributes = bo.attributes & ~(1 << 31); -+ - size_t new_data_size = data_size + bo.data_size; - uint16_t *new_data = calloc(1, new_data_size); - if (!new_data) --- -1.9.0 - diff --git a/0002-Get-a-lot-more-picky-with-our-compiler-warnings.patch b/0002-Get-a-lot-more-picky-with-our-compiler-warnings.patch new file mode 100644 index 0000000..f19b024 --- /dev/null +++ b/0002-Get-a-lot-more-picky-with-our-compiler-warnings.patch @@ -0,0 +1,161 @@ +From c561f24adbce7b2e7aca4c4adf2ad32dae73435f Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 14 Apr 2014 16:39:42 -0400 +Subject: [PATCH 02/22] Get a lot more picky with our compiler warnings. + +Signed-off-by: Peter Jones +--- + Makefile | 2 +- + src/efibootmgr/efibootmgr.c | 9 ++++++--- + src/include/efibootmgr.h | 4 ++-- + src/lib/disk.c | 7 ++++--- + src/lib/efi.c | 2 +- + src/lib/efichar.c | 4 ++-- + src/lib/unparse_path.c | 2 +- + 7 files changed, 17 insertions(+), 13 deletions(-) + +diff --git a/Makefile b/Makefile +index 610e165..c6e8e4a 100644 +--- a/Makefile ++++ b/Makefile +@@ -8,7 +8,7 @@ + RELEASE_STRING := $(RELEASE_NAME)-$(RELEASE_MAJOR).$(RELEASE_MINOR).$(RELEASE_SUBLEVEL) + + CFLAGS = $(EXTRA_CFLAGS) -DEFIBOOTMGR_VERSION=\"$(RELEASE_MAJOR).$(RELEASE_MINOR).$(RELEASE_SUBLEVEL)\" \ +- -Wall -g -D_FILE_OFFSET_BITS=64 ++ -Wsign-compare -Wall -Werror -g -D_FILE_OFFSET_BITS=64 + + MODULES := src + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index 98eea81..1bc48b2 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -342,7 +342,7 @@ remove_from_boot_order(uint16_t num) + efi_variable_t *boot_order = NULL; + uint64_t new_data_size; + uint16_t *new_data, *old_data; +- int old_i,new_i; ++ unsigned int old_i,new_i; + int rc; + + rc = read_boot_order(&boot_order); +@@ -693,7 +693,7 @@ show_boot_vars() + printf("\n"); + continue; + } +- if (optional_data_len > path->length + 4) { ++ if (optional_data_len > (uint64_t)(path->length + 4)) { + printf("(invalid optional data length)\n"); + continue; + } +@@ -1083,7 +1083,10 @@ main(int argc, char **argv) + return 0; + } + +- if (opts.iface && opts.acpi_hid == -1 && opts.acpi_uid == -1) { ++ if (opts.iface && ( ++ opts.acpi_hid < 0 || opts.acpi_uid < 0 || ++ opts.acpi_hid > UINT32_MAX || ++ opts.acpi_uid > UINT32_MAX)) { + fprintf(stderr, "\nYou must specify the ACPI HID and UID when using -i.\n\n"); + return 1; + } +diff --git a/src/include/efibootmgr.h b/src/include/efibootmgr.h +index a1cbcec..87c83bb 100644 +--- a/src/include/efibootmgr.h ++++ b/src/include/efibootmgr.h +@@ -40,8 +40,8 @@ typedef struct { + int bootnext; + int verbose; + int active; +- uint32_t acpi_hid; +- uint32_t acpi_uid; ++ int64_t acpi_hid; ++ int64_t acpi_uid; + unsigned int delete_boot:1; + unsigned int delete_bootorder:1; + unsigned int delete_bootnext:1; +diff --git a/src/lib/disk.c b/src/lib/disk.c +index eb2f54c..636b509 100644 +--- a/src/lib/disk.c ++++ b/src/lib/disk.c +@@ -165,7 +165,8 @@ disk_info_from_fd(int fd, struct disk_info *info) + return 0; + } + +- if (get_virtblk_major() != -1 && get_virtblk_major() == info->major) { ++ if (get_virtblk_major() >= 0 && ++ (uint64_t)get_virtblk_major() == info->major) { + info->interface_type = virtblk; + info->disknum = info->minor >> 4; + info->part = info->minor & 0xF; +@@ -184,7 +185,7 @@ disk_get_virt_pci(const struct disk_info *info, unsigned char *bus, + ssize_t lnksz; + + if (snprintf(inbuf, sizeof inbuf, "/sys/dev/block/%" PRIu64 ":%u", +- info->major, info->minor) >= sizeof inbuf) { ++ info->major, info->minor) >= (ssize_t)(sizeof inbuf)) { + return 1; + } + +@@ -544,7 +545,7 @@ disk_get_partition_info (int fd, + + offset = lseek(fd, 0, SEEK_SET); + this_bytes_read = read(fd, mbr_sector, mbr_size); +- if (this_bytes_read < sizeof(*mbr)) { ++ if (this_bytes_read < (ssize_t)sizeof(*mbr)) { + rc=1; + goto error_free_mbr; + } +diff --git a/src/lib/efi.c b/src/lib/efi.c +index 6e9a01f..078bbc5 100644 +--- a/src/lib/efi.c ++++ b/src/lib/efi.c +@@ -557,7 +557,7 @@ get_virt_pci(char *name, unsigned char *bus, + ssize_t lnksz; + + if (snprintf(inbuf, sizeof inbuf, "/sys/bus/virtio/devices/%s", +- name) >= sizeof inbuf) { ++ name) >= (ssize_t)(sizeof inbuf)) { + return -1; + } + +diff --git a/src/lib/efichar.c b/src/lib/efichar.c +index 831c759..b49b5a0 100644 +--- a/src/lib/efichar.c ++++ b/src/lib/efichar.c +@@ -71,7 +71,7 @@ efichar_strcmp(const efi_char16_t *s1, const efi_char16_t *s2) + unsigned long + efichar_from_char(efi_char16_t *dest, const char *src, size_t dest_len) + { +- int i, src_len = strlen(src); ++ unsigned int i, src_len = strlen(src); + for (i=0; i < src_len && i < (dest_len/sizeof(*dest)) - 1; i++) { + dest[i] = src[i]; + } +@@ -82,7 +82,7 @@ efichar_from_char(efi_char16_t *dest, const char *src, size_t dest_len) + unsigned long + efichar_to_char(char *dest, const efi_char16_t *src, size_t dest_len) + { +- int i, src_len = efichar_strlen(src, -1); ++ unsigned int i, src_len = efichar_strlen(src, -1); + for (i=0; i < src_len && i < (dest_len/sizeof(*dest)) - 1; i++) { + dest[i] = src[i]; + } +diff --git a/src/lib/unparse_path.c b/src/lib/unparse_path.c +index 054ef9d..27e1dbb 100644 +--- a/src/lib/unparse_path.c ++++ b/src/lib/unparse_path.c +@@ -505,7 +505,7 @@ unparse_path(char *buffer, size_t buffer_size, + buf_offset += needed; + + if (path->length + sizeof (END_DEVICE_PATH) +- > pathsize - parsed_length) { ++ > (uint64_t)(pathsize - parsed_length)){ + needed = snprintf(p + buf_offset, + buffer_size == 0 + ? 0 +-- +1.9.3 + diff --git a/0003-Add-support-for-displaying-NVME-device-paths.patch b/0003-Add-support-for-displaying-NVME-device-paths.patch new file mode 100644 index 0000000..cf8e225 --- /dev/null +++ b/0003-Add-support-for-displaying-NVME-device-paths.patch @@ -0,0 +1,60 @@ +From a160ad75532ee551c4ac21372e2e9a11394f14d4 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 14 Apr 2014 16:49:12 -0400 +Subject: [PATCH 03/22] Add support for displaying NVME device paths. + +This doesn't actually let you /use/ them yet, but it does show them if +they're there. + +Signed-off-by: Peter Jones +--- + src/include/efi.h | 8 ++++++++ + src/lib/unparse_path.c | 6 ++++++ + 2 files changed, 14 insertions(+) + +diff --git a/src/include/efi.h b/src/include/efi.h +index fcc52ec..954b4a6 100644 +--- a/src/include/efi.h ++++ b/src/include/efi.h +@@ -225,6 +225,14 @@ typedef struct { + uint8_t type; + uint8_t subtype; + uint16_t length; ++ uint32_t namespace_id; ++ uint64_t ieee_extended_unique_identifier; ++} __attribute__((packed)) NVME_DEVICE_PATH; ++ ++typedef struct { ++ uint8_t type; ++ uint8_t subtype; ++ uint16_t length; + uint32_t reserved; + uint64_t node_guid; + uint64_t ioc_guid; +diff --git a/src/lib/unparse_path.c b/src/lib/unparse_path.c +index 27e1dbb..ffeda8e 100644 +--- a/src/lib/unparse_path.c ++++ b/src/lib/unparse_path.c +@@ -196,6 +196,7 @@ unparse_messaging_path(char *buffer, size_t buffer_size, EFI_DEVICE_PATH *path) + I2O_DEVICE_PATH *i2o = (I2O_DEVICE_PATH *)path; + IPv4_DEVICE_PATH *ipv4 = (IPv4_DEVICE_PATH *)path; + /* IPv6_DEVICE_PATH *ipv6 = (IPv6_DEVICE_PATH *)path; */ ++ NVME_DEVICE_PATH *nvme = (NVME_DEVICE_PATH *)path; + char a[16], b[16], c[16], d[16], e[16]; + + size_t needed; +@@ -304,6 +305,11 @@ unparse_messaging_path(char *buffer, size_t buffer_size, EFI_DEVICE_PATH *path) + get(a, sata->port), + get(b, sata->port_multiplier), + get(c, sata->lun)); ++ case 23: ++ return snprintf(buffer, buffer_size, ++ "NVME(%x,%lx)", ++ get(a, nvme->namespace_id), ++ get(b, nvme->ieee_extended_unique_identifier)); + default: + return unparse_raw(buffer, buffer_size, + (uint8_t *)path, path->length); +-- +1.9.3 + diff --git a/0004-Make-nvme-work-with-e-3.patch b/0004-Make-nvme-work-with-e-3.patch new file mode 100644 index 0000000..f0346a3 --- /dev/null +++ b/0004-Make-nvme-work-with-e-3.patch @@ -0,0 +1,188 @@ +From 47b2772a8e419ebadcf54182bfbd6170f7ab24f1 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 14 Apr 2014 17:19:57 -0400 +Subject: [PATCH 04/22] Make nvme work with "-e 3". + +This will force a long-form NVME device path. + +Signed-off-by: Peter Jones +--- + src/include/disk.h | 2 +- + src/include/scsi_ioctls.h | 1 + + src/lib/disk.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ + src/lib/efi.c | 29 +++++++++++++++++++++++++++-- + src/lib/scsi_ioctls.c | 7 +++++++ + 5 files changed, 81 insertions(+), 3 deletions(-) + +diff --git a/src/include/disk.h b/src/include/disk.h +index 720248c..3b3370d 100644 +--- a/src/include/disk.h ++++ b/src/include/disk.h +@@ -65,7 +65,7 @@ enum _bus_type {bus_type_unknown, isa, pci}; + enum _interface_type {interface_type_unknown, + ata, atapi, scsi, usb, + i1394, fibre, i2o, md, +- virtblk}; ++ virtblk, nvme}; + + + unsigned int lcm(unsigned int x, unsigned int y); +diff --git a/src/include/scsi_ioctls.h b/src/include/scsi_ioctls.h +index ba4c8bb..995cbbd 100644 +--- a/src/include/scsi_ioctls.h ++++ b/src/include/scsi_ioctls.h +@@ -38,6 +38,7 @@ typedef struct scsi_idlun { + } Scsi_Idlun; + + ++int get_nvme_ns_id(int fd, uint32_t *ns_id); + inline int get_scsi_idlun(int fd, Scsi_Idlun *idlun); + int get_scsi_pci(int fd, char *slot_name, size_t size); + int idlun_to_components (Scsi_Idlun *idlun, +diff --git a/src/lib/disk.c b/src/lib/disk.c +index 636b509..ad95fd4 100644 +--- a/src/lib/disk.c ++++ b/src/lib/disk.c +@@ -75,6 +75,45 @@ get_virtblk_major(void) + return cached; + } + ++static int ++get_nvme_major(void) ++{ ++ static int cached; ++ FILE *f; ++ char line[256]; ++ ++ if (cached != 0) { ++ return cached; ++ } ++ ++ cached = -1; ++ f = fopen("/proc/devices", "r"); ++ if (f == NULL) { ++ fprintf(stderr, "%s: opening /proc/devices: %s\n", __func__, ++ strerror(errno)); ++ return cached; ++ } ++ while (fgets(line, sizeof line, f) != NULL) { ++ size_t len = strlen(line); ++ int major, scanned; ++ ++ if (len == 0 || line[len - 1] != '\n') { ++ break; ++ } ++ if (sscanf(line, "%d %n", &major, &scanned) == 1 && ++ strcmp(line + scanned, "nvme\n") == 0) { ++ cached = major; ++ break; ++ } ++ } ++ fclose(f); ++ if (cached == -1) { ++ fprintf(stderr, "%s: nvme driver unavailable\n", ++ __func__); ++ } ++ return cached; ++} ++ + int + disk_info_from_fd(int fd, struct disk_info *info) + { +@@ -165,6 +204,12 @@ disk_info_from_fd(int fd, struct disk_info *info) + return 0; + } + ++ if (get_nvme_major() >= 0 && ++ (uint64_t)get_nvme_major() == info->major) { ++ info->interface_type = nvme; ++ return 0; ++ } ++ + if (get_virtblk_major() >= 0 && + (uint64_t)get_virtblk_major() == info->major) { + info->interface_type = virtblk; +diff --git a/src/lib/efi.c b/src/lib/efi.c +index 078bbc5..7b5e7fd 100644 +--- a/src/lib/efi.c ++++ b/src/lib/efi.c +@@ -352,6 +352,20 @@ make_pci_device_path(uint8_t bus, uint8_t device, uint8_t function, + } + + static ssize_t ++make_nvme_device_path(uint32_t ns_id, uint8_t *buf, size_t size) ++{ ++ NVME_DEVICE_PATH p; ++ memset(&p, 0, sizeof(p)); ++ p.type = 3; ++ p.subtype = 23; ++ p.length = sizeof(p); ++ p.namespace_id = ns_id; ++ if (size >= p.length) ++ memcpy(buf, &p, p.length); ++ return p.length; ++} ++ ++static ssize_t + make_scsi_device_path(uint16_t id, uint16_t lun, uint8_t *buf, size_t size) + { + SCSI_DEVICE_PATH p; +@@ -420,13 +434,18 @@ make_edd30_device_path(int fd, uint8_t *buf, size_t size) + int rc=0, interface_type; + unsigned char bus=0, device=0, function=0; + Scsi_Idlun idlun; ++ uint32_t ns_id; + unsigned char host=0, channel=0, id=0, lun=0; + size_t needed; + off_t buf_offset = 0; + + rc = disk_get_pci(fd, &interface_type, &bus, &device, &function); + if (rc) return 0; +- if (interface_type != virtblk) { ++ if (interface_type == nvme) { ++ rc = get_nvme_ns_id(fd, &ns_id); ++ if (rc) ++ return 0; ++ } else if (interface_type != virtblk) { + memset(&idlun, 0, sizeof(idlun)); + rc = get_scsi_idlun(fd, &idlun); + if (rc) return 0; +@@ -444,7 +463,13 @@ make_edd30_device_path(int fd, uint8_t *buf, size_t size) + return needed; + buf_offset += needed; + +- if (interface_type != virtblk) { ++ if (interface_type == nvme) { ++ needed = make_nvme_device_path(ns_id, buf + buf_offset, ++ size == 0 ? 0 : size - buf_offset); ++ if (needed < 0) ++ return needed; ++ buf_offset += needed; ++ } else if (interface_type != virtblk) { + needed = make_scsi_device_path(id, lun, buf + buf_offset, + size == 0 ? 0 : size - buf_offset); + if (needed < 0) +diff --git a/src/lib/scsi_ioctls.c b/src/lib/scsi_ioctls.c +index 615b48f..e013a6f 100644 +--- a/src/lib/scsi_ioctls.c ++++ b/src/lib/scsi_ioctls.c +@@ -24,9 +24,16 @@ + #include + #include + #include ++#include + #include "scsi_ioctls.h" + + int ++get_nvme_ns_id(int fd, uint32_t *ns_id) ++{ ++ return ioctl(fd, NVME_IOCTL_ID, &ns_id); ++} ++ ++int + idlun_to_components (Scsi_Idlun *idlun, + unsigned char *host, + unsigned char *channel, +-- +1.9.3 + diff --git a/0005-Remove-bogus-test-for-optional-data-length-bounds.patch b/0005-Remove-bogus-test-for-optional-data-length-bounds.patch new file mode 100644 index 0000000..328471e --- /dev/null +++ b/0005-Remove-bogus-test-for-optional-data-length-bounds.patch @@ -0,0 +1,34 @@ +From cadc90a7efc977a8bfb835a5ade5333e0800648a Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 29 Apr 2014 11:31:15 -0400 +Subject: [PATCH 05/22] Remove bogus test for optional data length bounds. + +We're getting the size from subtracting from the actual limit; it can't +be over the limit, and it's not related to the variable we're comparing +it to anyway. + +Not sure how I came up with that logic, but it sure is wrong. + +Signed-off-by: Peter Jones +--- + src/efibootmgr/efibootmgr.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index 1bc48b2..e2ec5cd 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -693,10 +693,6 @@ show_boot_vars() + printf("\n"); + continue; + } +- if (optional_data_len > (uint64_t)(path->length + 4)) { +- printf("(invalid optional data length)\n"); +- continue; +- } + + rc = unparse_raw_text(text_path, text_path_len, + ((uint8_t *)path) +-- +1.9.3 + diff --git a/0006-Only-free-hard-drive-signatures-if-we-ve-allocated-t.patch b/0006-Only-free-hard-drive-signatures-if-we-ve-allocated-t.patch new file mode 100644 index 0000000..ceab451 --- /dev/null +++ b/0006-Only-free-hard-drive-signatures-if-we-ve-allocated-t.patch @@ -0,0 +1,28 @@ +From 2fbeee2c3f7e8714610cb9fcd2f6d3d7daa62767 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 5 May 2014 16:09:09 -0400 +Subject: [PATCH 06/22] Only free hard drive signatures if we've allocated + them. + +Signed-off-by: Peter Jones +--- + src/lib/unparse_path.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/lib/unparse_path.c b/src/lib/unparse_path.c +index ffeda8e..030e7c8 100644 +--- a/src/lib/unparse_path.c ++++ b/src/lib/unparse_path.c +@@ -352,7 +352,8 @@ unparse_media_hard_drive_path(char *buffer, size_t buffer_size, + get(b, hd->start), + get(c, hd->size), + sig); +- free(sig); ++ if (hd->signature_type == 0x02) ++ free(sig); + return rc; + } + +-- +1.9.3 + diff --git a/0007-We-don-t-actually-have-docbook-hooked-up-to-the-buil.patch b/0007-We-don-t-actually-have-docbook-hooked-up-to-the-buil.patch new file mode 100644 index 0000000..99f0aea --- /dev/null +++ b/0007-We-don-t-actually-have-docbook-hooked-up-to-the-buil.patch @@ -0,0 +1,486 @@ +From 1f39dc1100b58db9ffa6c5486d40521fddb064dd Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 16 Jun 2014 14:26:05 -0400 +Subject: [PATCH 07/22] We don't actually have docbook hooked up to the builds, + so ditch it. + +Frankly I'm more comfortable maintaining groff anyway, but right now +they just get out of sync all the time. + +Signed-off-by: Peter Jones +--- + src/man/man8/efibootmgr.8.docbook | 462 -------------------------------------- + 1 file changed, 462 deletions(-) + delete mode 100644 src/man/man8/efibootmgr.8.docbook + +diff --git a/src/man/man8/efibootmgr.8.docbook b/src/man/man8/efibootmgr.8.docbook +deleted file mode 100644 +index 3438d56..0000000 +--- a/src/man/man8/efibootmgr.8.docbook ++++ /dev/null +@@ -1,462 +0,0 @@ +-dannf@debian.org, +- and was based on an example constructed by Colin Watson +- cjwatson@debian.org, which was based on a man page template +- provided by Tom Christiansen tchrist@jhereg.perl.com +- and a DocBook man page example by Craig Small +- csmall@debian.org. +- +- The content was mostly taken from the efibootmgr README file in the +- Debian package, which was written by Matt Domsch +- Matt_Domsch@dell.com. +- --> +- +- +- dann"> +- frazier"> +- +- 2005-08-11"> +- +- 8"> +- dannf@debian.org"> +- +- EFIBOOTMGR"> +- +-]> +- +- +- +-
+- &manemail; +-
+- +- &manfirstname; +- &mansurname; +- +- +- 2002, 2003, 2004 +- &manusername; +- +- &mandate; +-
+- +- &manucpackage; +- +- &mansection; +- +- +- &manpackage; +- +- manipulate the EFI Boot Manager +- +- +- +- &manpackage; +- +- -a +- -A +- -b XXXX +- -B XXXX +- -c +- -d DISK +- -e 1|3|-1 +- -E NUM +- -g +- -H XXXX +- -i NAME +- -l NAME +- -L LABEL +- -n XXXX +- -N +- -o XXXX,YYYY,ZZZZ +- -O +- -p PART +- -q +- -t seconds +- -T +- -u +- -U XXXX +- -v +- -V +- -w +- -@ file +- +- +- +- DESCRIPTION +- +- &manpackage; is a userspace application used to +- modify the Intel Extensible Firmware Interface (EFI) Boot Manager. This +- application can create and destroy boot entries, change the boot order, +- change the next running boot option, and more. +- +- +- Details on the EFI Boot Manager are available from the EFI +- Specification, v1.02 or later, available from: +- +- +- +- +- +- &manpackage; requires that the kernel support access to EFI +- non-volatile variables (through +- /proc/efi/vars on 2.4 kernels, +- /sys/firmware/efi/vars on 2.6 kernels). +- modprobe efivars should do the trick. +- +- +- +- +- OPTIONS +- +- The following is a list of options accepted by &manpackage;: +- +- +- +- | +- +- Sets bootnum active +- +- +- +- | +- +- Sets bootnum inactive +- +- +- +- | XXXX +- +- Modify BootXXXX (hex) +- +- +- +- | +- +- Delete bootnum (hex) +- +- +- +- | +- +- Create new variable bootnum and add to bootorder +- +- +- +- | DISK +- +- The disk containing the loader (defaults to +- /dev/sda) +- +- +- +- | 1|3|-1 +- +- Force EDD 1.0 or 3.0 creation variables, or guess. +- +- +- +- | NUM +- +- EDD 1.0 device number (defaults to 0x80) +- +- +- +- | +- +- Force disk with invalid PMBR to be treated as GPT +- +- +- +- | XXXX +- +- set the ACPI HID (used with ) +- +- +- +- | NAME +- +- create a netboot entry for the named interface +- +- +- +- | NAME +- +- Specify a loader (defaults to \\elilo.efi) +- +- +- +- +- | LABEL +- +- Boot manager display label (defaults to "Linux") +- +- +- +- | XXXX +- +- Set BootNext to XXXX (hex) +- +- +- +- | +- +- Delete BootNext +- +- +- +- | XXXX,YYYY,ZZZZ +- +- Explicitly set BootOrder (hex) +- +- +- +- | +- +- Delete BootOrder +- +- +- +- | PART +- +- Partition number containing the bootloader (defaults to 1) +- +- +- +- | +- +- Quiet mode - supresses output. +- +- +- +- filename +- +- Don't write to NVRAM, write to filename. +- +- +- +- | seconds +- +- Boot Manager timeout, in seconds. +- +- +- +- | +- +- Delete Timeout variable. +- +- +- +- | | +- +- pass extra command line arguments as UCS-2 (default is +- ASCII) +- +- +- +- | XXXX +- +- set the ACPI UID (used with ) +- +- +- +- | +- +- Verbose mode - prints additional information +- +- +- +- | +- +- Just print version string and exit. +- +- +- +- | +- +- write unique signature to the MBR if needed +- +- +- +- | +- +- +- +- append extra variable args from file (use - to read +- from stdin). Data in file is appended as command line +- arguments to the boot loader command, with no modification to +- the data, so you can pass any binary or text data necessary. +- +- +- +- +- +- +- +- EXAMPLES +- +- +- +- Displaying the current settings (must be root). +- +- +- +- [root@localhost ~]# efibootmgr +- BootCurrent: 0004 +- BootNext: 0003 +- BootOrder: 0004,0000,0001,0002,0003 +- Timeout: 30 seconds +- Boot0000* Diskette Drive(device:0) +- Boot0001* CD-ROM Drive(device:FF) +- Boot0002* Hard Drive(Device:80)/HD(Part1,Sig00112233) +- Boot0003* PXE Boot: MAC(00D0B7C15D91) +- Boot0004* Linux +- +- +- This shows: +- +- +- BootCurrent - the boot entry used to start the currently +- running system +- +- +- +- BootOrder - the boot order as would appear in the boot manager. +- The boot manager tries to boot the first active entry in this +- list. If unsuccessful, it tries the next entry, and so on. +- +- +- +- +- BootNext - the boot entry which is scheduled to be run on next +- boot. This supercedes BootOrder for one boot only, and is +- deleted by the boot manager after first use. This allows you +- to change the next boot behavior without changing BootOrder. +- +- +- +- +- Timeout - the time in seconds between when the boot +- manager appears on the screen until when it +- automatically chooses the startup value from BootNext +- or BootOrder. +- +- +- +- +- Five boot entries (0000 - 0004), along with the active/inactive +- flag (* means active) and the name displayed on the screen. +- +- +- +- +- +- +- +- Creating a new boot option +- +- An OS installer would call &manpackage; -c. +- This assumes that /boot/efi is your EFI System +- Partition, and is mounted at /dev/sda1. This +- creates a new boot option, called "Linux", and puts it at the top of +- the boot order list. Options may be passed to modify the default +- behavior. The default OS Loader is elilo.efi. +- +- +- +- +- +- Changing the Boot Order +- +- Assuming the configuration in Example #1, +- &manpackage; -o 3,4 could be called to specify +- PXE boot first, then Linux boot. +- +- +- +- +- +- Changing the Boot Order for the Next Boot Only +- +- Assuming the configuration in Example #1, +- &manpackage; -n 4 could be called to specify +- that the Linux entry be taken on next boot. +- +- +- +- +- +- Deleting a boot option +- +- Assuming the configuration in Example #1, +- &manpackage; -b 4 -B could be called to delete +- entry 4 and remove it from the BootOrder. +- +- +- +- +- +- Creating network boot entries +- +- A system administrator wants to create a boot option to network +- boot (PXE). Unfortunately, this requires knowing a little more +- information about your system than can be easily found by +- efibootmgr, so you've got to pass additional information - the ACPI +- HID and UID values. These can generally be found by using the EFI +- Boot Manager (in the EFI environment) to create a network boot +- entry, then using efibootmgr to print it verbosely. Here's one example: +- +- Boot003* Acpi(PNP0A03,0)/PCI(5|0)/Mac(00D0B7F9F510) \ +- ACPI(a0341d0,0)PCI(0,5)MAC(00d0b7f9f510,0) +- +- In this case, the ACPI HID is "0A0341d0" and the UID is "0". +- For the zx2000 gigE, the HID is "222F" and the UID is "500". +- For the rx2000 gigE, the HID is "0002" and the UID is "100". +- +- You create the boot entry with: +- efibootmgr -c -i eth0 -H 222F -U 500 -L netboot +- +- +- +- +- +- +- +- BUGS +- +- Please direct any bugs, features, patches, etc. to Peter Jones: +- . +- +- +- +- +- AUTHOR +- This man page was generated by dann frazier &manemail; for the +- Debian GNU/Linux operating system, but may be used by others. +- +- +- +- SEE ALSO +- +- elilo(1) +- +-
+- +- +-- +1.9.3 + diff --git a/0008-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch b/0008-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch new file mode 100644 index 0000000..21a1fe5 --- /dev/null +++ b/0008-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch @@ -0,0 +1,65 @@ +From 15a46a8023c9925a78ddbacc8534af17db611edb Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 17 Jun 2014 14:05:31 -0400 +Subject: [PATCH 08/22] Mitigate apple setting invalid attribute bits in boot + variables. + +Signed-off-by: Peter Jones +--- + src/efibootmgr/efibootmgr.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index e2ec5cd..f596d99 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -115,6 +115,13 @@ read_vars(char **namelist, + &entry->attributes); + if (rc < 0) + goto err; ++ ++ /* latest apple firmware sets high bit which appears ++ * invalid to the linux kernel if we write it back so ++ * lets zero it out if it is set since it would be ++ * invalid to set it anyway */ ++ entry->attributes = entry->attributes & ~(1 << 31); ++ + entry->name = namelist[i]; + list_add_tail(&entry->list, head); + } +@@ -299,6 +306,11 @@ read_boot_order(efi_variable_t **boot_order) + free(new); + *boot_order = NULL; + } ++ ++ /* latest apple firmware sets high bit which appears invalid ++ * to the linux kernel if we write it back so lets zero it out ++ * if it is set since it would be invalid to set it anyway */ ++ bo->attributes = bo->attributes & ~(1 << 31); + return rc; + } + +@@ -404,7 +416,7 @@ read_boot_u16(const char *name) + static int + set_boot_u16(const char *name, uint16_t num) + { +- return efi_set_variable(EFI_GLOBAL_GUID, name, (uint8_t *)&num, ++ return efi_set_variable(EFI_GLOBAL_GUID, name, (uint8_t *)&num, + sizeof (num), EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS); +@@ -577,6 +589,11 @@ construct_boot_order(char *bootorder, int keep, + return 0; + } + ++ /* latest apple firmware sets high bit which appears invalid ++ * to the linux kernel if we write it back so lets zero it out ++ * if it is set since it would be invalid to set it anyway */ ++ bo.attributes = bo.attributes & ~(1 << 31); ++ + size_t new_data_size = data_size + bo.data_size; + uint16_t *new_data = calloc(1, new_data_size); + if (!new_data) +-- +1.9.3 + diff --git a/0009-Remove-unused-function-var_num_from_name.patch b/0009-Remove-unused-function-var_num_from_name.patch new file mode 100644 index 0000000..d9082f7 --- /dev/null +++ b/0009-Remove-unused-function-var_num_from_name.patch @@ -0,0 +1,30 @@ +From 517edfe7905b6294b304f0a196e852f39b772f0f Mon Sep 17 00:00:00 2001 +From: Daniel Jared Dominguez +Date: Mon, 7 Jul 2014 13:58:56 -0500 +Subject: [PATCH 09/22] Remove unused function var_num_from_name. + +Signed-off-by: Daniel Jared Dominguez +--- + src/efibootmgr/efibootmgr.c | 6 ------ + 1 file changed, 6 deletions(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index f596d99..03613ab 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -72,12 +72,6 @@ static LIST_HEAD(boot_entry_list); + static LIST_HEAD(blk_list); + efibootmgr_opt_t opts; + +-static inline void +-var_num_from_name(const char *pattern, char *name, uint16_t *num) +-{ +- sscanf(name, pattern, num); +-} +- + static void + free_vars(list_t *head) + { +-- +1.9.3 + diff --git a/0010-Fix-typo-in-compare-function.patch b/0010-Fix-typo-in-compare-function.patch new file mode 100644 index 0000000..d6f37a9 --- /dev/null +++ b/0010-Fix-typo-in-compare-function.patch @@ -0,0 +1,26 @@ +From 78920cfc3828389cb61de4ca06bf70d6fa959c0d Mon Sep 17 00:00:00 2001 +From: Daniel Jared Dominguez +Date: Mon, 7 Jul 2014 14:02:22 -0500 +Subject: [PATCH 10/22] Fix typo in compare function. + +Signed-off-by: Daniel Jared Dominguez +--- + src/efibootmgr/efibootmgr.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index 03613ab..a59d071 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -149,7 +149,7 @@ compare(const void *a, const void *b) + memcpy(&n2, b, sizeof(n2)); + if (n1 < n2) rc = -1; + if (n1 == n2) rc = 0; +- if (n2 > n2) rc = 1; ++ if (n1 > n2) rc = 1; + return rc; + } + +-- +1.9.3 + diff --git a/0011-data_size-in-construct_boot_order-set_boot_order-is-.patch b/0011-data_size-in-construct_boot_order-set_boot_order-is-.patch new file mode 100644 index 0000000..0333f41 --- /dev/null +++ b/0011-data_size-in-construct_boot_order-set_boot_order-is-.patch @@ -0,0 +1,36 @@ +From a16e5dce59d8cf50b1262e3d2358b556095a4e96 Mon Sep 17 00:00:00 2001 +From: Daniel Jared Dominguez +Date: Mon, 7 Jul 2014 14:09:15 -0500 +Subject: [PATCH 11/22] data_size in construct_boot_order/set_boot_order is of + type size_t, so fix a couple of comparisons involving it. + +Signed-off-by: Daniel Jared Dominguez +--- + src/efibootmgr/efibootmgr.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index a59d071..ba5f54f 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -566,7 +566,7 @@ construct_boot_order(char *bootorder, int keep, + size_t data_size = 0; + + rc = parse_boot_order(bootorder, (uint16_t **)&data, &data_size); +- if (rc < 0 || data_size <= 0) ++ if (rc < 0 || data_size == 0) + return rc; + + if (!keep) { +@@ -631,7 +631,7 @@ set_boot_order(int keep_old_entries) + + rc = construct_boot_order(opts.bootorder, keep_old_entries, + (uint16_t **)&data, &data_size); +- if (rc < 0 || data_size < 0) ++ if (rc < 0 || data_size == 0) + return rc; + + return efi_set_variable(EFI_GLOBAL_GUID, "BootOrder", data, data_size, +-- +1.9.3 + diff --git a/0012-Variable-needed-should-be-of-type-ssize_t-as-that-s-.patch b/0012-Variable-needed-should-be-of-type-ssize_t-as-that-s-.patch new file mode 100644 index 0000000..7844c6d --- /dev/null +++ b/0012-Variable-needed-should-be-of-type-ssize_t-as-that-s-.patch @@ -0,0 +1,113 @@ +From fd1ccafe0b9b33e460947487858371daec26f9a9 Mon Sep 17 00:00:00 2001 +From: Daniel Jared Dominguez +Date: Mon, 7 Jul 2014 14:18:27 -0500 +Subject: [PATCH 12/22] Variable "needed" should be of type ssize_t as that's + how it's used. + +Signed-off-by: Daniel Jared Dominguez +--- + src/lib/efi.c | 8 ++++---- + src/lib/unparse_path.c | 12 ++++++------ + 2 files changed, 10 insertions(+), 10 deletions(-) + +diff --git a/src/lib/efi.c b/src/lib/efi.c +index 7b5e7fd..74df42a 100644 +--- a/src/lib/efi.c ++++ b/src/lib/efi.c +@@ -309,7 +309,7 @@ make_pci_device_path(uint8_t bus, uint8_t device, uint8_t function, + struct pci_access *pacc; + struct list_head *pos, *n; + LIST_HEAD(pci_parent_list); +- size_t needed; ++ ssize_t needed; + off_t buf_offset = 0; + + pacc = pci_alloc(); +@@ -436,7 +436,7 @@ make_edd30_device_path(int fd, uint8_t *buf, size_t size) + Scsi_Idlun idlun; + uint32_t ns_id; + unsigned char host=0, channel=0, id=0, lun=0; +- size_t needed; ++ ssize_t needed; + off_t buf_offset = 0; + + rc = disk_get_pci(fd, &interface_type, &bus, &device, &function); +@@ -508,7 +508,7 @@ make_disk_load_option(char *disk, uint8_t *buf, size_t size) + uint8_t mbr_type=0, signature_type=0; + uint64_t part_start=0, part_size=0; + efi_char16_t *os_loader_path; +- size_t needed = 0; ++ ssize_t needed = 0; + off_t buf_offset = 0; + + memset(signature, 0, sizeof(signature)); +@@ -615,7 +615,7 @@ make_net_load_option(char *iface, uint8_t *buf, size_t size) + unsigned char bus, slot, func; + struct ifreq ifr; + struct ethtool_drvinfo drvinfo; +- size_t needed; ++ ssize_t needed; + off_t buf_offset; + + memset(&ifr, 0, sizeof(ifr)); +diff --git a/src/lib/unparse_path.c b/src/lib/unparse_path.c +index 030e7c8..c39a49a 100644 +--- a/src/lib/unparse_path.c ++++ b/src/lib/unparse_path.c +@@ -43,7 +43,7 @@ unparse_raw(char *buffer, size_t buffer_size, uint8_t *p, uint64_t length) + uint64_t i; + char a[1]; + +- size_t needed; ++ ssize_t needed; + off_t buf_offset = 0; + + for (i=0; i < length; i++) { +@@ -62,7 +62,7 @@ unparse_raw_text(char *buffer, size_t buffer_size, uint8_t *p, uint64_t length) + { + uint64_t i; unsigned char c; + +- size_t needed; ++ ssize_t needed; + size_t buf_offset = 0; + + for (i=0; i < length; i++) { +@@ -116,7 +116,7 @@ unparse_vendor_path(char *buffer, size_t buffer_size, char *prefix, + unsigned char *q = (uint8_t *)path + 20; + int rc; + +- size_t needed; ++ ssize_t needed; + off_t buf_offset = 0; + + rc = efi_guid_to_str(&path->vendor_guid, &text_guid); +@@ -199,7 +199,7 @@ unparse_messaging_path(char *buffer, size_t buffer_size, EFI_DEVICE_PATH *path) + NVME_DEVICE_PATH *nvme = (NVME_DEVICE_PATH *)path; + char a[16], b[16], c[16], d[16], e[16]; + +- size_t needed; ++ ssize_t needed; + off_t buf_offset = 0; + + switch (path->subtype) { +@@ -417,7 +417,7 @@ unparse_bios_path(char *buffer, size_t buffer_size, EFI_DEVICE_PATH *path) + unsigned char *q = (uint8_t *)path + 8; + char a[16], b[16]; + +- size_t needed; ++ ssize_t needed; + off_t buf_offset = 0; + + needed = snprintf(p + buf_offset, +@@ -451,7 +451,7 @@ unparse_path(char *buffer, size_t buffer_size, + { + uint16_t parsed_length = 0; + char *p = buffer; +- size_t needed; ++ ssize_t needed; + off_t buf_offset = 0; + int exit_now = 0; + +-- +1.9.3 + diff --git a/0013-Clang-uses-C99-semantics-by-default-for-inline-keywo.patch b/0013-Clang-uses-C99-semantics-by-default-for-inline-keywo.patch new file mode 100644 index 0000000..fdbf987 --- /dev/null +++ b/0013-Clang-uses-C99-semantics-by-default-for-inline-keywo.patch @@ -0,0 +1,42 @@ +From 0d92b6b342959ce1b7528087f066bdada2e4aefb Mon Sep 17 00:00:00 2001 +From: Daniel Jared Dominguez +Date: Mon, 7 Jul 2014 20:50:50 -0500 +Subject: [PATCH 13/22] Clang uses C99 semantics by default for inline keyword. + +It's most straightforward not to state get_scsi_idlun is inline. + +Signed-off-by: Daniel Jared Dominguez +--- + src/include/scsi_ioctls.h | 2 +- + src/lib/scsi_ioctls.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/include/scsi_ioctls.h b/src/include/scsi_ioctls.h +index 995cbbd..331bb14 100644 +--- a/src/include/scsi_ioctls.h ++++ b/src/include/scsi_ioctls.h +@@ -39,7 +39,7 @@ typedef struct scsi_idlun { + + + int get_nvme_ns_id(int fd, uint32_t *ns_id); +-inline int get_scsi_idlun(int fd, Scsi_Idlun *idlun); ++int get_scsi_idlun(int fd, Scsi_Idlun *idlun); + int get_scsi_pci(int fd, char *slot_name, size_t size); + int idlun_to_components (Scsi_Idlun *idlun, + unsigned char *host, +diff --git a/src/lib/scsi_ioctls.c b/src/lib/scsi_ioctls.c +index e013a6f..c04f12a 100644 +--- a/src/lib/scsi_ioctls.c ++++ b/src/lib/scsi_ioctls.c +@@ -50,7 +50,7 @@ idlun_to_components (Scsi_Idlun *idlun, + } + + +-inline int ++int + get_scsi_idlun(int fd, Scsi_Idlun *idlun) + { + return ioctl(fd, SCSI_IOCTL_GET_IDLUN, idlun); +-- +1.9.3 + diff --git a/0014-Use-PRIx64-in-nvme-parsing.patch b/0014-Use-PRIx64-in-nvme-parsing.patch new file mode 100644 index 0000000..7fe3392 --- /dev/null +++ b/0014-Use-PRIx64-in-nvme-parsing.patch @@ -0,0 +1,29 @@ +From ea6dccaed60caf11006f8a816113e4b0d39deefb Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 22 Jul 2014 10:11:39 -0400 +Subject: [PATCH 14/22] Use PRIx64 in nvme parsing. + +This should fix https://github.com/vathpela/efibootmgr/issues/6 , though +I don't know if it'll actually make nvme work. + +Signed-off-by: Peter Jones +--- + src/lib/unparse_path.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/lib/unparse_path.c b/src/lib/unparse_path.c +index c39a49a..b164758 100644 +--- a/src/lib/unparse_path.c ++++ b/src/lib/unparse_path.c +@@ -307,7 +307,7 @@ unparse_messaging_path(char *buffer, size_t buffer_size, EFI_DEVICE_PATH *path) + get(c, sata->lun)); + case 23: + return snprintf(buffer, buffer_size, +- "NVME(%x,%lx)", ++ "NVME(%x,%" PRIx64 ")", + get(a, nvme->namespace_id), + get(b, nvme->ieee_extended_unique_identifier)); + default: +-- +1.9.3 + diff --git a/0015-Compare-should-respect-the-size-of-the-data-it-compa.patch b/0015-Compare-should-respect-the-size-of-the-data-it-compa.patch new file mode 100644 index 0000000..65f1a5c --- /dev/null +++ b/0015-Compare-should-respect-the-size-of-the-data-it-compa.patch @@ -0,0 +1,26 @@ +From 895b702ac316a618f32fbdd74a6767277d48284a Mon Sep 17 00:00:00 2001 +From: groxxda +Date: Thu, 31 Jul 2014 18:37:37 +0200 +Subject: [PATCH 15/22] Compare should respect the size of the data it + compares. + +--- + src/efibootmgr/efibootmgr.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index ba5f54f..6b03c84 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -144,7 +144,7 @@ static int + compare(const void *a, const void *b) + { + int rc = -1; +- uint32_t n1, n2; ++ uint16_t n1, n2; + memcpy(&n1, a, sizeof(n1)); + memcpy(&n2, b, sizeof(n2)); + if (n1 < n2) rc = -1; +-- +1.9.3 + diff --git a/0016-Don-t-pass-around-a-format-specifier-when-we-don-t-n.patch b/0016-Don-t-pass-around-a-format-specifier-when-we-don-t-n.patch new file mode 100644 index 0000000..3bddb50 --- /dev/null +++ b/0016-Don-t-pass-around-a-format-specifier-when-we-don-t-n.patch @@ -0,0 +1,51 @@ +From 099e1107489a24e019e8900f1c44da646945c343 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 1 Aug 2014 04:56:18 -0400 +Subject: [PATCH 16/22] Don't pass around a format specifier when we don't need + to. + +Current code has the format specifier in a function that doesn't +otherwise know about the format, and passes it in to a function that +does. + +And it's always been like this. + +Signed-off-by: Peter Jones +--- + src/efibootmgr/efibootmgr.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index 6b03c84..0d7224a 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -452,7 +452,7 @@ delete_boot_var(uint16_t num) + + + static void +-set_var_nums(const char *pattern, list_t *list) ++set_var_nums(list_t *list) + { + list_t *pos; + efi_variable_t *var; +@@ -462,7 +462,7 @@ set_var_nums(const char *pattern, list_t *list) + + list_for_each(pos, list) { + var = list_entry(pos, efi_variable_t, list); +- rc = sscanf(var->name, pattern, &num); ++ rc = sscanf(var->name, "Boot%04X-%*s", &num); + if (rc == 1) { + var->num = num; + name = var->name; /* shorter name */ +@@ -1105,7 +1105,7 @@ main(int argc, char **argv) + + read_boot_var_names(&boot_names); + read_vars(boot_names, &boot_entry_list); +- set_var_nums("Boot%04X-%*s", &boot_entry_list); ++ set_var_nums(&boot_entry_list); + + if (opts.delete_boot) { + if (opts.bootnum == -1) { +-- +1.9.3 + diff --git a/0017-Don-t-leak-memory-in-remove_from_boot_order.patch b/0017-Don-t-leak-memory-in-remove_from_boot_order.patch new file mode 100644 index 0000000..0d29135 --- /dev/null +++ b/0017-Don-t-leak-memory-in-remove_from_boot_order.patch @@ -0,0 +1,29 @@ +From 1f2c2f35d34c4da42afa803fd16687b8bed27162 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 1 Aug 2014 05:37:05 -0400 +Subject: [PATCH 17/22] Don't leak memory in remove_from_boot_order() + +Signed-off-by: Peter Jones +--- + src/efibootmgr/efibootmgr.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index 0d7224a..d3448da 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -381,8 +381,10 @@ remove_from_boot_order(uint16_t num) + boot_order->data = (uint8_t *)new_data; + boot_order->data_size = new_data_size; + efi_del_variable(EFI_GLOBAL_GUID, "BootOrder"); +- return efi_set_variable(EFI_GLOBAL_GUID, "BootOrder", boot_order->data, ++ rc = efi_set_variable(EFI_GLOBAL_GUID, "BootOrder", boot_order->data, + boot_order->data_size, boot_order->attributes); ++ free(boot_order->data); ++ return rc; + } + + static int +-- +1.9.3 + diff --git a/0018-Fix-some-leaked-memory-that-shows-up-in-valgrind.patch b/0018-Fix-some-leaked-memory-that-shows-up-in-valgrind.patch new file mode 100644 index 0000000..0b473f2 --- /dev/null +++ b/0018-Fix-some-leaked-memory-that-shows-up-in-valgrind.patch @@ -0,0 +1,96 @@ +From 1f4bc63d8cc81747bf2685256c384e17450ca9c8 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 1 Aug 2014 08:03:49 -0400 +Subject: [PATCH 18/22] Fix some leaked memory that shows up in valgrind. + +Signed-off-by: Peter Jones +--- + src/efibootmgr/efibootmgr.c | 29 ++++++++++++++++++++++------- + 1 file changed, 22 insertions(+), 7 deletions(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index d3448da..c8cb6fd 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -44,6 +44,7 @@ + #include + #include + #include ++#include + #include "list.h" + #include "efi.h" + #include "efichar.h" +@@ -283,7 +284,7 @@ static int + read_boot_order(efi_variable_t **boot_order) + { + int rc; +- efi_variable_t *new = NULL, *bo; ++ efi_variable_t *new = NULL, *bo = NULL; + + if (*boot_order == NULL) { + new = calloc(1, sizeof (**boot_order)); +@@ -299,12 +300,15 @@ read_boot_order(efi_variable_t **boot_order) + if (rc < 0 && new != NULL) { + free(new); + *boot_order = NULL; ++ bo = NULL; + } + +- /* latest apple firmware sets high bit which appears invalid +- * to the linux kernel if we write it back so lets zero it out +- * if it is set since it would be invalid to set it anyway */ +- bo->attributes = bo->attributes & ~(1 << 31); ++ if (bo) { ++ /* latest apple firmware sets high bit which appears invalid ++ * to the linux kernel if we write it back so lets zero it out ++ * if it is set since it would be invalid to set it anyway */ ++ bo->attributes = bo->attributes & ~(1 << 31); ++ } + return rc; + } + +@@ -401,11 +405,15 @@ read_boot_u16(const char *name) + if (rc < 0) + return rc; + if (data_size != 2) { ++ if (data != NULL) ++ free(data); + errno = EINVAL; + return -1; + } + + rc = data[0]; ++ if (data != NULL) ++ free(data); + return rc; + } + +@@ -746,6 +754,11 @@ show_boot_order() + + rc = read_boot_order(&boot_order); + ++ if (rc < 0 && errno == ENOENT) { ++ boot_order = calloc(1, sizeof (*boot_order)); ++ rc = boot_order ? 0 : -1; ++ } ++ + if (rc < 0) { + perror("show_boot_order()"); + return; +@@ -755,9 +768,11 @@ show_boot_order() + boot order. First add our entry, then copy the old array. + */ + data = (uint16_t *)boot_order->data; +- if (boot_order->data_size) ++ if (boot_order->data_size) { + unparse_boot_order(data, boot_order->data_size / sizeof(uint16_t)); +- ++ free(boot_order->data); ++ } ++ free(boot_order); + } + + static int +-- +1.9.3 + diff --git a/0019-Add-the-ability-to-clean-up-duplicates-in-BootOrder.patch b/0019-Add-the-ability-to-clean-up-duplicates-in-BootOrder.patch new file mode 100644 index 0000000..cc08abf --- /dev/null +++ b/0019-Add-the-ability-to-clean-up-duplicates-in-BootOrder.patch @@ -0,0 +1,164 @@ +From 683831290c50f64d8964bef2a5d8d0092b32ca15 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 1 Aug 2014 08:23:34 -0400 +Subject: [PATCH 19/22] Add the ability to clean up duplicates in BootOrder + +This adds -D (--remove-dups), which iterates BootOrder and keeps only +the first of any number it finds. Duplicate entries can happen as a +result of an interaction between fallback.efi and some system firmware, +and this option provides an easy workaround to fix it. + +Resolves: rhbz#1097396 + +Signed-off-by: Peter Jones +--- + src/efibootmgr/efibootmgr.c | 61 ++++++++++++++++++++++++++++++++++++++++++++- + src/include/efibootmgr.h | 1 + + src/man/man8/efibootmgr.8 | 5 +++- + 3 files changed, 65 insertions(+), 2 deletions(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index c8cb6fd..40be505 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -347,6 +347,57 @@ add_to_boot_order(uint16_t num) + } + + static int ++remove_dupes_from_boot_order(void) ++{ ++ efi_variable_t *boot_order = NULL; ++ uint64_t new_data_size; ++ uint16_t *new_data, *old_data; ++ unsigned int old_i,new_i; ++ int rc; ++ ++ rc = read_boot_order(&boot_order); ++ if (rc < 0) ++ return rc; ++ ++ old_data = (uint16_t *)(boot_order->data); ++ /* Start with the same size */ ++ new_data_size = boot_order->data_size; ++ new_data = malloc(new_data_size); ++ if (!new_data) ++ return -1; ++ ++ unsigned int old_max = boot_order->data_size / sizeof(*new_data); ++ for (old_i = 0, new_i = 0; old_i < old_max; old_i++) { ++ int copies = 0; ++ unsigned int j; ++ for (j = 0; j < new_i; j++) { ++ if (new_data[j] == old_data[old_i]) { ++ copies++; ++ break; ++ } ++ } ++ if (copies == 0) { ++ /* Copy this value */ ++ new_data[new_i] = old_data[old_i]; ++ new_i++; ++ } ++ } ++ /* Adjust the size if we didn't copy everything. */ ++ new_data_size = sizeof(new_data[0]) * new_i; ++ ++ /* Now new_data has what we need */ ++ free(boot_order->data); ++ boot_order->data = (uint8_t *)new_data; ++ boot_order->data_size = new_data_size; ++ efi_del_variable(EFI_GLOBAL_GUID, "BootOrder"); ++ rc = efi_set_variable(EFI_GLOBAL_GUID, "BootOrder", boot_order->data, ++ boot_order->data_size, boot_order->attributes); ++ free(boot_order->data); ++ free(boot_order); ++ return rc; ++} ++ ++static int + remove_from_boot_order(uint16_t num) + { + efi_variable_t *boot_order = NULL; +@@ -835,6 +886,7 @@ usage() + printf("\t-b | --bootnum XXXX modify BootXXXX (hex)\n"); + printf("\t-B | --delete-bootnum delete bootnum (hex)\n"); + printf("\t-c | --create create new variable bootnum and add to bootorder\n"); ++ printf("\t-D | --remove-dups remove duplicate values from BootOrder\n"); + printf("\t-d | --disk disk (defaults to /dev/sda) containing loader\n"); + printf("\t-e | --edd [1|3|-1] force EDD 1.0 or 3.0 creation variables, or guess\n"); + printf("\t-E | --device num EDD 1.0 device number (defaults to 0x80)\n"); +@@ -894,6 +946,7 @@ parse_opts(int argc, char **argv) + {"bootnum", required_argument, 0, 'b'}, + {"delete-bootnum", no_argument, 0, 'B'}, + {"create", no_argument, 0, 'c'}, ++ {"remove-dups", no_argument, 0, 'D'}, + {"disk", required_argument, 0, 'd'}, + {"iface", required_argument, 0, 'i'}, + {"acpi_hid", required_argument, 0, 'H'}, +@@ -923,7 +976,7 @@ parse_opts(int argc, char **argv) + }; + + c = getopt_long (argc, argv, +- "AaBb:cd:e:E:gH:i:l:L:n:No:Op:qt:TuU:v::Vw" ++ "AaBb:cDd:e:E:gH:i:l:L:n:No:Op:qt:TuU:v::Vw" + "@:h", + long_options, &option_index); + if (c == -1) +@@ -955,6 +1008,9 @@ parse_opts(int argc, char **argv) + case 'c': + opts.create = 1; + break; ++ case 'D': ++ opts.deduplicate = 1; ++ break; + case 'd': + opts.disk = optarg; + break; +@@ -1163,6 +1219,9 @@ main(int argc, char **argv) + ret = set_boot_order(opts.keep_old_entries); + } + ++ if (opts.deduplicate) { ++ ret = remove_dupes_from_boot_order(); ++ } + + if (opts.delete_bootnext) { + ret = efi_del_variable(EFI_GLOBAL_GUID, "BootNext"); +diff --git a/src/include/efibootmgr.h b/src/include/efibootmgr.h +index 87c83bb..b978caf 100644 +--- a/src/include/efibootmgr.h ++++ b/src/include/efibootmgr.h +@@ -40,6 +40,7 @@ typedef struct { + int bootnext; + int verbose; + int active; ++ int deduplicate; + int64_t acpi_hid; + int64_t acpi_uid; + unsigned int delete_boot:1; +diff --git a/src/man/man8/efibootmgr.8 b/src/man/man8/efibootmgr.8 +index 61631df..5c0ea70 100644 +--- a/src/man/man8/efibootmgr.8 ++++ b/src/man/man8/efibootmgr.8 +@@ -9,7 +9,7 @@ + efibootmgr \- manipulate the EFI Boot Manager + .SH SYNOPSIS + +-\fBefibootmgr\fR [ \fB-a\fR ] [ \fB-A\fR ] [ \fB-b \fIXXXX\fB\fR ] [ \fB-B \fIXXXX\fB\fR ] [ \fB-c\fR ] [ \fB-d \fIDISK\fB\fR ] [ \fB-e \fI1|3|-1\fB\fR ] [ \fB-E \fINUM\fB\fR ] [ \fB-g\fR ] [ \fB-H \fIXXXX\fB\fR ] [ \fB-i \fINAME\fB\fR ] [ \fB-l \fINAME\fB\fR ] [ \fB-L \fILABEL\fB\fR ] [ \fB-n \fIXXXX\fB\fR ] [ \fB-N\fR ] [ \fB-o \fIXXXX\fB,\fIYYYY\fB,\fIZZZZ\fB\fR\fI ...\fR ] [ \fB-O\fR ] [ \fB-p \fIPART\fB\fR ] [ \fB-q\fR ] [ \fB-t \fIseconds\fB\fR ] [ \fB-T\fR ] [ \fB-u\fR ] [ \fB-U \fIXXXX\fB\fR ] [ \fB-v\fR ] [ \fB-V\fR ] [ \fB-w\fR ] [ \fB-@ \fIfile\fB\fR ] ++\fBefibootmgr\fR [ \fB-a\fR ] [ \fB-A\fR ] [ \fB-b \fIXXXX\fB\fR ] [ \fB-B \fIXXXX\fB\fR ] [ \fB-c\fR ] [ \fB-d \fIDISK\fB\fR ] [ \fB-D\fR ] [ \fB-e \fI1|3|-1\fB\fR ] [ \fB-E \fINUM\fB\fR ] [ \fB-g\fR ] [ \fB-H \fIXXXX\fB\fR ] [ \fB-i \fINAME\fB\fR ] [ \fB-l \fINAME\fB\fR ] [ \fB-L \fILABEL\fB\fR ] [ \fB-n \fIXXXX\fB\fR ] [ \fB-N\fR ] [ \fB-o \fIXXXX\fB,\fIYYYY\fB,\fIZZZZ\fB\fR\fI ...\fR ] [ \fB-O\fR ] [ \fB-p \fIPART\fB\fR ] [ \fB-q\fR ] [ \fB-t \fIseconds\fB\fR ] [ \fB-T\fR ] [ \fB-u\fR ] [ \fB-U \fIXXXX\fB\fR ] [ \fB-v\fR ] [ \fB-V\fR ] [ \fB-w\fR ] [ \fB-@ \fIfile\fB\fR ] + + .SH "DESCRIPTION" + .PP +@@ -51,6 +51,9 @@ Create new variable bootnum and add to bootorder + The disk containing the loader (defaults to + \fI/dev/sda\fR) + .TP ++\fB-D | --remove-dups\fR ++Remove duplicated entries from BootOrder ++.TP + \fB-e | --edd \fI1|3|-1\fB\fR + Force EDD 1.0 or 3.0 creation variables, or guess. + .TP +-- +1.9.3 + diff --git a/0020-Clean-up-some-whitespace.patch b/0020-Clean-up-some-whitespace.patch new file mode 100644 index 0000000..0ea2ec1 --- /dev/null +++ b/0020-Clean-up-some-whitespace.patch @@ -0,0 +1,337 @@ +From e56d305380334d17bd0701fb5f8347542e293b14 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 1 Aug 2014 08:36:49 -0400 +Subject: [PATCH 20/22] Clean up some whitespace. + +Signed-off-by: Peter Jones +--- + src/include/efi.h | 2 +- + src/include/scsi_ioctls.h | 6 +++--- + src/lib/disk.c | 42 ++++++++++++++++++------------------------ + src/lib/efi.c | 6 +++--- + src/lib/scsi_ioctls.c | 12 ++++++------ + src/lib/unparse_path.c | 8 +++----- + 6 files changed, 34 insertions(+), 42 deletions(-) + +diff --git a/src/include/efi.h b/src/include/efi.h +index 954b4a6..ec25be9 100644 +--- a/src/include/efi.h ++++ b/src/include/efi.h +@@ -236,7 +236,7 @@ typedef struct { + uint32_t reserved; + uint64_t node_guid; + uint64_t ioc_guid; +- uint64_t id; ++ uint64_t id; + } __attribute__((packed)) INFINIBAND_DEVICE_PATH; + + typedef struct { +diff --git a/src/include/scsi_ioctls.h b/src/include/scsi_ioctls.h +index 331bb14..d355534 100644 +--- a/src/include/scsi_ioctls.h ++++ b/src/include/scsi_ioctls.h +@@ -1,8 +1,8 @@ + /* + scsi_ioctls.[ch] +- ++ + Copyright (C) 2001 Dell Computer Corporation +- ++ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or +@@ -19,7 +19,7 @@ + */ + + #ifndef _SCSI_IOCTLS_H +-#define _SCSI_IOCTLS_H ++#define _SCSI_IOCTLS_H + + #include + #include +diff --git a/src/lib/disk.c b/src/lib/disk.c +index ad95fd4..904010b 100644 +--- a/src/lib/disk.c ++++ b/src/lib/disk.c +@@ -1,8 +1,8 @@ + /* + disk.[ch] +- ++ + Copyright (C) 2001 Dell Computer Corporation +- ++ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or +@@ -179,7 +179,7 @@ disk_info_from_fd(int fd, struct disk_info *info) + info->part = info->minor & 0x3F; + return 0; + } +- ++ + /* I2O disks can have up to 16 partitions, or 4 bits worth. */ + if (info->major >= 80 && info->major <= 87) { + info->interface_type = i2o; +@@ -248,7 +248,7 @@ disk_get_virt_pci(const struct disk_info *info, unsigned char *bus, + } + + static int +-disk_get_scsi_pci(int fd, ++disk_get_scsi_pci(int fd, + const struct disk_info *info, + unsigned char *bus, + unsigned char *device, +@@ -265,7 +265,7 @@ disk_get_scsi_pci(int fd, + return 1; + } + if (S_ISREG(buf.st_mode)) { +- /* can't call ioctl() on this file and have it succeed. ++ /* can't call ioctl() on this file and have it succeed. + * instead, need to open the block device + * from /dev/. + */ +@@ -320,13 +320,13 @@ disk_get_ide_pci(int fd, + char procname[80], infoline[80]; + size_t read_count __attribute__((unused)); + int rc; +- ++ + rc = disk_info_from_fd(fd, &info); + if (rc) return rc; + + + sprintf(procname, "/proc/ide/ide%d/config", info.controllernum); +- ++ + procfd = open(procname, O_RDONLY); + if (!procfd) { + perror("opening /proc/ide/ide*/config"); +@@ -334,11 +334,11 @@ disk_get_ide_pci(int fd, + } + read_count = read(procfd, infoline, sizeof(infoline)-1); + close(procfd); +- ++ + num_scanned = sscanf(infoline, + "pci bus %x device %x vid %*x did %*x channel %*x", + &b, &d); +- ++ + if (num_scanned == 2) { + *bus = b; + *device = PCI_SLOT(d); +@@ -376,7 +376,7 @@ disk_get_pci(int fd, + break; + } + return 1; +-} ++} + + int + disk_get_size(int fd, long *size) +@@ -441,12 +441,12 @@ msdos_disk_get_partition_info (int fd, legacy_mbr *mbr, + uint64_t *start, uint64_t *size, + char *signature, + uint8_t *mbr_type, uint8_t *signature_type) +-{ ++{ + int rc; + long disk_size=0; + struct stat stat; + struct timeval tv; +- ++ + if (!mbr) return 1; + if (!is_mbr_valid(mbr)) return 1; + +@@ -454,7 +454,6 @@ msdos_disk_get_partition_info (int fd, legacy_mbr *mbr, + *signature_type = 0x01; + + if (!mbr->unique_mbr_signature && !opts.write_signature) { +- + printf("\n\n******************************************************\n"); + printf("Warning! This MBR disk does not have a unique signature.\n"); + printf("If this is not the first disk found by EFI, you may not be able\n"); +@@ -462,14 +461,11 @@ msdos_disk_get_partition_info (int fd, legacy_mbr *mbr, + printf("Run efibootmgr with the -w flag to write a unique signature\n"); + printf("to the disk.\n"); + printf("******************************************************\n\n"); +- + } + else if (!mbr->unique_mbr_signature && opts.write_signature) { +- +- /* MBR Signatures must be unique for the ++ /* MBR Signatures must be unique for the + EFI Boot Manager + to find the right disk to boot from */ +- + rc = fstat(fd, &stat); + if (rc == -1) { + perror("stat disk"); +@@ -479,19 +475,18 @@ msdos_disk_get_partition_info (int fd, legacy_mbr *mbr, + if (rc == -1) { + perror("gettimeofday"); + } +- ++ + /* Write the device type to the signature. + This should be unique per disk per system */ + mbr->unique_mbr_signature = tv.tv_usec << 16; + mbr->unique_mbr_signature |= stat.st_rdev & 0xFFFF; +- ++ + /* Write it to the disk */ + lseek(fd, 0, SEEK_SET); + rc = write(fd, mbr, sizeof(*mbr)); + } + *(uint32_t *)signature = mbr->unique_mbr_signature; +- +- ++ + if (num > 4) { + /* Extended partition */ + return msdos_disk_get_extended_partition_info(fd, mbr, num, +@@ -507,7 +502,6 @@ msdos_disk_get_partition_info (int fd, legacy_mbr *mbr, + /* Primary partition */ + *start = mbr->partition[num-1].starting_lba; + *size = mbr->partition[num-1].size_in_lba; +- + } + return 0; + } +@@ -561,13 +555,13 @@ lcm(unsigned int x, unsigned int y) + * @signature - partition signature returned + * @mbr_type - partition type returned + * @signature_type - signature type returned +- * ++ * + * Description: Finds partition table info for given partition on given disk. + * Both GPT and MSDOS partition tables are tested for. + * Returns 0 on success, non-zero on failure + */ + int +-disk_get_partition_info (int fd, ++disk_get_partition_info (int fd, + uint32_t num, + uint64_t *start, uint64_t *size, + char *signature, +diff --git a/src/lib/efi.c b/src/lib/efi.c +index 74df42a..133b8bb 100644 +--- a/src/lib/efi.c ++++ b/src/lib/efi.c +@@ -611,7 +611,7 @@ static ssize_t + make_net_load_option(char *iface, uint8_t *buf, size_t size) + { + /* copied pretty much verbatim from the ethtool source */ +- int fd = 0, err; ++ int fd = 0, err; + unsigned char bus, slot, func; + struct ifreq ifr; + struct ethtool_drvinfo drvinfo; +@@ -681,7 +681,7 @@ make_net_load_option(char *iface, uint8_t *buf, size_t size) + return needed; + buf_offset += needed; + +- needed = make_end_device_path(buf + buf_offset, ++ needed = make_end_device_path(buf + buf_offset, + size == 0 ? 0 : size - buf_offset); + if (needed < 0) + return needed; +@@ -857,7 +857,7 @@ append_extra_args_file(uint8_t **data, size_t *data_size) + ssize_t num_read=0; + unsigned long appended=0; + size_t maxchars = 0; +- char *buffer; ++ char *buffer; + + if (!data) { + fprintf(stderr, "internal error\n"); +diff --git a/src/lib/scsi_ioctls.c b/src/lib/scsi_ioctls.c +index c04f12a..3aaa933 100644 +--- a/src/lib/scsi_ioctls.c ++++ b/src/lib/scsi_ioctls.c +@@ -1,8 +1,8 @@ + /* + scsi_ioctls.[ch] +- ++ + Copyright (C) 2001 Dell Computer Corporation +- ++ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or +@@ -41,7 +41,7 @@ idlun_to_components (Scsi_Idlun *idlun, + unsigned char *lun) + { + if (!idlun || !host || !channel || !id || !lun) return 1; +- ++ + *host = (idlun->dev_id >> 24) & 0xFF; + *channel = (idlun->dev_id >> 16) & 0xFF; + *id = (idlun->dev_id ) & 0xFF; +@@ -56,7 +56,7 @@ get_scsi_idlun(int fd, Scsi_Idlun *idlun) + return ioctl(fd, SCSI_IOCTL_GET_IDLUN, idlun); + } + +-int ++int + get_scsi_pci(int fd, char *slot_name, size_t size) + { + char buf[SLOT_NAME_SIZE] = ""; +@@ -88,7 +88,7 @@ int main(int argc, char **argv) + memset(&idlun, 0, sizeof(idlun)); + + if (argc < 2) {usage(argv); exit(1);} +- ++ + fd = open(argv[1], O_RDONLY); + if (fd == -1) { + perror("Unable to open file"); +@@ -103,7 +103,7 @@ int main(int argc, char **argv) + if (rc) { + perror("Unable to get_scsi_idlun()"); + } +- ++ + printf("Device: %s\n", argv[1]); + printf("PCI: %s\n", slot_name); + +diff --git a/src/lib/unparse_path.c b/src/lib/unparse_path.c +index b164758..431dc06 100644 +--- a/src/lib/unparse_path.c ++++ b/src/lib/unparse_path.c +@@ -1,8 +1,8 @@ + /* + unparse_path.[ch] +- ++ + Copyright (C) 2001 Dell Computer Corporation +- ++ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or +@@ -582,7 +582,6 @@ main(int argc, char **argv) + exit(-1); + } + +- + fd = open(argv[1], O_RDONLY); + if (fd == -1) { + perror("Failed to open file."); +@@ -595,8 +594,7 @@ main(int argc, char **argv) + exit(-1); + } + unparse_var(&var); +- +- ++ + return 0; + } + #endif +-- +1.9.3 + diff --git a/0021-Move-TODO-stuff-to-0.9.patch b/0021-Move-TODO-stuff-to-0.9.patch new file mode 100644 index 0000000..49e7159 --- /dev/null +++ b/0021-Move-TODO-stuff-to-0.9.patch @@ -0,0 +1,32 @@ +From ecd7e9e84a63582c7a9b78cce5a2a1cfe5eb1f4b Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 1 Aug 2014 08:44:46 -0400 +Subject: [PATCH 21/22] Move TODO stuff to 0.9 + +Wound up doing some work that's more important than the stuff in the +TODO, so it's all getting moved out to 0.9 + +Signed-off-by: Peter Jones +--- + doc/TODO | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/doc/TODO b/doc/TODO +index 8767c78..6340ac7 100644 +--- a/doc/TODO ++++ b/doc/TODO +@@ -1,9 +1,10 @@ +-For 0.8: ++For 0.9: + + - support for setting hotkeys + - support for driver variables, not just boot variables. + - support for arbitrary device paths with -c (including guid parsing) + - audit for missing unparse_*_path() types. ++ - verify/debug NVME code + - maintain a list of known GUIDs and print {vendor} instead of the full GUID + - accept these for arbitrary paths as well. + - MS-DOS style extended partitions +-- +1.9.3 + diff --git a/0022-Fix-some-minor-errors-cppcheck-found.patch b/0022-Fix-some-minor-errors-cppcheck-found.patch new file mode 100644 index 0000000..f20c30c --- /dev/null +++ b/0022-Fix-some-minor-errors-cppcheck-found.patch @@ -0,0 +1,45 @@ +From b1afcbbdcaf1c7b485e4e9273ff0d09580ff20df Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 1 Aug 2014 08:57:17 -0400 +Subject: [PATCH 22/22] Fix some minor errors cppcheck found. + +Signed-off-by: Peter Jones +--- + src/efibootmgr/efibootmgr.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c +index 40be505..5af2cad 100644 +--- a/src/efibootmgr/efibootmgr.c ++++ b/src/efibootmgr/efibootmgr.c +@@ -933,7 +933,8 @@ set_default_opts() + static void + parse_opts(int argc, char **argv) + { +- int c, num, rc; ++ int c, rc; ++ unsigned int num; + int option_index = 0; + + while (1) +@@ -1015,7 +1016,7 @@ parse_opts(int argc, char **argv) + opts.disk = optarg; + break; + case 'e': +- rc = sscanf(optarg, "%d", &num); ++ rc = sscanf(optarg, "%u", &num); + if (rc == 1) opts.edd_version = num; + else { + fprintf (stderr,"invalid numeric value %s\n",optarg); +@@ -1118,7 +1119,7 @@ parse_opts(int argc, char **argv) + if (optarg) { + if (!strcmp(optarg, "v")) opts.verbose = 2; + if (!strcmp(optarg, "vv")) opts.verbose = 3; +- rc = sscanf(optarg, "%d", &num); ++ rc = sscanf(optarg, "%u", &num); + if (rc == 1) opts.verbose = num; + else { + fprintf (stderr,"invalid numeric value %s\n",optarg); +-- +1.9.3 + diff --git a/efibootmgr.spec b/efibootmgr.spec index 0d2d198..c141b91 100644 --- a/efibootmgr.spec +++ b/efibootmgr.spec @@ -1,7 +1,7 @@ Summary: EFI Boot Manager Name: efibootmgr Version: 0.7.0 -Release: 3%{?dist} +Release: 4%{?dist} Group: System Environment/Base License: GPLv2+ URL: https://github.com/vathpela/%{name}/ @@ -17,7 +17,28 @@ Conflicts: elilo < 3.6-6 Obsoletes: elilo < 3.6-6 Source0: https://github.com/vathpela/%{name}/archive/%{name}-%{version}.tar.bz2 -Patch0: 0001-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch +Patch0001: 0001-Filenames-and-github-the-worst-of-both-worlds.patch +Patch0002: 0002-Get-a-lot-more-picky-with-our-compiler-warnings.patch +Patch0003: 0003-Add-support-for-displaying-NVME-device-paths.patch +Patch0004: 0004-Make-nvme-work-with-e-3.patch +Patch0005: 0005-Remove-bogus-test-for-optional-data-length-bounds.patch +Patch0006: 0006-Only-free-hard-drive-signatures-if-we-ve-allocated-t.patch +Patch0007: 0007-We-don-t-actually-have-docbook-hooked-up-to-the-buil.patch +Patch0008: 0008-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch +Patch0009: 0009-Remove-unused-function-var_num_from_name.patch +Patch0010: 0010-Fix-typo-in-compare-function.patch +Patch0011: 0011-data_size-in-construct_boot_order-set_boot_order-is-.patch +Patch0012: 0012-Variable-needed-should-be-of-type-ssize_t-as-that-s-.patch +Patch0013: 0013-Clang-uses-C99-semantics-by-default-for-inline-keywo.patch +Patch0014: 0014-Use-PRIx64-in-nvme-parsing.patch +Patch0015: 0015-Compare-should-respect-the-size-of-the-data-it-compa.patch +Patch0016: 0016-Don-t-pass-around-a-format-specifier-when-we-don-t-n.patch +Patch0017: 0017-Don-t-leak-memory-in-remove_from_boot_order.patch +Patch0018: 0018-Fix-some-leaked-memory-that-shows-up-in-valgrind.patch +Patch0019: 0019-Add-the-ability-to-clean-up-duplicates-in-BootOrder.patch +Patch0020: 0020-Clean-up-some-whitespace.patch +Patch0021: 0021-Move-TODO-stuff-to-0.9.patch +Patch0022: 0022-Fix-some-minor-errors-cppcheck-found.patch %description %{name} displays and allows the user to edit the Intel Extensible @@ -54,6 +75,9 @@ rm -rf %{buildroot} %doc README INSTALL COPYING %changelog +* Fri Aug 01 2014 Peter Jones - 0.7.0-4 +- Rebase to current upstream master (in preperation for 0.8.0) + * Thu Jun 19 2014 Peter Jones - 0.7.0-3 - Reinstate an accidentally dropped hack to avoid apple brain damage.