[PATCH libdrm] Fix void pointer arithmetic in drmProcessPciDevice

Alex Deucher alexdeucher at gmail.com
Wed Oct 14 08:44:10 PDT 2015


On Tue, Oct 13, 2015 at 11:55 PM, Michel Dänzer <michel at daenzer.net> wrote:
> 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>

Reviewed-by: Alex Deucher <alexander.deucher 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
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list