Accepting request 678179 from home:gary_lin:branches:Base:System

- Update to 37
- Add upstream patches to fix boo#1120862

OBS-URL: https://build.opensuse.org/request/show/678179
OBS-URL: https://build.opensuse.org/package/show/Base:System/efivar?expand=0&rev=40
This commit is contained in:
Gary Ching-Pang Lin 2019-02-22 08:47:44 +00:00 committed by Git OBS Bridge
parent c670f12626
commit c56f95529d
8 changed files with 284 additions and 50 deletions

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1e033dc5d099a44fd473b0887dbcc4b105613efab0fb3c5df9f111ea5d147394
size 95528

3
efivar-37.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3c67feb93f901b98fbb897d5ca82931a6698b5bcd6ac34f0815f670d77747b9f
size 109431

View File

@ -0,0 +1,171 @@
From c3c553db85ff10890209d0fe48fb4856ad68e4e0 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Thu, 21 Feb 2019 15:20:12 -0500
Subject: [PATCH] Fix all the places -Werror=address-of-packed-member catches.
This gets rid of all the places GCC 9's -Werror=address-of-packed-member
flags as problematic.
Fixes github issue #123
Signed-off-by: Peter Jones <pjones@redhat.com>
---
src/dp-message.c | 6 ++++--
src/dp.h | 12 ++++--------
src/guid.c | 2 +-
src/include/efivar/efivar.h | 2 +-
src/ucs2.h | 27 +++++++++++++++++++--------
5 files changed, 29 insertions(+), 20 deletions(-)
diff --git a/src/dp-message.c b/src/dp-message.c
index 3724e5f..9f96466 100644
--- a/src/dp-message.c
+++ b/src/dp-message.c
@@ -620,11 +620,13 @@ _format_message_dn(char *buf, size_t size, const_efidp dp)
) / sizeof(efi_ip_addr_t);
format(buf, size, off, "Dns", "Dns(");
for (int i=0; i < end; i++) {
- const efi_ip_addr_t *addr = &dp->dns.addrs[i];
+ efi_ip_addr_t addr;
+
+ memcpy(&addr, &dp->dns.addrs[i], sizeof(addr));
if (i != 0)
format(buf, size, off, "Dns", ",");
format_ip_addr(buf, size, off, "Dns",
- dp->dns.is_ipv6, addr);
+ dp->dns.is_ipv6, &addr);
}
format(buf, size, off, "Dns", ")");
break;
diff --git a/src/dp.h b/src/dp.h
index 20cb608..1f921d5 100644
--- a/src/dp.h
+++ b/src/dp.h
@@ -71,13 +71,9 @@
int _rc; \
char *_guidstr = NULL; \
efi_guid_t _guid; \
- const efi_guid_t * const _guid_p = \
- likely(__alignof__(guid) == sizeof(guid)) \
- ? guid \
- : &_guid; \
- \
- if (unlikely(__alignof__(guid) == sizeof(guid))) \
- memmove(&_guid, guid, sizeof(_guid)); \
+ const efi_guid_t * const _guid_p = &_guid; \
+ \
+ memmove(&_guid, guid, sizeof(_guid)); \
_rc = efi_guid_to_str(_guid_p, &_guidstr); \
if (_rc < 0) { \
efi_error("could not build %s GUID DP string", \
@@ -86,7 +82,7 @@
_guidstr = onstack(_guidstr, \
strlen(_guidstr)+1); \
_rc = format(buf, size, off, dp_type, "%s", \
- _guidstr); \
+ _guidstr); \
} \
_rc; \
})
diff --git a/src/guid.c b/src/guid.c
index 306c9ff..3156b3b 100644
--- a/src/guid.c
+++ b/src/guid.c
@@ -31,7 +31,7 @@
extern const efi_guid_t efi_guid_zero;
int NONNULL(1, 2) PUBLIC
-efi_guid_cmp(const efi_guid_t *a, const efi_guid_t *b)
+efi_guid_cmp(const void * const a, const void * const b)
{
return memcmp(a, b, sizeof (efi_guid_t));
}
diff --git a/src/include/efivar/efivar.h b/src/include/efivar/efivar.h
index 316891c..ad6449d 100644
--- a/src/include/efivar/efivar.h
+++ b/src/include/efivar/efivar.h
@@ -128,7 +128,7 @@ extern int efi_symbol_to_guid(const char *symbol, efi_guid_t *guid)
extern int efi_guid_is_zero(const efi_guid_t *guid);
extern int efi_guid_is_empty(const efi_guid_t *guid);
-extern int efi_guid_cmp(const efi_guid_t *a, const efi_guid_t *b);
+extern int efi_guid_cmp(const void * const a, const void * const b);
/* import / export functions */
typedef struct efi_variable efi_variable_t;
diff --git a/src/ucs2.h b/src/ucs2.h
index dbb5900..edd8367 100644
--- a/src/ucs2.h
+++ b/src/ucs2.h
@@ -23,16 +23,21 @@
(((val) & ((mask) << (shift))) >> (shift))
static inline size_t UNUSED
-ucs2len(const uint16_t * const s, ssize_t limit)
+ucs2len(const void *vs, ssize_t limit)
{
ssize_t i;
- for (i = 0; i < (limit >= 0 ? limit : i+1) && s[i] != (uint16_t)0; i++)
+ const uint16_t *s = vs;
+ const uint8_t *s8 = vs;
+
+ for (i = 0;
+ i < (limit >= 0 ? limit : i+1) && s8[0] != 0 && s8[1] != 0;
+ i++, s8 += 2, s++)
;
return i;
}
static inline size_t UNUSED
-ucs2size(const uint16_t * const s, ssize_t limit)
+ucs2size(const void *s, ssize_t limit)
{
size_t rc = ucs2len(s, limit);
rc *= sizeof (uint16_t);
@@ -69,10 +74,11 @@ utf8size(uint8_t *s, ssize_t limit)
}
static inline unsigned char * UNUSED
-ucs2_to_utf8(const uint16_t * const chars, ssize_t limit)
+ucs2_to_utf8(const void * const voidchars, ssize_t limit)
{
ssize_t i, j;
unsigned char *ret;
+ const uint16_t * const chars = voidchars;
if (limit < 0)
limit = ucs2len(chars, -1);
@@ -124,10 +130,12 @@ ucs2_to_utf8(const uint16_t * const chars, ssize_t limit)
}
static inline ssize_t UNUSED NONNULL(4)
-utf8_to_ucs2(uint16_t *ucs2, ssize_t size, int terminate, uint8_t *utf8)
+utf8_to_ucs2(void *ucs2void, ssize_t size, int terminate, uint8_t *utf8)
{
ssize_t req;
ssize_t i, j;
+ uint16_t *ucs2 = ucs2void;
+ uint16_t val16;
if (!ucs2 && size > 0) {
errno = EINVAL;
@@ -162,10 +170,13 @@ utf8_to_ucs2(uint16_t *ucs2, ssize_t size, int terminate, uint8_t *utf8)
val = utf8[i] & 0x7f;
i += 1;
}
- ucs2[j] = val;
+ val16 = val;
+ ucs2[j] = val16;
+ }
+ if (terminate) {
+ val16 = 0;
+ ucs2[j++] = val16;
}
- if (terminate)
- ucs2[j++] = (uint16_t)0;
return j;
};
--
2.20.1

