[efibootmgr/f19] Rebase to current upstream master (in preperation for 0.8.0)
Peter Jones
pjones at fedoraproject.org
Mon Oct 20 16:37:00 UTC 2014
commit 34d87283603ac3c08c296fd6e53c07f86a372302
Author: Peter Jones <pjones at redhat.com>
Date: Fri Aug 1 09:40:55 2014 -0400
Rebase to current upstream master (in preperation for 0.8.0)
Signed-off-by: Peter Jones <pjones at redhat.com>
Conflicts:
efibootmgr.spec
...names-and-github-the-worst-of-both-worlds.patch | 26 +
...lot-more-picky-with-our-compiler-warnings.patch | 161 +++++++
...-support-for-displaying-NVME-device-paths.patch | 60 +++
0004-Make-nvme-work-with-e-3.patch | 188 ++++++++
...ogus-test-for-optional-data-length-bounds.patch | 34 ++
...ard-drive-signatures-if-we-ve-allocated-t.patch | 28 ++
...tually-have-docbook-hooked-up-to-the-buil.patch | 486 ++++++++++++++++++++
...ple-setting-invalid-attribute-bits-in-boo.patch | 4 +-
...-Remove-unused-function-var_num_from_name.patch | 30 ++
0010-Fix-typo-in-compare-function.patch | 26 +
...n-construct_boot_order-set_boot_order-is-.patch | 36 ++
...eded-should-be-of-type-ssize_t-as-that-s-.patch | 113 +++++
...C99-semantics-by-default-for-inline-keywo.patch | 42 ++
0014-Use-PRIx64-in-nvme-parsing.patch | 29 ++
...uld-respect-the-size-of-the-data-it-compa.patch | 26 +
...around-a-format-specifier-when-we-don-t-n.patch | 51 ++
...n-t-leak-memory-in-remove_from_boot_order.patch | 29 ++
...e-leaked-memory-that-shows-up-in-valgrind.patch | 96 ++++
...ility-to-clean-up-duplicates-in-BootOrder.patch | 164 +++++++
0020-Clean-up-some-whitespace.patch | 337 ++++++++++++++
0021-Move-TODO-stuff-to-0.9.patch | 32 ++
0022-Fix-some-minor-errors-cppcheck-found.patch | 45 ++
efibootmgr.spec | 30 ++-
23 files changed, 2068 insertions(+), 5 deletions(-)
---
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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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/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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <sys/stat.h>
+ #include <fcntl.h>
+ #include <sys/ioctl.h>
++#include <linux/nvme.h>
+ #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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 @@
+-<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+-
+-<!-- This manpage was compiled by dann frazier <email>dannf at debian.org</email>,
+- and was based on an example constructed by Colin Watson
+- <email>cjwatson at debian.org</email>, which was based on a man page template
+- provided by Tom Christiansen <email>tchrist at jhereg.perl.com</email>
+- and a DocBook man page example by Craig Small
+- <email>csmall at debian.org</email>.
+-
+- The content was mostly taken from the efibootmgr README file in the
+- Debian package, which was written by Matt Domsch
+- <email>Matt_Domsch at dell.com</email>.
+- -->
+-
+- <!-- Fill in the various UPPER CASE things here. -->
+- <!ENTITY manfirstname "<firstname>dann</firstname>">
+- <!ENTITY mansurname "<surname>frazier</surname>">
+- <!-- Please adjust the date whenever revising the manpage. -->
+- <!ENTITY mandate "<date>2005-08-11</date>">
+- <!-- SECTION should be 1-8, maybe with subsection. Other parameters are
+- allowed: see man(7), man(1). -->
+- <!ENTITY mansection "<manvolnum>8</manvolnum>">
+- <!ENTITY manemail "<email>dannf at debian.org</email>">
+- <!ENTITY manusername "dann frazier">
+- <!ENTITY manucpackage "<refentrytitle>EFIBOOTMGR</refentrytitle>">
+- <!ENTITY manpackage "efibootmgr">
+-]>
+-
+-<refentry>
+- <refentryinfo>
+- <address>
+- &manemail;
+- </address>
+- <author>
+- &manfirstname;
+- &mansurname;
+- </author>
+- <copyright>
+- <year>2002, 2003, 2004</year>
+- <holder>&manusername;</holder>
+- </copyright>
+- &mandate;
+- </refentryinfo>
+- <refmeta>
+- &manucpackage;
+-
+- &mansection;
+- </refmeta>
+- <refnamediv>
+- <refname>&manpackage;</refname>
+-
+- <refpurpose>manipulate the EFI Boot Manager</refpurpose>
+- </refnamediv>
+- <refsynopsisdiv>
+- <cmdsynopsis>
+- <command>&manpackage;</command>
+-
+- <arg>-a</arg>
+- <arg>-A</arg>
+- <arg>-b <replaceable>XXXX</replaceable></arg>
+- <arg>-B <replaceable>XXXX</replaceable></arg>
+- <arg>-c</arg>
+- <arg>-d <replaceable>DISK</replaceable></arg>
+- <arg>-e <replaceable>1|3|-1</replaceable></arg>
+- <arg>-E <replaceable>NUM</replaceable></arg>
+- <arg>-g</arg>
+- <arg>-H <replaceable>XXXX</replaceable></arg>
+- <arg>-i <replaceable>NAME</replaceable></arg>
+- <arg>-l <replaceable>NAME</replaceable></arg>
+- <arg>-L <replaceable>LABEL</replaceable></arg>
+- <arg>-n <replaceable>XXXX</replaceable></arg>
+- <arg>-N</arg>
+- <arg rep="repeat">-o <replaceable>XXXX</replaceable>,<replaceable>YYYY</replaceable>,<replaceable>ZZZZ</replaceable></arg>
+- <arg>-O</arg>
+- <arg>-p <replaceable>PART</replaceable></arg>
+- <arg>-q</arg>
+- <arg>-t <replaceable>seconds</replaceable></arg>
+- <arg>-T</arg>
+- <arg>-u</arg>
+- <arg>-U <replaceable>XXXX</replaceable></arg>
+- <arg>-v</arg>
+- <arg>-V</arg>
+- <arg>-w</arg>
+- <arg>-@ <replaceable>file</replaceable></arg>
+- </cmdsynopsis>
+- </refsynopsisdiv>
+- <refsect1>
+- <title>DESCRIPTION</title>
+-
+- <para><command>&manpackage;</command> 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.</para>
+-
+- <para>
+- Details on the EFI Boot Manager are available from the EFI
+- Specification, v1.02 or later, available from:
+- <ulink url="http://developer.intel.com"></ulink>
+- </para>
+-
+- <note>
+- <para>
+- &manpackage; requires that the kernel support access to EFI
+- non-volatile variables (through
+- <filename>/proc/efi/vars</filename> on 2.4 kernels,
+- <filename>/sys/firmware/efi/vars</filename> on 2.6 kernels).
+- <command>modprobe efivars</command> should do the trick.
+- </para>
+- </note>
+- </refsect1>
+- <refsect1>
+- <title>OPTIONS</title>
+-
+- <para>The following is a list of options accepted by &manpackage;:</para>
+-
+- <variablelist>
+- <varlistentry>
+- <term><option>-a</option> | <option>--active</option></term>
+- <listitem>
+- <para>Sets bootnum active</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-A</option> | <option>--inactive</option></term>
+- <listitem>
+- <para>Sets bootnum inactive</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-b</option> | <option>--bootnum</option> <replaceable>XXXX</replaceable></term>
+- <listitem>
+- <para>Modify Boot<replaceable>XXXX</replaceable> (hex)</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-B</option> | <option>--delete-bootnum</option></term>
+- <listitem>
+- <para>Delete bootnum (hex)</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-c</option> | <option>--create</option></term>
+- <listitem>
+- <para>Create new variable bootnum and add to bootorder</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-d</option> | <option>--disk</option> <replaceable>DISK</replaceable></term>
+- <listitem>
+- <para>The disk containing the loader (defaults to
+- <filename>/dev/sda</filename>)</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-e</option> | <option>--edd</option> <replaceable>1|3|-1</replaceable></term>
+- <listitem>
+- <para>Force EDD 1.0 or 3.0 creation variables, or guess.</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-E</option> | <option>--device</option> <replaceable>NUM</replaceable></term>
+- <listitem>
+- <para>EDD 1.0 device number (defaults to 0x80)</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-g</option> | <option>--gpt</option></term>
+- <listitem>
+- <para>Force disk with invalid PMBR to be treated as GPT</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-H</option> | <option>--acpi_hid</option> <replaceable>XXXX</replaceable></term>
+- <listitem>
+- <para>set the ACPI HID (used with <option>-i</option>)</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-i</option> | <option>--iface</option> <replaceable>NAME</replaceable></term>
+- <listitem>
+- <para>create a netboot entry for the named interface</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-l</option> | <option>--loader</option> <replaceable>NAME</replaceable></term>
+- <listitem>
+- <para>Specify a loader (defaults to <filename>\\elilo.efi</filename>)
+- </para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-L</option> | <option>--label</option> <replaceable>LABEL</replaceable></term>
+- <listitem>
+- <para>Boot manager display label (defaults to "Linux")</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-n</option> | <option>--bootnext</option> <replaceable>XXXX</replaceable></term>
+- <listitem>
+- <para>Set BootNext to XXXX (hex)</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-N</option> | <option>--delete-bootnext</option></term>
+- <listitem>
+- <para>Delete BootNext</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-o</option> | <option>--bootorder</option> <replaceable>XXXX</replaceable>,<replaceable>YYYY</replaceable>,<replaceable>ZZZZ</replaceable></term>
+- <listitem>
+- <para>Explicitly set BootOrder (hex)</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-O</option> | <option>--delete-bootorder</option></term>
+- <listitem>
+- <para>Delete BootOrder</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-p</option> | <option>--part</option> <replaceable>PART</replaceable></term>
+- <listitem>
+- <para>Partition number containing the bootloader (defaults to 1)</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-q</option> | <option>--quiet</option></term>
+- <listitem>
+- <para>Quiet mode - supresses output.</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>--test</option> <replaceable>filename</replaceable></term>
+- <listitem>
+- <para>Don't write to NVRAM, write to <replaceable>filename</replaceable>.</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-t</option> | <option>--timeout</option> <replaceable>seconds</replaceable></term>
+- <listitem>
+- <para>Boot Manager timeout, in <replaceable>seconds</replaceable>.</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-T</option> | <option>--delete-timeout</option></term>
+- <listitem>
+- <para>Delete Timeout variable.</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-u</option> | <option>--unicode</option> | <option>--UCS-2</option> </term>
+- <listitem>
+- <para>pass extra command line arguments as UCS-2 (default is
+- ASCII)</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-U</option> | <option>--acpi_uid</option> <replaceable>XXXX</replaceable></term>
+- <listitem>
+- <para>set the ACPI UID (used with <option>-i</option>)</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-v</option> | <option>--verbose</option></term>
+- <listitem>
+- <para>Verbose mode - prints additional information</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-V</option> | <option>--version</option></term>
+- <listitem>
+- <para>Just print version string and exit.</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-w</option> | <option>--write-signature</option></term>
+- <listitem>
+- <para>write unique signature to the MBR if needed</para>
+- </listitem>
+- </varlistentry>
+- <varlistentry>
+- <term><option>-@</option> |
+- <option>--append-binary-args</option>
+- </term>
+- <listitem>
+- <para>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.</para>
+- </listitem>
+- </varlistentry>
+- </variablelist>
+-
+- </refsect1>
+-
+- <refsect1>
+- <title>EXAMPLES</title>
+- <orderedlist>
+- <listitem>
+- <example>
+- <title>Displaying the current settings (must be root).</title>
+-
+- <para>
+- <programlisting>
+- [root at 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
+- </programlisting>
+- </para>
+- <para>This shows:</para>
+- <itemizedlist>
+- <listitem>
+- <para>BootCurrent - the boot entry used to start the currently
+- running system</para>
+- </listitem>
+- <listitem>
+- <para>
+- 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.
+- </para>
+- </listitem>
+- <listitem>
+- <para>
+- 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.
+- </para>
+- </listitem>
+- <listitem>
+- <para>
+- 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.
+- </para>
+- </listitem>
+- <listitem>
+- <para>
+- Five boot entries (0000 - 0004), along with the active/inactive
+- flag (* means active) and the name displayed on the screen.
+- </para>
+- </listitem>
+- </itemizedlist>
+- </example>
+- </listitem>
+- <listitem>
+- <example>
+- <title>Creating a new boot option</title>
+- <para>
+- An OS installer would call <command>&manpackage; -c</command>.
+- This assumes that <filename>/boot/efi</filename> is your EFI System
+- Partition, and is mounted at <filename>/dev/sda1</filename>. 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 <filename>elilo.efi</filename>.
+- </para>
+- </example>
+- </listitem>
+- <listitem>
+- <example>
+- <title>Changing the Boot Order</title>
+- <para>
+- Assuming the configuration in Example #1,
+- <command>&manpackage; -o 3,4</command> could be called to specify
+- PXE boot first, then Linux boot.
+- </para>
+- </example>
+- </listitem>
+- <listitem>
+- <example>
+- <title>Changing the Boot Order for the Next Boot Only</title>
+- <para>
+- Assuming the configuration in Example #1,
+- <command>&manpackage; -n 4</command> could be called to specify
+- that the Linux entry be taken on next boot.
+- </para>
+- </example>
+- </listitem>
+- <listitem>
+- <example>
+- <title>Deleting a boot option</title>
+- <para>
+- Assuming the configuration in Example #1,
+- <command>&manpackage; -b 4 -B</command> could be called to delete
+- entry 4 and remove it from the BootOrder.
+- </para>
+- </example>
+- </listitem>
+- <listitem>
+- <example>
+- <title>Creating network boot entries</title>
+- <para>
+- 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:
+- <computeroutput>
+- 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".
+- </computeroutput>
+- You create the boot entry with:
+- <command>efibootmgr -c -i eth0 -H 222F -U 500 -L netboot</command>
+- </para>
+- </example>
+- </listitem>
+- </orderedlist>
+- </refsect1>
+-
+- <refsect1>
+- <title>BUGS</title>
+-
+- <para>Please direct any bugs, features, patches, etc. to Peter Jones:
+- <ulink url="https://github.com/vathpela"></ulink>.
+- </para>
+- </refsect1>
+-
+- <refsect1>
+- <title>AUTHOR</title>
+- <para>This man page was generated by dann frazier &manemail; for the
+- Debian GNU/Linux operating system, but may be used by others.</para>
+- </refsect1>
+-
+- <refsect1>
+- <title>SEE ALSO</title>
+-
+- <para>elilo(1)</para>
+- </refsect1>
+-</refentry>
+-
+-<!-- Keep this comment at the end of the file
+-Local variables:
+-mode: sgml
+-sgml-omittag:t
+-sgml-shorttag:t
+-sgml-minimize-attributes:nil
+-sgml-always-quote-attributes:t
+-sgml-indent-step:2
+-sgml-indent-data:t
+-sgml-parent-document:nil
+-sgml-default-dtd-file:nil
+-sgml-exposed-tags:nil
+-sgml-local-catalogs:nil
+-sgml-local-ecat-files:nil
+-End:
+--->
+--
+1.9.3
+
diff --git a/0001-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch b/0008-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch
similarity index 96%
rename from 0001-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch
rename to 0008-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch
index 1fe8c07..21a1fe5 100644
--- a/0001-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch
+++ b/0008-Mitigate-apple-setting-invalid-attribute-bits-in-boo.patch
@@ -1,7 +1,7 @@
From 15a46a8023c9925a78ddbacc8534af17db611edb Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones at redhat.com>
Date: Tue, 17 Jun 2014 14:05:31 -0400
-Subject: [PATCH] Mitigate apple setting invalid attribute bits in boot
+Subject: [PATCH 08/22] Mitigate apple setting invalid attribute bits in boot
variables.
Signed-off-by: Peter Jones <pjones at redhat.com>
@@ -61,5 +61,5 @@ index e2ec5cd..f596d99 100644
uint16_t *new_data = calloc(1, new_data_size);
if (!new_data)
--
-1.9.0
+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 <Jared_Dominguez at Dell.com>
+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 <Jared_Dominguez at Dell.com>
+---
+ 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 <Jared_Dominguez at Dell.com>
+Date: Mon, 7 Jul 2014 14:02:22 -0500
+Subject: [PATCH 10/22] Fix typo in compare function.
+
+Signed-off-by: Daniel Jared Dominguez <Jared_Dominguez at Dell.com>
+---
+ 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 <Jared_Dominguez at Dell.com>
+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 <Jared_Dominguez at Dell.com>
+---
+ 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 <Jared_Dominguez at Dell.com>
+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 <Jared_Dominguez at Dell.com>
+---
+ 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 <Jared_Dominguez at Dell.com>
+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 <Jared_Dominguez at Dell.com>
+---
+ 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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <ried at mytum.de>
+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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <unistd.h>
+ #include <getopt.h>
+ #include <efivar.h>
++#include <inttypes.h>
+ #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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <pjones at redhat.com>
+Date: Fri, 1 Aug 2014 08:36:49 -0400
+Subject: [PATCH 20/22] Clean up some whitespace.
+
+Signed-off-by: Peter Jones <pjones at redhat.com>
+---
+ 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 <Matt_Domsch at dell.com>
+-
++
+ 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 <stdint.h>
+ #include <stddef.h>
+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 <Matt_Domsch at dell.com>
+-
++
+ 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 <Matt_Domsch at dell.com>
+-
++
+ 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 <Matt_Domsch at dell.com>
+-
++
+ 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 <pjones at redhat.com>
+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 <pjones at redhat.com>
+---
+ 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 <pjones at redhat.com>
+Date: Fri, 1 Aug 2014 08:57:17 -0400
+Subject: [PATCH 22/22] Fix some minor errors cppcheck found.
+
+Signed-off-by: Peter Jones <pjones at redhat.com>
+---
+ 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 30aeb85..b4d25a4 100644
--- a/efibootmgr.spec
+++ b/efibootmgr.spec
@@ -1,7 +1,7 @@
Summary: EFI Boot Manager
Name: efibootmgr
Version: 0.7.0
-Release: 2%{?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,7 +75,10 @@ rm -rf %{buildroot}
%doc README INSTALL COPYING
%changelog
-* Thu Jun 19 2014 Peter Jones <pjones at redhat.com> - 0.7.0-2
+* Fri Aug 01 2014 Peter Jones <pjones at redhat.com> - 0.7.0-4
+- Rebase to current upstream master (in preperation for 0.8.0)
+
+* Thu Jun 19 2014 Peter Jones <pjones at redhat.com> - 0.7.0-3
- Reinstate an accidentally dropped hack to avoid apple brain damage.
* Tue Apr 01 2014 Peter Jones <pjones at redhat.com> - 0.7.0-1{?dist}
More information about the scm-commits
mailing list