diff -Nru freeipmi-1.4.11/debian/changelog freeipmi-1.4.11/debian/changelog --- freeipmi-1.4.11/debian/changelog 2017-01-26 16:43:29.000000000 +0000 +++ freeipmi-1.4.11/debian/changelog 2017-06-30 03:01:05.000000000 +0000 @@ -1,10 +1,17 @@ -freeipmi (1.4.11-1.1ubuntu3~0.16.04) xenial; urgency=medium +freeipmi (1.4.11-1.1ubuntu4~0.16.04) xenial; urgency=medium - * Backport to xenial. - Add ipv6 ipmi-discovery. LP: #1645912. See also: - https://github.com/chu11/freeipmi-mirror/pull/12/commits/32721f88cd37aa4ca1564c243669f96628089986 + * Backport to xenial + Use kernel DMI table interface, when available, instead of trolling + /dev/mem to avoid a crash on ARM. LP: #1699933. - -- LaMont Jones Thu, 26 Jan 2017 09:43:29 -0700 + -- Ike Panhc Fri, 30 Jun 2017 11:01:05 +0800 + +freeipmi (1.4.11-1.1ubuntu4) artful; urgency=medium + + * Use kernel DMI table interface, when available, instead of trolling + /dev/mem to avoid a crash on ARM. LP: #1699933. + + -- dann frazier Wed, 28 Jun 2017 13:26:09 -0600 freeipmi (1.4.11-1.1ubuntu3) zesty; urgency=medium diff -Nru freeipmi-1.4.11/debian/patches/series freeipmi-1.4.11/debian/patches/series --- freeipmi-1.4.11/debian/patches/series 2017-01-24 23:24:42.000000000 +0000 +++ freeipmi-1.4.11/debian/patches/series 2017-06-28 19:26:09.000000000 +0000 @@ -2,3 +2,4 @@ dso-linking.patch ipv6-ipmipower ipv6-ipmi-discovery +Using-DMI-firmware-in-sysfs-if-exists.patch diff -Nru freeipmi-1.4.11/debian/patches/Using-DMI-firmware-in-sysfs-if-exists.patch freeipmi-1.4.11/debian/patches/Using-DMI-firmware-in-sysfs-if-exists.patch --- freeipmi-1.4.11/debian/patches/Using-DMI-firmware-in-sysfs-if-exists.patch 1970-01-01 00:00:00.000000000 +0000 +++ freeipmi-1.4.11/debian/patches/Using-DMI-firmware-in-sysfs-if-exists.patch 2017-06-28 19:25:21.000000000 +0000 @@ -0,0 +1,102 @@ +From 605065165653e025234ebf135bdeb2e6110070ef Mon Sep 17 00:00:00 2001 +From: Ike Panhc +Date: Tue, 27 Jun 2017 16:07:40 +0800 +Subject: [PATCH] Using DMI firmware in sysfs if exists + +On arm64 system scanning /dev/mem for SMBIOS tables might fail and +stopped with SIGBUS. Kernel version > 4.2 provides DMI tables in +/sys/firmware/dmi/tables and it is much safer for ipmi-locate to +read. If it exists, reading from it instead of /dev/mem fix +ipmi-locate crash on several arm64 system. + +Unfortunately mmap() does not work on DMI tables so also fallback to +read if mmap() failed. + +Signed-off-by: Ike Panhc +--- + libfreeipmi/locate/ipmi-locate-dmidecode.c | 28 +++++++++++++++++++++++----- + 1 file changed, 23 insertions(+), 5 deletions(-) + +diff --git a/libfreeipmi/locate/ipmi-locate-dmidecode.c b/libfreeipmi/locate/ipmi-locate-dmidecode.c +index 8a89fc025..db1c47387 100644 +--- a/libfreeipmi/locate/ipmi-locate-dmidecode.c ++++ b/libfreeipmi/locate/ipmi-locate-dmidecode.c +@@ -115,7 +115,6 @@ struct dmi_header + fipmiu16 handle; + }; + +-#ifndef HAVE_MMAP + static int + _myread (ipmi_locate_ctx_t ctx, + int fd, +@@ -155,7 +154,6 @@ _myread (ipmi_locate_ctx_t ctx, + + return (0); + } +-#endif + + static int + _checksum (const fipmiu8 *buf, size_t len) +@@ -233,14 +231,16 @@ _mem_chunk (ipmi_locate_ctx_t ctx, + base - mmoffset)) == MAP_FAILED) + { + LOCATE_ERRNO_TO_LOCATE_ERRNUM (ctx, errno); +- goto cleanup; ++ goto try_read; + } + + memcpy (p, (fipmiu8 *) mmp + mmoffset, len); + rv = p; + /* ignore potential error, just return result */ + munmap (mmp, mmoffset + len); +-#else /* HAVE_MMAP */ ++ goto cleanup; ++ try_read: ++#endif /* HAVE_MMAP */ + + if (lseek (fd, base, SEEK_SET) < 0) + { +@@ -252,7 +252,6 @@ _mem_chunk (ipmi_locate_ctx_t ctx, + goto cleanup; + + rv = p; +-#endif /* HAVE_MMAP */ + + cleanup: + /* ignore potential error, cleanup path */ +@@ -457,6 +456,8 @@ ipmi_locate_dmidecode_get_device_info (ipmi_locate_ctx_t ctx, + char linebuf[64]; + fipmiu8 *buf = NULL; + int rv = -1; ++ static char const sys_fw_dmi_tables[] = "/sys/firmware/dmi/tables/DMI"; ++ struct stat st; + + if (!ctx || ctx->magic != IPMI_LOCATE_CTX_MAGIC) + { +@@ -471,6 +472,23 @@ ipmi_locate_dmidecode_get_device_info (ipmi_locate_ctx_t ctx, + } + + memset (&locate_info, '\0', sizeof (struct ipmi_locate_info)); ++ ++ /* if DMI firmware exist, use it and do not dig into /dev/mem */ ++ if (!(stat (sys_fw_dmi_tables, &st))) ++ { ++ rv = _dmi_table (ctx, ++ 0, ++ st.st_size, ++ st.st_size / 4, ++ 0, ++ sys_fw_dmi_tables, ++ type, ++ &locate_info); ++ if (!(rv)) ++ memcpy (info, &locate_info, sizeof (struct ipmi_locate_info)); ++ return (rv); ++ } ++ + /* + * Linux up to 2.6.6-rc2: /proc/efi/systab + * Linux 2.6.6-rc3 and up: /sys/firmware/efi/systab +-- +2.13.2 +