Hello community,

here is the log from the commit of package biosdevname for openSUSE:Factory 
checked in at 2020-08-23 09:20:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/biosdevname (Old)
 and      /work/SRC/openSUSE:Factory/.biosdevname.new.3399 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "biosdevname"

Sun Aug 23 09:20:27 2020 rev:47 rq:828137 version:0.7.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/biosdevname/biosdevname.changes  2020-01-30 
09:38:52.661409090 +0100
+++ /work/SRC/openSUSE:Factory/.biosdevname.new.3399/biosdevname.changes        
2020-08-23 09:20:29.078662023 +0200
@@ -1,0 +2,14 @@
+Thu Aug 13 16:41:27 UTC 2020 - Michal Suchanek <msucha...@suse.com>
+
+- Add support for SMBIOS 3.
+  * biosdevname-Add-SMBIOS-3.x-support.patch
+- Fix URL in specfile. It should be readable to developers.
+
+-------------------------------------------------------------------
+Thu Aug 13 11:35:43 UTC 2020 - Michal Suchanek <msucha...@suse.com>
+
+- Read DMI info rom sysfs (bsc#1174491).
+  * biosdevname-Add-buffer-read-helper-using-read-explicitly.patch
+  * biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch
+
+-------------------------------------------------------------------

New:
----
  biosdevname-Add-SMBIOS-3.x-support.patch
  biosdevname-Add-buffer-read-helper-using-read-explicitly.patch
  biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ biosdevname.spec ++++++
--- /var/tmp/diff_new_pack.hmADKO/_old  2020-08-23 09:20:29.614662320 +0200
+++ /var/tmp/diff_new_pack.hmADKO/_new  2020-08-23 09:20:29.614662320 +0200
@@ -23,7 +23,7 @@
 Summary:        Udev helper for naming devices per BIOS names
 License:        GPL-2.0-only
 Group:          System/Base
-URL:            https://github.com/dell/%{name}
+URL:            https://github.com/dell/biosdevname
 Source0:        %{name}-%{version}.tar.xz
 Patch1:         ignore-broken-BIOSes
 Patch2:         whitelist-dell
@@ -31,6 +31,9 @@
 Patch4:         biosdevname-pic.patch
 Patch5:         biosdevname-dom0.patch
 Patch6:         dmidecode-prevent-infinite-recursion.patch
+Patch7:         biosdevname-Add-buffer-read-helper-using-read-explicitly.patch
+Patch8:         
biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch
+Patch9:         biosdevname-Add-SMBIOS-3.x-support.patch
 BuildRequires:  automake
 BuildRequires:  pciutils-devel
 BuildRequires:  pkg-config
@@ -65,12 +68,7 @@
 
 %prep
 %setup -q
-%patch1 -p1
-%patch2 -p1
-%patch3 -p1
-%patch4 -p1
-%patch5 -p1
-%patch6 -p1
+%autopatch -p1
 
 %build
 sed -i -e 
's#@@BIOSDEVNAME_RULEDEST@@#'%{_udevrulesdir}'/71-biosdevname.rules#' 
configure.ac

++++++ biosdevname-Add-SMBIOS-3.x-support.patch ++++++
>From 8459b891cdbb2d4691bd188ced5a512be8734d10 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <ti...@suse.de>
Date: Thu, 13 Aug 2020 16:11:06 +0200
Subject: [PATCH 3/3] Add SMBIOS 3.x support

Handle only the path from sysfs for now.

Signed-off-by: Takashi Iwai <ti...@suse.de>
---
 src/dmidecode/dmidecode.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/dmidecode/dmidecode.c b/src/dmidecode/dmidecode.c
index f4c12694ef13..f478cc58aeb6 100644
--- a/src/dmidecode/dmidecode.c
+++ b/src/dmidecode/dmidecode.c
@@ -236,7 +236,7 @@ static int dmi_table(u32 base, u16 len, u16 num, u16 ver, 
const char *devmem, co
        int i=0;
 
        /* Verify SMBIOS version */
-       if (!isvalidsmbios(ver >> 8, ver & 0xFF)) {
+       if (ver && !isvalidsmbios(ver >> 8, ver & 0xFF)) {
                return 0;
        }
 
@@ -253,7 +253,7 @@ static int dmi_table(u32 base, u16 len, u16 num, u16 ver, 
const char *devmem, co
        }
 
        data=buf;
-       while(i<num && data+4<=buf+len) /* 4 is the length of an SMBIOS 
structure header */
+       while((!num || i<num) && data+4<=buf+len) /* 4 is the length of an 
SMBIOS structure header */
        {
                u8 *next;
                struct dmi_header h;
@@ -314,6 +314,14 @@ static int legacy_decode(u8 *buf, const char *devmem, 
const struct libbiosdevnam
        return 0;
 }
 
+/* only from sysfs, handle no base offset */
+static int smbios3_decode(u8 *buf, const char *devmem, const struct 
libbiosdevname_state *state)
+{
+       if (checksum(buf, 0x18))
+               return dmi_table(0, DWORD(buf + 0x0c), 0, 0, devmem, state, 1);
+       return 0;
+}
+
 #define SYSFS_TABLE_SMBIOS     "/sys/firmware/dmi/tables/smbios_entry_point"
 #define SYSFS_TABLE_DMI                "/sys/firmware/dmi/tables/DMI"
 
@@ -330,6 +338,8 @@ static int smibios_decode_from_sysfs(const struct 
libbiosdevname_state *state)
        fclose(fp);
        if (len == 0x1f && memcmp(buf, "_SM_", 4) == 0)
                return smbios_decode(buf, SYSFS_TABLE_DMI, state, 1);
+       if (len >= 0x18 && memcmp(buf, "_SM3_", 5) == 0)
+               return smbios3_decode(buf, SYSFS_TABLE_DMI, state);
        return 0;
 }
 
-- 
2.16.4

++++++ biosdevname-Add-buffer-read-helper-using-read-explicitly.patch ++++++
>From 2a6b7a70e15a0b7aae4fb9de2630f3ae1b4de64e Mon Sep 17 00:00:00 2001
From: Takashi Iwai <ti...@suse.de>
Date: Thu, 13 Aug 2020 13:21:59 +0200
Subject: [PATCH 1/3] Add buffer read helper using read explicitly

Since mmap can't work well with a sysfs file, we need to read the
contents explicitly via read, even if USE_MMAP is enabled.
Provide a new helper, __mem_cunk(), that does behave like mem_chunk()
but with the extra use_mmap argument to specify the method to read a
file.

Signed-off-by: Takashi Iwai <ti...@suse.de>
---
 src/dmidecode/util.c | 82 +++++++++++++++++++++++++++++++++-------------------
 src/dmidecode/util.h |  1 +
 2 files changed, 53 insertions(+), 30 deletions(-)

diff --git a/src/dmidecode/util.c b/src/dmidecode/util.c
index ea06663d3664..09934eabcf24 100644
--- a/src/dmidecode/util.c
+++ b/src/dmidecode/util.c
@@ -47,7 +47,6 @@
 #include "types.h"
 #include "util.h"
 
-#ifndef USE_MMAP
 static int myread(int fd, u8 *buf, size_t count, const char *prefix)
 {
        ssize_t r=1;
@@ -78,7 +77,6 @@ static int myread(int fd, u8 *buf, size_t count, const char 
*prefix)
        
        return 0;
 }
-#endif
 
 int checksum(const u8 *buf, size_t len)
 {
@@ -94,28 +92,13 @@ int checksum(const u8 *buf, size_t len)
  * Copy a physical memory chunk into a memory buffer.
  * This function allocates memory.
  */
-void *mem_chunk(size_t base, size_t len, const char *devmem)
-{
-       void *p;
-       int fd;
 #ifdef USE_MMAP
+static void *mem_chunk_mmap(size_t base, size_t len, const char *devmem,
+                           int fd, void *p)
+{
        size_t mmoffset;
        void *mmp;
-#endif
-       
-       if((fd=open(devmem, O_RDONLY))==-1)
-       {
-               return NULL;
-       }
-       
-       if((p=malloc(len))==NULL)
-       {
-               perror("malloc");
-               close(fd);
-               return NULL;
-       }
-       
-#ifdef USE_MMAP
+
 #ifdef _SC_PAGESIZE
        mmoffset=base%sysconf(_SC_PAGESIZE);
 #else
@@ -129,8 +112,6 @@ void *mem_chunk(size_t base, size_t len, const char *devmem)
        mmp=mmap(0, mmoffset+len, PROT_READ, MAP_SHARED, fd, base-mmoffset);
        if(mmp==MAP_FAILED)
        {
-               free(p);
-               close(fd);
                return NULL;
        }
        
@@ -141,26 +122,67 @@ void *mem_chunk(size_t base, size_t len, const char 
*devmem)
                fprintf(stderr, "%s: ", devmem);
                perror("munmap");
        }
-#else /* USE_MMAP */
+
+       return p;
+}
+#endif /* USE_MMAP */
+
+static void *mem_chunk_read(size_t base, size_t len, const char *devmem,
+                           int fd, void *p)
+{
        if(lseek(fd, base, SEEK_SET)==-1)
        {
                fprintf(stderr, "%s: ", devmem);
                perror("lseek");
-               free(p);
-               close(fd);
                return NULL;
        }
        
        if(myread(fd, p, len, devmem)==-1)
        {
-               free(p);
-               close(fd);
                return NULL;
        }
-#endif /* USE_MMAP */
+
+       return p;
+}
+
+void *__mem_chunk(size_t base, size_t len, const char *devmem, int use_mmap)
+{
+       void *ret;
+       void *p;
+       int fd;
+
+#ifndef USE_MMAP
+       use_mmap = 0;
+#endif
+
+       if((fd=open(devmem, O_RDONLY))==-1)
+       {
+               return NULL;
+       }
        
+       if((p=malloc(len))==NULL)
+       {
+               perror("malloc");
+               close(fd);
+               return NULL;
+       }
+
+#ifdef USE_MMAP
+       if (use_mmap)
+               ret = mem_chunk_mmap(base, len, devmem, fd, p);
+       else
+#endif
+               ret = mem_chunk_read(base, len, devmem, fd, p);
+
        if(close(fd)==-1)
                perror(devmem);
+       if (!ret)
+               free(p);
 
-       return p;
+       return ret;
+}
+
+void *mem_chunk(size_t base, size_t len, const char *devmem)
+{
+       return __mem_chunk(base, len, devmem, 1);
 }
diff --git a/src/dmidecode/util.h b/src/dmidecode/util.h
index b546f64f3685..90c411e7bf9b 100644
--- a/src/dmidecode/util.h
+++ b/src/dmidecode/util.h
@@ -6,3 +6,4 @@
 
 int checksum(const u8 *buf, size_t len);
 void *mem_chunk(size_t base, size_t len, const char *devmem);
+void *__mem_chunk(size_t base, size_t len, const char *devmem, int use_mmap);
-- 
2.16.4

++++++ biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch 
++++++
>From 345ea79e5f020e9776ba8de64b2dccad9df56584 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <ti...@suse.de>
Date: Thu, 13 Aug 2020 13:24:35 +0200
Subject: [PATCH 2/3] Read DMI entries from /sys/firmware/dmi/tables/DMI

A kernel with Secure Boot lockdown may prohibit reading the contents
of /dev/mem, hence biosdevname fails.  The recent kernel provides the
DMI byte contents in /sys/firmware/dmi/tables/*, and we can use this
instead of poking /dev/mem.

Signed-off-by: Takashi Iwai <ti...@suse.de>
---
 src/dmidecode/dmidecode.c | 54 +++++++++++++++++++++++++++++++++++------------
 1 file changed, 41 insertions(+), 13 deletions(-)

diff --git a/src/dmidecode/dmidecode.c b/src/dmidecode/dmidecode.c
index a01a6ce074f1..f4c12694ef13 100644
--- a/src/dmidecode/dmidecode.c
+++ b/src/dmidecode/dmidecode.c
@@ -229,7 +229,7 @@ static int isvalidsmbios(int mjr, int mnr)
        return 0;
 }
 
-static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, 
const struct libbiosdevname_state *state)
+static int dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, 
const struct libbiosdevname_state *state, int sysfs)
 {
        u8 *buf;
        u8 *data;
@@ -237,14 +237,19 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 
ver, const char *devmem, c
 
        /* Verify SMBIOS version */
        if (!isvalidsmbios(ver >> 8, ver & 0xFF)) {
-               return;
+               return 0;
        }
-       if((buf=mem_chunk(base, len, devmem))==NULL)
+
+       if (sysfs)
+               buf = __mem_chunk(0, len, devmem, 0);
+       else
+               buf = mem_chunk(base, len, devmem);
+       if(buf == NULL)
        {
 #ifndef USE_MMAP
                printf("Table is unreachable, sorry. Try compiling dmidecode 
with -DUSE_MMAP.\n");
 #endif
-               return;
+               return 0;
        }
 
        data=buf;
@@ -280,18 +285,18 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 
ver, const char *devmem, c
                i++;
        }
        free(buf);
+       return 1;
 }
 
-
-static int smbios_decode(u8 *buf, const char *devmem, const struct 
libbiosdevname_state *state)
+static int smbios_decode(u8 *buf, const char *devmem, const struct 
libbiosdevname_state *state, int sysfs)
 {
        if(checksum(buf, buf[0x05])
           && memcmp(buf+0x10, "_DMI_", 5)==0
           && checksum(buf+0x10, 0x0F))
        {
-               dmi_table(DWORD(buf+0x18), WORD(buf+0x16), WORD(buf+0x1C),
-                         (buf[0x06]<<8)+buf[0x07], devmem, state);
-               return 1;
+               return dmi_table(DWORD(buf+0x18), WORD(buf+0x16), 
WORD(buf+0x1C),
+                                (buf[0x06]<<8)+buf[0x07], devmem, state,
+                                sysfs);
        }
 
        return 0;
@@ -302,13 +307,32 @@ static int legacy_decode(u8 *buf, const char *devmem, 
const struct libbiosdevnam
        if(checksum(buf, 0x0F))
        {
                dmi_table(DWORD(buf+0x08), WORD(buf+0x06), WORD(buf+0x0C),
-                         ((buf[0x0E]&0xF0)<<4)+(buf[0x0E]&0x0F), devmem, 
state);
+                         ((buf[0x0E]&0xF0)<<4)+(buf[0x0E]&0x0F), devmem, 
state, 0);
                return 1;
        }
 
        return 0;
 }
 
+#define SYSFS_TABLE_SMBIOS     "/sys/firmware/dmi/tables/smbios_entry_point"
+#define SYSFS_TABLE_DMI                "/sys/firmware/dmi/tables/DMI"
+
+static int smibios_decode_from_sysfs(const struct libbiosdevname_state *state)
+{
+       FILE *fp;
+       u8 buf[0x1f];
+       int len;
+
+       fp = fopen(SYSFS_TABLE_SMBIOS, "r");
+       if (!fp)
+               return 0;
+       len = fread(buf, 1, sizeof(buf), fp);
+       fclose(fp);
+       if (len == 0x1f && memcmp(buf, "_SM_", 4) == 0)
+               return smbios_decode(buf, SYSFS_TABLE_DMI, state, 1);
+       return 0;
+}
+
 /*
  * Probe for EFI interface
  */
@@ -417,7 +441,11 @@ int dmidecode_main(const struct libbiosdevname_state 
*state)
        if (dmidecode_read_file(state))
                return 0;
 
-       /* First try EFI (ia64, Intel-based Mac) */
+       /* First try sysfs entries */
+       if (smibios_decode_from_sysfs(state))
+               return 0;
+
+       /* Next try EFI (ia64, Intel-based Mac) */
        efi=address_from_efi(&fp);
        switch(efi)
        {
@@ -434,7 +462,7 @@ int dmidecode_main(const struct libbiosdevname_state *state)
                goto exit_free;
        }
 
-       if(smbios_decode(buf, devmem, state))
+       if(smbios_decode(buf, devmem, state, 0))
                found++;
        goto done;
 
@@ -450,7 +478,7 @@ memory_scan:
        {
                if(memcmp(buf+fp, "_SM_", 4)==0 && fp<=0xFFE0)
                {
-                       if(smbios_decode(buf+fp, devmem, state))
+                       if(smbios_decode(buf+fp, devmem, state, 0))
                        {
                                found++;
                                fp+=16;
-- 
2.16.4


Reply via email to