[PATCH libdrm] Fix void pointer arithmetic in drmProcessPciDevice

Michel Dänzer michel at daenzer.net
Tue Oct 13 20:55:48 PDT 2015


From: Michel Dänzer <michel.daenzer at amd.com>

Arithmetic on void pointers is a GCC extension.

  CC       libdrm_la-xf86drm.lo
../xf86drm.c: In function 'drmProcessPciDevice':
../xf86drm.c:3017:10: warning: pointer of type 'void *' used in arithmetic [-Wpointer-arith]
     addr += sizeof(drmDevice);
          ^
../xf86drm.c:3020:10: warning: pointer of type 'void *' used in arithmetic [-Wpointer-arith]
     addr += DRM_NODE_MAX * sizeof(void *);
          ^
../xf86drm.c:3023:14: warning: pointer of type 'void *' used in arithmetic [-Wpointer-arith]
         addr += max_node_str;
              ^
../xf86drm.c:3035:14: warning: pointer of type 'void *' used in arithmetic [-Wpointer-arith]
         addr += sizeof(drmPciBusInfo);
              ^

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 xf86drm.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/xf86drm.c b/xf86drm.c
index 27313cc..a29db42 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -3001,21 +3001,22 @@ static int drmProcessPciDevice(drmDevicePtr *device, const char *d_name,
 {
     const int max_node_str = drmGetMaxNodeName();
     int ret, i;
-    void *addr;
+    char *addr;
 
-    addr = *device = calloc(1, sizeof(drmDevice) +
-                               (DRM_NODE_MAX *
-                                (sizeof(void *) + max_node_str)) +
-                               sizeof(drmPciBusInfo) +
-                               sizeof(drmPciDeviceInfo));
+    *device = calloc(1, sizeof(drmDevice) +
+		     (DRM_NODE_MAX * (sizeof(void *) + max_node_str)) +
+		     sizeof(drmPciBusInfo) +
+		     sizeof(drmPciDeviceInfo));
     if (!*device)
         return -ENOMEM;
 
+    addr = (char*)*device;
+  
     (*device)->bustype = DRM_BUS_PCI;
     (*device)->available_nodes = 1 << node_type;
 
     addr += sizeof(drmDevice);
-    (*device)->nodes = addr;
+    (*device)->nodes = (char**)addr;
 
     addr += DRM_NODE_MAX * sizeof(void *);
     for (i = 0; i < DRM_NODE_MAX; i++) {
@@ -3024,7 +3025,7 @@ static int drmProcessPciDevice(drmDevicePtr *device, const char *d_name,
     }
     memcpy((*device)->nodes[node_type], node, max_node_str);
 
-    (*device)->businfo.pci = addr;
+    (*device)->businfo.pci = (drmPciBusInfoPtr)addr;
 
     ret = drmParsePciBusInfo(maj, min, (*device)->businfo.pci);
     if (ret)
@@ -3033,7 +3034,7 @@ static int drmProcessPciDevice(drmDevicePtr *device, const char *d_name,
     // Fetch the device info if the user has requested it
     if (fetch_deviceinfo) {
         addr += sizeof(drmPciBusInfo);
-        (*device)->deviceinfo.pci = addr;
+        (*device)->deviceinfo.pci = (drmPciDeviceInfoPtr)addr;
 
         ret = drmParsePciDeviceInfo(d_name, (*device)->deviceinfo.pci);
         if (ret)
-- 
2.6.0



More information about the dri-devel mailing list