View File

@ -0,0 +1,59 @@
From b98ba8921010d03f46704a476c69861515deb1ca Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Mon, 7 Jan 2019 10:30:59 -0500
Subject: [PATCH] dp.h: make format_guid() handle misaligned guid pointers
safely.
GCC 9 adds -Werror=address-of-packed-member, which causes us to see the
build error reported at
https://bugzilla.opensuse.org/show_bug.cgi?id=1120862 .
That bug report shows us the following:
In file included from dp.c:26:
dp.h: In function 'format_vendor_helper':
dp.h:120:37: error: taking address of packed member of 'struct <anonymous>' may result in an unaligned pointer value [-Werror=address-of-packed-member]
120 | format_guid(buf, size, off, label, &dp->hw_vendor.vendor_guid);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
dp.h:74:25: note: in definition of macro 'format_guid'
74 | _rc = efi_guid_to_str(guid, &_guidstr); \
| ^~~~
cc1: all warnings being treated as errors
This patch makes format_guid() use a local variable as a bounce buffer
in the case that the guid we're passed is aligned as chaotic neutral.
Note that this only fixes this instance and there may be others that bz
didn't show because it exited too soon, and I don't have a gcc 9 build
in front of me right now.
Signed-off-by: Peter Jones <pjones@redhat.com>
---
src/dp.h | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/dp.h b/src/dp.h
index aa4e390..20cb608 100644
--- a/src/dp.h
+++ b/src/dp.h
@@ -70,8 +70,15 @@
#define format_guid(buf, size, off, dp_type, guid) ({ \
int _rc; \
char *_guidstr = NULL; \
- \
- _rc = efi_guid_to_str(guid, &_guidstr); \
+ efi_guid_t _guid; \
+ const efi_guid_t * const _guid_p = \
+ likely(__alignof__(guid) == sizeof(guid)) \
+ ? guid \
+ : &_guid; \
+ \
+ if (unlikely(__alignof__(guid) == sizeof(guid))) \
+ memmove(&_guid, guid, sizeof(_guid)); \
+ _rc = efi_guid_to_str(_guid_p, &_guidstr); \
if (_rc < 0) { \
efi_error("could not build %s GUID DP string", \
dp_type); \
--
2.20.1

View File

@ -1,3 +1,28 @@
-------------------------------------------------------------------
Fri Feb 22 08:24:56 UTC 2019 - Gary Ching-Pang Lin <glin@suse.com>
- Update to 37
+ Improve ACPI device path formatting
+ Add support for SOC devices that use FDT as their PCI root node
+ Make devices we can't parse the "device" sysfs link for use
DEV_ABBREV_ONLY
+ Handle SCSI port numbers better
+ Don't require an EUI for NVMe (boo#1100077)
+ Fix the accidental requirement on ACPI UID nodes existing
+ Add support for EMMC devices
+ Add support for PCI root nodes without a device link in sysfs
+ Add support for partitioned MD devices
+ Fix partition number detection when the number isn't provided
+ Add support for ACPI Generic Container and Embedded Controller
root nodes (boo#1101023)
+ Add limited support for SAS/SATA port expanders
- Add upstream patches to fix boo#1120862
+ efivar-make-format_guid-handle-misaligned-guid-pointer.patch
+ efivar-Fix-all-the-places-Werror-address-of-packed-member-c.patch
- Drop upstreamed reproducible.patch
- Refresh libefiboot-export-disk_get_partition_info.patch
- Use %license for COPYING
-------------------------------------------------------------------
Tue Jul 24 07:45:35 UTC 2018 - bwiedemann@suse.com

View File

@ -28,7 +28,7 @@
%define major 1
Name: efivar
Version: 35
Version: 37
Release: 0
Summary: Tools to manage UEFI variables
License: LGPL-2.1-only
@ -36,8 +36,10 @@ Group: Development/Libraries/C and C++
Url: https://github.com/rhinstaller/efivar
Source: https://github.com/rhinstaller/%{name}/releases/download/%{version}/%{name}-%{version}.tar.bz2
Patch0: libefiboot-export-disk_get_partition_info.patch
# PATCH-FIX-UPSTREAM https://github.com/rhboot/efivar/pull/115
Patch1: reproducible.patch
# PATCH-FIX-UPSTREAM boo#1120862
Patch1: efivar-make-format_guid-handle-misaligned-guid-pointer.patch
# PATCH-FIX-UPSTREAM boo#1120862
Patch2: efivar-Fix-all-the-places-Werror-address-of-packed-member-c.patch
%if "0%{?buildroot}" == "0"
# set a sane value for buildroot, unless it's already there!
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@ -81,6 +83,7 @@ perl -pi -e 's{\#include \<uchar\.h\>}{typedef __CHAR16_TYPE__ char16_t;}' \
src/export.c
%endif
%patch1 -p1
%patch2 -p1
%build
CFLAGS="%{optflags} -Wno-nonnull -flto"
@ -115,7 +118,7 @@ file %{buildroot}/%{_libdir}/lib%{name}.so.%{major}*
%files
%defattr(-,root,root)
%doc COPYING
%license COPYING
%{_bindir}/efivar
%{_mandir}/man1/*

View File

@ -1,9 +1,9 @@
Index: efivar-35/src/disk.c
Index: efivar-37/src/disk.c
===================================================================
--- efivar-35.orig/src/disk.c
+++ efivar-35/src/disk.c
@@ -248,6 +248,33 @@ get_partition_info(int fd, uint32_t opti
return rc;
--- efivar-37.orig/src/disk.c
+++ efivar-37/src/disk.c
@@ -256,6 +256,33 @@ is_partitioned(int fd)
return true;
}
+/*
@ -15,7 +15,7 @@ Index: efivar-35/src/disk.c
+ * @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
@ -23,7 +23,7 @@ Index: efivar-35/src/disk.c
+int
+__attribute__((__nonnull__ (3,4,5,6,7)))
+__attribute__((__visibility__ ("default")))
+efi_disk_get_partition_info (int fd,
+efi_disk_get_partition_info (int fd,
+ uint32_t part,
+ uint64_t *start, uint64_t *size,
+ uint8_t *signature,
@ -33,13 +33,13 @@ Index: efivar-35/src/disk.c
+ start, size, signature, mbr_type, signature_type);
+}
+
ssize_t
__attribute__((__visibility__ ("hidden")))
_make_hd_dn(uint8_t *buf, ssize_t size, int fd, uint32_t partition,
Index: efivar-35/src/include/efivar/efiboot-disk.h
ssize_t HIDDEN
make_hd_dn(uint8_t *buf, ssize_t size, int fd, int32_t partition,
uint32_t options)
Index: efivar-37/src/include/efivar/efiboot-disk.h
===================================================================
--- /dev/null
+++ efivar-35/src/include/efivar/efiboot-disk.h
+++ efivar-37/src/include/efivar/efiboot-disk.h
@@ -0,0 +1,32 @@
+/*
+ * libefiboot - library for the manipulation of EFI boot variables
@ -64,7 +64,7 @@ Index: efivar-35/src/include/efivar/efiboot-disk.h
+#ifndef _EFIBOOT_BOOT_H
+#define _EFIBOOT_BOOT_H 1
+
+extern int efi_disk_get_partition_info (int fd,
+extern int efi_disk_get_partition_info (int fd,
+ uint32_t part,
+ uint64_t *start, uint64_t *size,
+ uint8_t *signature,
@ -73,10 +73,10 @@ Index: efivar-35/src/include/efivar/efiboot-disk.h
+ __attribute__((__visibility__ ("default")));
+
+#endif /* _EFIBOOT_BOOT_H */
Index: efivar-35/src/include/efivar/efiboot.h
Index: efivar-37/src/include/efivar/efiboot.h
===================================================================
--- efivar-35.orig/src/include/efivar/efiboot.h
+++ efivar-35/src/include/efivar/efiboot.h
--- efivar-37.orig/src/include/efivar/efiboot.h
+++ efivar-37/src/include/efivar/efiboot.h
@@ -34,5 +34,6 @@
#include <efivar/efiboot-creator.h>
@ -84,10 +84,10 @@ Index: efivar-35/src/include/efivar/efiboot.h
+#include <efivar/efiboot-disk.h>
#endif /* EFIBOOT_H */
Index: efivar-35/src/libefiboot.map.in
Index: efivar-37/src/libefiboot.map.in
===================================================================
--- efivar-35.orig/src/libefiboot.map.in
+++ efivar-35/src/libefiboot.map.in
--- efivar-37.orig/src/libefiboot.map.in
+++ efivar-37/src/libefiboot.map.in
@@ -33,3 +33,7 @@ LIBEFIBOOT_1.29 {
LIBEFIBOOT_1.30 {

View File

@ -1,24 +0,0 @@
From a02f33199a3c28a655178d35188efda71406a6a0 Mon Sep 17 00:00:00 2001
From: "Bernhard M. Wiedemann" <bwiedemann@suse.de>
Date: Tue, 24 Jul 2018 09:34:21 +0200
Subject: [PATCH] makeguids: initialize memory
so that we do not write uninitialized memory into guids.bin and names.bin
which made the resulting libefivar.so.1.36 unreproducible.
See https://reproducible-builds.org/ for why this matters.
---
src/makeguids.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/makeguids.c b/src/makeguids.c
index f84fbb8..a15356b 100644
--- a/src/makeguids.c
+++ b/src/makeguids.c
@@ -147,6 +147,7 @@ main(int argc, char *argv[])
outbuf = realloc(outbuf, line * sizeof (struct guidname));
if (!outbuf)
err(1, "makeguids");
+ memset(outbuf + line - 1, 0, sizeof(struct guidname));
char *symbol = strchr(guidstr, '\t');
if (symbol == NULL)