Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package lshw

The version in unstable contains two RC bug fixes.

Closes: 740034 757689
Changes:
 lshw (02.17-1.1) unstable; urgency=medium
 .
   * Non-maintainer upload.
   * Disable the memory scanning for all architectures other
     than i386 and x86_64. Patch from Leif Lindholm
     <unixsm...@gmail.com> (Closes: #740034)
   * Prevent segfault if system has FAT partition(s) Patch from
     Alban Browaeys <pra...@yahoo.com> (Closes: #757689)

debdiff against version in testing is attached.

Thanks.

unblock lshw/02.17-1.1

-- System Information:
Debian Release: jessie/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (1, 
'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
armhf
arm64

Kernel: Linux 3.16-3-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8) (ignored: LC_ALL 
set to en_GB.UTF-8)
Shell: /bin/sh linked to /bin/dash
diffstat for lshw_02.17-1 lshw_02.17-1.1

 debian/patches/fat-inspection.patch |   10 ++
 debian/patches/smbios-noscan.patch  |  178 ++++++++++++++++++++++++++++++++++++
 lshw-02.17/debian/changelog         |   11 ++
 lshw-02.17/debian/patches/series    |    2 
 4 files changed, 201 insertions(+)

diff -u lshw-02.17/debian/changelog lshw-02.17/debian/changelog
--- lshw-02.17/debian/changelog
+++ lshw-02.17/debian/changelog
@@ -1,3 +1,14 @@
+lshw (02.17-1.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * Disable the memory scanning for all architectures other
+    than i386 and x86_64. Patch from Leif Lindholm
+    <unixsm...@gmail.com> (Closes: #740034)
+  * Prevent segfault if system has FAT partition(s) Patch from
+    Alban Browaeys <pra...@yahoo.com> (Closes: #757689)
+
+ -- Neil Williams <codeh...@debian.org>  Thu, 06 Nov 2014 12:16:13 +0000
+
 lshw (02.17-1) unstable; urgency=medium
 
   [ Alex Henrie ]
diff -u lshw-02.17/debian/patches/series lshw-02.17/debian/patches/series
--- lshw-02.17/debian/patches/series
+++ lshw-02.17/debian/patches/series
@@ -12,0 +13,2 @@
+smbios-noscan.patch
+fat-inspection.patch
only in patch2:
unchanged:
--- lshw-02.17.orig/debian/patches/fat-inspection.patch
+++ lshw-02.17/debian/patches/fat-inspection.patch
@@ -0,0 +1,10 @@
+--- a/src/core/fat.cc
++++ b/src/core/fat.cc
+@@ -81,6 +81,7 @@
+ 			uint8_t dummy2[164];
+ 			uint8_t pmagic[2];
+ 		} __attribute__((__packed__)) fat32;
++		char sector[512];	// to make sure the whole struct is at least 512 bytes long
+ 	} __attribute__((__packed__)) type;
+ } __attribute__((__packed__));
+ 
only in patch2:
unchanged:
--- lshw-02.17.orig/debian/patches/smbios-noscan.patch
+++ lshw-02.17/debian/patches/smbios-noscan.patch
@@ -0,0 +1,178 @@
+--- a/src/core/dmi.cc
++++ b/src/core/dmi.cc
+@@ -1717,9 +1717,56 @@
+ }
+ 
+ 
+-long get_efi_systab_smbios()
++struct dmi_info {
++  u8 smmajver;
++  u8 smminver;
++  u16 dmimaj;
++  u16 dmimin;
++};
++
++
++static bool parse_dmi_header(u32 addr, int fd, hwNode & n, struct dmi_info *dmi)
++{
++  unsigned char buf[20];
++  u32 mmoffset = 0;
++  void *mmp = NULL;
++
++  mmoffset = addr % getpagesize();
++  mmp = mmap(0, mmoffset + 0x20, PROT_READ, MAP_SHARED, fd, addr - mmoffset);
++  memset(buf, 0, sizeof(buf));
++  if (mmp != MAP_FAILED)
++  {
++    memcpy(buf, (u8 *) mmp + mmoffset, sizeof(buf));
++    munmap(mmp, mmoffset + 0x20);
++  }
++  if (mmp == MAP_FAILED)
++  {
++    return false;
++  }
++  else if (memcmp(buf, "_SM_", 4) == 0)
++  {
++    // SMBIOS
++    dmi->smmajver = buf[6];
++    dmi->smminver = buf[7];
++  }
++  else if (dmi->smmajver && (memcmp(buf, "_DMI_", 5) == 0)
++           && checksum(buf, 0x0F))
++  {
++    u16 num = buf[13] << 8 | buf[12];
++    u16 len = buf[7] << 8 | buf[6];
++    u32 base = buf[11] << 24 | buf[10] << 16 | buf[9] << 8 | buf[8];
++    dmi->dmimaj = buf[14] ? buf[14] >> 4 : dmi->smmajver;
++    dmi->dmimin = buf[14] ? buf[14] & 0x0F : dmi->smminver;
++    dmi_table(fd, base, len, num, n, dmi->dmimaj, dmi->dmimin);
++  }
++
++  return true;
++}
++
++
++u32 get_efi_systab_smbios()
+ {
+-  long result = 0;
++  u32 result = 0;
+   vector < string > sysvars;
+ 
+   if (loadfile("/sys/firmware/efi/systab", sysvars) || loadfile("/proc/efi/systab", sysvars))
+@@ -1731,7 +1778,8 @@
+ 
+     if ((variable[0] == "SMBIOS") && (variable.size() == 2))
+     {
+-      sscanf(variable[1].c_str(), "%lx", &result);
++      sscanf(variable[1].c_str(), "%x", &result);
++      break;
+     }
+   }
+ 
+@@ -1741,20 +1789,11 @@
+ 
+ bool scan_dmi(hwNode & n)
+ {
+-  unsigned char buf[20];
+-  int fd = open("/dev/mem",
+-    O_RDONLY);
+-  long fp = get_efi_systab_smbios();
+-  u32 mmoffset = 0;
+-  void *mmp = NULL;
+-  bool efi = true;
+-  u8 smmajver = 0, smminver = 0;
+-  u16 dmimaj = 0, dmimin = 0;
++  int fd = open("/dev/mem", O_RDONLY);
++  u32 fp = get_efi_systab_smbios();
++  struct dmi_info dmi = {0, 0, 0, 0};
+   currentcpu = 0;
+-
+-#if defined(__arm__) || defined (__hppa__) 
+-  return false;		// SMBIOS not supported on PA-RISC and ARM machines
+-#endif
++  bool ret = false;
+ 
+   if (sizeof(u8) != 1 || sizeof(u16) != 2 || sizeof(u32) != 4)
+ // compiler incompatibility
+@@ -1762,61 +1801,40 @@
+   if (fd == -1)
+     return false;
+ 
+-  if (fp <= 0)
++  if (fp != 0)
+   {
+-    efi = false;
+-    fp = 0xE0000L;                                /* default value for non-EFI capable platforms */
++    ret = parse_dmi_header(fp, fd, n, &dmi);
+   }
+-
+-  fp -= 16;
+-  while (efi || (fp < 0xFFFE0))
++  else
+   {
+-    fp += 16;
+-    mmoffset = fp % getpagesize();
+-    mmp = mmap(0, mmoffset + 0x20, PROT_READ, MAP_SHARED, fd, fp - mmoffset);
+-    memset(buf, 0, sizeof(buf));
+-    if (mmp != MAP_FAILED)
+-    {
+-      memcpy(buf, (u8 *) mmp + mmoffset, sizeof(buf));
+-      munmap(mmp, mmoffset + 0x20);
+-    }
+-    if (mmp == MAP_FAILED)
++#if defined(__i386__) || defined (__x86_64__)
++    // 0xF0000-0xFFFF0 is the search tange for non-(U)EFI platforms,
++    for (fp = 0xF0000L; fp <= 0xFFFF0 ; fp +=0x10)
+     {
+-      close(fd);
+-      return false;
+-    }
+-    else if (memcmp(buf, "_SM_", 4) == 0)
+-    {
+-// SMBIOS
+-      smmajver = buf[6];
+-      smminver = buf[7];
+-    }
+-    else if (smmajver && (memcmp(buf, "_DMI_", 5) == 0) && checksum(buf, 0x0F))
+-    {
+-      u16 num = buf[13] << 8 | buf[12];
+-      u16 len = buf[7] << 8 | buf[6];
+-      u32 base = buf[11] << 24 | buf[10] << 16 | buf[9] << 8 | buf[8];
+-      dmimaj = buf[14] ? buf[14] >> 4 : smmajver;
+-      dmimin = buf[14] ? buf[14] & 0x0F : smminver;
+-      dmi_table(fd, base, len, num, n, dmimaj, dmimin);
+-
+-      if (efi)
+-        break;                                    // we don't need to search the memory for EFI systems
++      ret = parse_dmi_header(fp, fd, n, &dmi);
++      if (dmi.smmajver + dmi.dmimaj != 0)
++        break;
+     }
++#else // ! (defined(__i386__) || defined (__x86_64__))
++    // Only x86 platforms can scan memory for table
++    ret = false;
++#endif
+   }
++
+   close(fd);
+-  if (smmajver != 0)
++
++  if (dmi.smmajver != 0)
+   {
+     char buffer[20];
+-    snprintf(buffer, sizeof(buffer), "%d.%d", smmajver, smminver);
++    snprintf(buffer, sizeof(buffer), "%d.%d", dmi.smmajver, dmi.smminver);
+     n.addCapability("smbios-"+string(buffer), "SMBIOS version "+string(buffer));
+   }
+-  if (dmimaj != 0)
++  if (dmi.dmimaj != 0)
+   {
+     char buffer[20];
+-    snprintf(buffer, sizeof(buffer), "%d.%d", dmimaj, dmimin);
++    snprintf(buffer, sizeof(buffer), "%d.%d", dmi.dmimaj, dmi.dmimin);
+     n.addCapability("dmi-"+string(buffer), "DMI version "+string(buffer));
+   }
+ 
+-  return true;
++  return ret;
+ }

Reply via email to