]> mj.ucw.cz Git - pciutils.git/blobdiff - lib/dump.c
Squashed compiler warnings about code with no effect
[pciutils.git] / lib / dump.c
index 5a5b50eb9f1cce751bff4b02b89c06331945fdb8..04837e64f193304b9270cc4cf84df8a6ca9b8d9b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     The PCI Library -- Reading of Bus Dumps
  *
 /*
  *     The PCI Library -- Reading of Bus Dumps
  *
- *     Copyright (c) 1997--2004 Martin Mares <mj@ucw.cz>
+ *     Copyright (c) 1997--2005 Martin Mares <mj@ucw.cz>
  *
  *     Can be freely distributed and used under the terms of the GNU GPL.
  */
  *
  *     Can be freely distributed and used under the terms of the GNU GPL.
  */
@@ -14,7 +14,7 @@
 #include "internal.h"
 
 struct dump_data {
 #include "internal.h"
 
 struct dump_data {
-  int len;
+  int len, allocated;
   byte data[1];
 };
 
   byte data[1];
 };
 
@@ -28,11 +28,24 @@ static void
 dump_alloc_data(struct pci_dev *dev, int len)
 {
   struct dump_data *dd = pci_malloc(dev->access, sizeof(struct dump_data) + len - 1);
 dump_alloc_data(struct pci_dev *dev, int len)
 {
   struct dump_data *dd = pci_malloc(dev->access, sizeof(struct dump_data) + len - 1);
-  dd->len = len;
+  dd->allocated = len;
+  dd->len = 0;
   memset(dd->data, 0xff, len);
   dev->aux = dd;
 }
 
   memset(dd->data, 0xff, len);
   dev->aux = dd;
 }
 
+static int
+dump_validate(char *s, char *fmt)
+{
+  while (*fmt)
+    {
+      if (*fmt == '#' ? !isxdigit(*s) : *fmt != *s)
+       return 0;
+      fmt++, s++;
+    }
+  return 1;
+}
+
 static void
 dump_init(struct pci_access *a)
 {
 static void
 dump_init(struct pci_access *a)
 {
@@ -56,10 +69,8 @@ dump_init(struct pci_access *a)
        *z-- = 0;
       len = z - buf + 1;
       mn = 0;
        *z-- = 0;
       len = z - buf + 1;
       mn = 0;
-      if ((len >= 8 && buf[2] == ':' && buf[5] == '.' && buf[7] == ' ' &&
-          sscanf(buf, "%x:%x.%d ", &bn, &dn, &fn) == 3) ||
-         (len >= 13 && buf[4] == ':' && buf[7] == ':' && buf[10] == '.' && buf[12] == ' ' &&
-          sscanf(buf, "%x:%x:%x.%d", &mn, &bn, &dn, &fn) == 4))
+      if (dump_validate(buf, "##:##.# ") && sscanf(buf, "%x:%x.%d", &bn, &dn, &fn) == 3 ||
+         dump_validate(buf, "####:##:##.# ") && sscanf(buf, "%x:%x:%x.%d", &mn, &bn, &dn, &fn) == 4)
        {
          dev = pci_get_dev(a, mn, bn, dn, fn);
          dump_alloc_data(dev, 256);
        {
          dev = pci_get_dev(a, mn, bn, dn, fn);
          dump_alloc_data(dev, 256);
@@ -68,19 +79,17 @@ dump_init(struct pci_access *a)
       else if (!len)
        dev = NULL;
       else if (dev &&
       else if (!len)
        dev = NULL;
       else if (dev &&
-              (len >= 51 && buf[2] == ':' && buf[3] == ' ' || len >= 52 && buf[3] == ':' && buf[4] == ' ') &&
+              (dump_validate(buf, "##: ") || dump_validate(buf, "###: ")) &&
               sscanf(buf, "%x: ", &i) == 1)
        {
          struct dump_data *dd = dev->aux;
               sscanf(buf, "%x: ", &i) == 1)
        {
          struct dump_data *dd = dev->aux;
-         z = strchr(buf, ' ');
-         while (isspace(z[0]) && isxdigit(z[1]) && isxdigit(z[2]))
+         z = strchr(buf, ' ') + 1;
+         while (isxdigit(z[0]) && isxdigit(z[1]) && (!z[2] || z[2] == ' ') &&
+                sscanf(z, "%x", &j) == 1 && j < 256)
            {
            {
-             z++;
-             if (sscanf(z, "%x", &j) != 1 || i >= 256)
-               a->error("dump: Malformed line");
              if (i >= 4096)
              if (i >= 4096)
-               break;
-             if (i > dd->len)          /* Need to re-allocate the buffer */
+               a->error("dump: At most 4096 bytes of config space are supported");
+             if (i >= dd->allocated)   /* Need to re-allocate the buffer */
                {
                  dump_alloc_data(dev, 4096);
                  memcpy(((struct dump_data *) dev->aux)->data, dd->data, 256);
                {
                  dump_alloc_data(dev, 4096);
                  memcpy(((struct dump_data *) dev->aux)->data, dd->data, 256);
@@ -88,8 +97,14 @@ dump_init(struct pci_access *a)
                  dd = dev->aux;
                }
              dd->data[i++] = j;
                  dd = dev->aux;
                }
              dd->data[i++] = j;
+             if (i > dd->len)
+               dd->len = i;
              z += 2;
              z += 2;
+             if (*z)
+               z++;
            }
            }
+         if (*z)
+           a->error("dump: Malformed line");
        }
     }
 }
        }
     }
 }
@@ -111,7 +126,7 @@ dump_read(struct pci_dev *d, int pos, byte *buf, int len)
   if (!(dd = d->aux))
     {
       struct pci_dev *e = d->access->devices;
   if (!(dd = d->aux))
     {
       struct pci_dev *e = d->access->devices;
-      while (e && (e->bus != d->bus || e->dev != d->dev || e->func != d->func))
+      while (e && (e->domain != d->domain || e->bus != d->bus || e->dev != d->dev || e->func != d->func))
        e = e->next;
       if (!e)
        return 0;
        e = e->next;
       if (!e)
        return 0;