[PATCH 4/4] xf86drm: Unconditionally clear ioctl structs

Jan Vesely jan.vesely at rutgers.edu
Wed Feb 11 07:57:08 PST 2015


On Wed, 2015-02-11 at 12:42 +0100, Daniel Vetter wrote:
> We really have to do this to avoid surprises when extending the ABI
> later on. Especially when growing the structures.
> 
> A bit overkill to update all the old legacy ioctl wrappers, but can't
> hurt really either.
> 
> Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
> ---
>  xf86drm.c | 112 ++++++++++++++++++++++++++++++++++++++++++--------------------
>  1 file changed, 77 insertions(+), 35 deletions(-)
> 
> diff --git a/xf86drm.c b/xf86drm.c
> index 263d6835c29a..a2e24eb5f76c 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -89,6 +89,8 @@
>  #define DRM_NODE_PRIMARY 1
>  #define DRM_NODE_RENDER 2
>  
> +#define memclear(s) memset(&s, 0, sizeof(s))
> +
>  static drmServerInfoPtr drm_server_info;
>  
>  void drmSetServerInfo(drmServerInfoPtr info)
> @@ -766,12 +768,7 @@ drmVersionPtr drmGetVersion(int fd)
>      drmVersionPtr retval;
>      drm_version_t *version = drmMalloc(sizeof(*version));
>  
> -    version->name_len    = 0;
> -    version->name        = NULL;
> -    version->date_len    = 0;
> -    version->date        = NULL;
> -    version->desc_len    = 0;
> -    version->desc        = NULL;
> +    memclear(version);

I think this should be memclear(*version).
Otherwise it clears the pointer not the structure.


>  
>      if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) {
>  	drmFreeKernelVersion(version);
> @@ -839,9 +836,12 @@ drmVersionPtr drmGetLibVersion(int fd)
>  
>  int drmGetCap(int fd, uint64_t capability, uint64_t *value)
>  {
> -	struct drm_get_cap cap = { capability, 0 };
> +	struct drm_get_cap cap;
>  	int ret;
>  
> +	memclear(cap);
> +	cap.capability = capability;
> +
>  	ret = drmIoctl(fd, DRM_IOCTL_GET_CAP, &cap);
>  	if (ret)
>  		return ret;
> @@ -852,7 +852,11 @@ int drmGetCap(int fd, uint64_t capability, uint64_t *value)
>  
>  int drmSetClientCap(int fd, uint64_t capability, uint64_t value)
>  {
> -	struct drm_set_client_cap cap  = { capability, value };
> +	struct drm_set_client_cap cap;
> +
> +	memclear(cap);
> +	cap.capability = capability;
> +	cap.value = value;
>  
>  	return drmIoctl(fd, DRM_IOCTL_SET_CLIENT_CAP, &cap);
>  }
> @@ -887,8 +891,7 @@ char *drmGetBusid(int fd)
>  {
>      drm_unique_t u;
>  
> -    u.unique_len = 0;
> -    u.unique     = NULL;
> +    memclear(u);
>  
>      if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u))
>  	return NULL;
> @@ -917,6 +920,7 @@ int drmSetBusid(int fd, const char *busid)
>  {
>      drm_unique_t u;
>  
> +    memclear(u);
>      u.unique     = (char *)busid;
>      u.unique_len = strlen(busid);
>  
> @@ -930,6 +934,8 @@ int drmGetMagic(int fd, drm_magic_t * magic)
>  {
>      drm_auth_t auth;
>  
> +    memclear(auth);
> +
>      *magic = 0;
>      if (drmIoctl(fd, DRM_IOCTL_GET_MAGIC, &auth))
>  	return -errno;
> @@ -941,6 +947,7 @@ int drmAuthMagic(int fd, drm_magic_t magic)
>  {
>      drm_auth_t auth;
>  
> +    memclear(auth);
>      auth.magic = magic;
>      if (drmIoctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth))
>  	return -errno;
> @@ -1002,9 +1009,9 @@ int drmAddMap(int fd, drm_handle_t offset, drmSize size, drmMapType type,
>  {
>      drm_map_t map;
>  
> +    memclear(map);
>      map.offset  = offset;
>      map.size    = size;
> -    map.handle  = 0;
>      map.type    = type;
>      map.flags   = flags;
>      if (drmIoctl(fd, DRM_IOCTL_ADD_MAP, &map))
> @@ -1018,6 +1025,7 @@ int drmRmMap(int fd, drm_handle_t handle)
>  {
>      drm_map_t map;
>  
> +    memclear(map);
>      map.handle = (void *)(uintptr_t)handle;
>  
>      if(drmIoctl(fd, DRM_IOCTL_RM_MAP, &map))
> @@ -1046,10 +1054,9 @@ int drmAddBufs(int fd, int count, int size, drmBufDescFlags flags,
>  {
>      drm_buf_desc_t request;
>  
> +    memclear(request);
>      request.count     = count;
>      request.size      = size;
> -    request.low_mark  = 0;
> -    request.high_mark = 0;
>      request.flags     = flags;
>      request.agp_start = agp_offset;
>  
> @@ -1063,8 +1070,7 @@ int drmMarkBufs(int fd, double low, double high)
>      drm_buf_info_t info;
>      int            i;
>  
> -    info.count = 0;
> -    info.list  = NULL;
> +    memclear(info);
>  
>      if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info))
>  	return -EINVAL;
> @@ -1114,6 +1120,7 @@ int drmFreeBufs(int fd, int count, int *list)
>  {
>      drm_buf_free_t request;
>  
> +    memclear(request);
>      request.count = count;
>      request.list  = list;
>      if (drmIoctl(fd, DRM_IOCTL_FREE_BUFS, &request))
> @@ -1202,8 +1209,7 @@ drmBufInfoPtr drmGetBufInfo(int fd)
>      drmBufInfoPtr  retval;
>      int            i;
>  
> -    info.count = 0;
> -    info.list  = NULL;
> +    memclear(info);
>  
>      if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info))
>  	return NULL;
> @@ -1253,9 +1259,7 @@ drmBufMapPtr drmMapBufs(int fd)
>      drmBufMapPtr  retval;
>      int           i;
>  
> -    bufs.count = 0;
> -    bufs.list  = NULL;
> -    bufs.virtual = NULL;
> +    memclear(bufs);
>      if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs))
>  	return NULL;
>  
> @@ -1371,6 +1375,7 @@ int drmGetLock(int fd, drm_context_t context, drmLockFlags flags)
>  {
>      drm_lock_t lock;
>  
> +    memclear(lock);
>      lock.context = context;
>      lock.flags   = 0;
>      if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
> @@ -1401,8 +1406,8 @@ int drmUnlock(int fd, drm_context_t context)
>  {
>      drm_lock_t lock;
>  
> +    memclear(lock);
>      lock.context = context;
> -    lock.flags   = 0;
>      return drmIoctl(fd, DRM_IOCTL_UNLOCK, &lock);
>  }
>  
> @@ -1413,8 +1418,7 @@ drm_context_t *drmGetReservedContextList(int fd, int *count)
>      drm_context_t * retval;
>      int           i;
>  
> -    res.count    = 0;
> -    res.contexts = NULL;
> +    memclear(res);
>      if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res))
>  	return NULL;
>  
> @@ -1467,7 +1471,7 @@ int drmCreateContext(int fd, drm_context_t *handle)
>  {
>      drm_ctx_t ctx;
>  
> -    ctx.flags = 0;	/* Modified with functions below */
> +    memclear(ctx);
>      if (drmIoctl(fd, DRM_IOCTL_ADD_CTX, &ctx))
>  	return -errno;
>      *handle = ctx.handle;
> @@ -1478,6 +1482,7 @@ int drmSwitchToContext(int fd, drm_context_t context)
>  {
>      drm_ctx_t ctx;
>  
> +    memclear(ctx);
>      ctx.handle = context;
>      if (drmIoctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx))
>  	return -errno;
> @@ -1494,8 +1499,8 @@ int drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags)
>       * X server (which promises to maintain hardware context), or in the
>       * client-side library when buffers are swapped on behalf of two threads.
>       */
> +    memclear(ctx);
>      ctx.handle = context;
> -    ctx.flags  = 0;
>      if (flags & DRM_CONTEXT_PRESERVED)
>  	ctx.flags |= _DRM_CONTEXT_PRESERVED;
>      if (flags & DRM_CONTEXT_2DONLY)
> @@ -1510,6 +1515,7 @@ int drmGetContextFlags(int fd, drm_context_t context,
>  {
>      drm_ctx_t ctx;
>  
> +    memclear(ctx);
>      ctx.handle = context;
>      if (drmIoctl(fd, DRM_IOCTL_GET_CTX, &ctx))
>  	return -errno;
> @@ -1541,6 +1547,8 @@ int drmGetContextFlags(int fd, drm_context_t context,
>  int drmDestroyContext(int fd, drm_context_t handle)
>  {
>      drm_ctx_t ctx;
> +
> +    memclear(ctx);
>      ctx.handle = handle;
>      if (drmIoctl(fd, DRM_IOCTL_RM_CTX, &ctx))
>  	return -errno;
> @@ -1550,6 +1558,8 @@ int drmDestroyContext(int fd, drm_context_t handle)
>  int drmCreateDrawable(int fd, drm_drawable_t *handle)
>  {
>      drm_draw_t draw;
> +
> +    memclear(draw);
>      if (drmIoctl(fd, DRM_IOCTL_ADD_DRAW, &draw))
>  	return -errno;
>      *handle = draw.handle;
> @@ -1559,6 +1569,8 @@ int drmCreateDrawable(int fd, drm_drawable_t *handle)
>  int drmDestroyDrawable(int fd, drm_drawable_t handle)
>  {
>      drm_draw_t draw;
> +
> +    memclear(draw);
>      draw.handle = handle;
>      if (drmIoctl(fd, DRM_IOCTL_RM_DRAW, &draw))
>  	return -errno;
> @@ -1571,6 +1583,7 @@ int drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
>  {
>      drm_update_draw_t update;
>  
> +    memclear(update);
>      update.handle = handle;
>      update.type = type;
>      update.num = num;
> @@ -1636,6 +1649,7 @@ int drmAgpEnable(int fd, unsigned long mode)
>  {
>      drm_agp_mode_t m;
>  
> +    memclear(mode);
>      m.mode = mode;
>      if (drmIoctl(fd, DRM_IOCTL_AGP_ENABLE, &m))
>  	return -errno;
> @@ -1664,9 +1678,9 @@ int drmAgpAlloc(int fd, unsigned long size, unsigned long type,
>  {
>      drm_agp_buffer_t b;
>  
> +    memclear(b);
>      *handle = DRM_AGP_NO_HANDLE;
>      b.size   = size;
> -    b.handle = 0;
>      b.type   = type;
>      if (drmIoctl(fd, DRM_IOCTL_AGP_ALLOC, &b))
>  	return -errno;
> @@ -1693,7 +1707,7 @@ int drmAgpFree(int fd, drm_handle_t handle)
>  {
>      drm_agp_buffer_t b;
>  
> -    b.size   = 0;
> +    memclear(b);
>      b.handle = handle;
>      if (drmIoctl(fd, DRM_IOCTL_AGP_FREE, &b))
>  	return -errno;
> @@ -1718,6 +1732,7 @@ int drmAgpBind(int fd, drm_handle_t handle, unsigned long offset)
>  {
>      drm_agp_binding_t b;
>  
> +    memclear(b);
>      b.handle = handle;
>      b.offset = offset;
>      if (drmIoctl(fd, DRM_IOCTL_AGP_BIND, &b))
> @@ -1742,8 +1757,8 @@ int drmAgpUnbind(int fd, drm_handle_t handle)
>  {
>      drm_agp_binding_t b;
>  
> +    memclear(b);
>      b.handle = handle;
> -    b.offset = 0;
>      if (drmIoctl(fd, DRM_IOCTL_AGP_UNBIND, &b))
>  	return -errno;
>      return 0;
> @@ -1765,6 +1780,8 @@ int drmAgpVersionMajor(int fd)
>  {
>      drm_agp_info_t i;
>  
> +    memclear(i);
> +
>      if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
>  	return -errno;
>      return i.agp_version_major;
> @@ -1786,6 +1803,8 @@ int drmAgpVersionMinor(int fd)
>  {
>      drm_agp_info_t i;
>  
> +    memclear(i);
> +
>      if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
>  	return -errno;
>      return i.agp_version_minor;
> @@ -1807,6 +1826,8 @@ unsigned long drmAgpGetMode(int fd)
>  {
>      drm_agp_info_t i;
>  
> +    memclear(i);
> +
>      if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
>  	return 0;
>      return i.mode;
> @@ -1828,6 +1849,8 @@ unsigned long drmAgpBase(int fd)
>  {
>      drm_agp_info_t i;
>  
> +    memclear(i);
> +
>      if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
>  	return 0;
>      return i.aperture_base;
> @@ -1849,6 +1872,8 @@ unsigned long drmAgpSize(int fd)
>  {
>      drm_agp_info_t i;
>  
> +    memclear(i);
> +
>      if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
>  	return 0;
>      return i.aperture_size;
> @@ -1870,6 +1895,8 @@ unsigned long drmAgpMemoryUsed(int fd)
>  {
>      drm_agp_info_t i;
>  
> +    memclear(i);
> +
>      if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
>  	return 0;
>      return i.memory_used;
> @@ -1891,6 +1918,8 @@ unsigned long drmAgpMemoryAvail(int fd)
>  {
>      drm_agp_info_t i;
>  
> +    memclear(i);
> +
>      if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
>  	return 0;
>      return i.memory_allowed;
> @@ -1912,6 +1941,8 @@ unsigned int drmAgpVendorId(int fd)
>  {
>      drm_agp_info_t i;
>  
> +    memclear(i);
> +
>      if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
>  	return 0;
>      return i.id_vendor;
> @@ -1933,6 +1964,8 @@ unsigned int drmAgpDeviceId(int fd)
>  {
>      drm_agp_info_t i;
>  
> +    memclear(i);
> +
>      if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
>  	return 0;
>      return i.id_device;
> @@ -1942,9 +1975,10 @@ int drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle)
>  {
>      drm_scatter_gather_t sg;
>  
> +    memclear(sg);
> +
>      *handle = 0;
>      sg.size   = size;
> -    sg.handle = 0;
>      if (drmIoctl(fd, DRM_IOCTL_SG_ALLOC, &sg))
>  	return -errno;
>      *handle = sg.handle;
> @@ -1955,7 +1989,7 @@ int drmScatterGatherFree(int fd, drm_handle_t handle)
>  {
>      drm_scatter_gather_t sg;
>  
> -    sg.size   = 0;
> +    memclear(sg);
>      sg.handle = handle;
>      if (drmIoctl(fd, DRM_IOCTL_SG_FREE, &sg))
>  	return -errno;
> @@ -2046,6 +2080,7 @@ int drmCtlInstHandler(int fd, int irq)
>  {
>      drm_control_t ctl;
>  
> +    memclear(ctl);
>      ctl.func  = DRM_INST_HANDLER;
>      ctl.irq   = irq;
>      if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl))
> @@ -2069,6 +2104,7 @@ int drmCtlUninstHandler(int fd)
>  {
>      drm_control_t ctl;
>  
> +    memclear(ctl);
>      ctl.func  = DRM_UNINST_HANDLER;
>      ctl.irq   = 0;
>      if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl))
> @@ -2080,8 +2116,8 @@ int drmFinish(int fd, int context, drmLockFlags flags)
>  {
>      drm_lock_t lock;
>  
> +    memclear(lock);
>      lock.context = context;
> -    lock.flags   = 0;
>      if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
>      if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
>      if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
> @@ -2111,6 +2147,7 @@ int drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum)
>  {
>      drm_irq_busid_t p;
>  
> +    memclear(p);
>      p.busnum  = busnum;
>      p.devnum  = devnum;
>      p.funcnum = funcnum;
> @@ -2153,6 +2190,7 @@ int drmAddContextPrivateMapping(int fd, drm_context_t ctx_id,
>  {
>      drm_ctx_priv_map_t map;
>  
> +    memclear(map);
>      map.ctx_id = ctx_id;
>      map.handle = (void *)(uintptr_t)handle;
>  
> @@ -2166,6 +2204,7 @@ int drmGetContextPrivateMapping(int fd, drm_context_t ctx_id,
>  {
>      drm_ctx_priv_map_t map;
>  
> +    memclear(map);
>      map.ctx_id = ctx_id;
>  
>      if (drmIoctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map))
> @@ -2182,6 +2221,7 @@ int drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size,
>  {
>      drm_map_t map;
>  
> +    memclear(map);
>      map.offset = idx;
>      if (drmIoctl(fd, DRM_IOCTL_GET_MAP, &map))
>  	return -errno;
> @@ -2199,6 +2239,7 @@ int drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
>  {
>      drm_client_t client;
>  
> +    memclear(client);
>      client.idx = idx;
>      if (drmIoctl(fd, DRM_IOCTL_GET_CLIENT, &client))
>  	return -errno;
> @@ -2215,6 +2256,7 @@ int drmGetStats(int fd, drmStatsT *stats)
>      drm_stats_t s;
>      unsigned    i;
>  
> +    memclear(s);
>      if (drmIoctl(fd, DRM_IOCTL_GET_STATS, &s))
>  	return -errno;
>  
> @@ -2352,6 +2394,7 @@ int drmSetInterfaceVersion(int fd, drmSetVersion *version)
>      int retcode = 0;
>      drm_set_version_t sv;
>  
> +    memclear(sv);
>      sv.drm_di_major = version->drm_di_major;
>      sv.drm_di_minor = version->drm_di_minor;
>      sv.drm_dd_major = version->drm_dd_major;
> @@ -2383,12 +2426,11 @@ int drmSetInterfaceVersion(int fd, drmSetVersion *version)
>   */
>  int drmCommandNone(int fd, unsigned long drmCommandIndex)
>  {
> -    void *data = NULL; /* dummy */
>      unsigned long request;
>  
>      request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex);
>  
> -    if (drmIoctl(fd, request, data)) {
> +    if (drmIoctl(fd, request, NULL)) {
>  	return -errno;
>      }
>      return 0;
> @@ -2543,12 +2585,12 @@ void drmCloseOnce(int fd)
>  
>  int drmSetMaster(int fd)
>  {
> -	return drmIoctl(fd, DRM_IOCTL_SET_MASTER, 0);
> +	return drmIoctl(fd, DRM_IOCTL_SET_MASTER, NULL);
>  }
>  
>  int drmDropMaster(int fd)
>  {
> -	return drmIoctl(fd, DRM_IOCTL_DROP_MASTER, 0);
> +	return drmIoctl(fd, DRM_IOCTL_DROP_MASTER, NULL);
>  }
>  
>  char *drmGetDeviceNameFromFd(int fd)

-- 
Jan Vesely <jan.vesely at rutgers.edu>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20150211/9758ea44/attachment.sig>


More information about the dri-devel mailing list