aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_drv.c')
-rw-r--r--drivers/gpu/drm/drm_drv.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index a75ca63deea6..bfaf59b02bda 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -145,6 +145,7 @@ static struct drm_ioctl_desc drm_ioctls[] = {
145 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW), 145 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW),
146 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW), 146 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW),
147 DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW), 147 DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW),
148 DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW),
148}; 149};
149 150
150#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) 151#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
@@ -366,6 +367,29 @@ module_init(drm_core_init);
366module_exit(drm_core_exit); 367module_exit(drm_core_exit);
367 368
368/** 369/**
370 * Copy and IOCTL return string to user space
371 */
372static int drm_copy_field(char *buf, size_t *buf_len, const char *value)
373{
374 int len;
375
376 /* don't overflow userbuf */
377 len = strlen(value);
378 if (len > *buf_len)
379 len = *buf_len;
380
381 /* let userspace know exact length of driver value (which could be
382 * larger than the userspace-supplied buffer) */
383 *buf_len = strlen(value);
384
385 /* finally, try filling in the userbuf */
386 if (len && buf)
387 if (copy_to_user(buf, value, len))
388 return -EFAULT;
389 return 0;
390}
391
392/**
369 * Get version information 393 * Get version information
370 * 394 *
371 * \param inode device inode. 395 * \param inode device inode.
@@ -380,16 +404,21 @@ static int drm_version(struct drm_device *dev, void *data,
380 struct drm_file *file_priv) 404 struct drm_file *file_priv)
381{ 405{
382 struct drm_version *version = data; 406 struct drm_version *version = data;
383 int len; 407 int err;
384 408
385 version->version_major = dev->driver->major; 409 version->version_major = dev->driver->major;
386 version->version_minor = dev->driver->minor; 410 version->version_minor = dev->driver->minor;
387 version->version_patchlevel = dev->driver->patchlevel; 411 version->version_patchlevel = dev->driver->patchlevel;
388 DRM_COPY(version->name, dev->driver->name); 412 err = drm_copy_field(version->name, &version->name_len,
389 DRM_COPY(version->date, dev->driver->date); 413 dev->driver->name);
390 DRM_COPY(version->desc, dev->driver->desc); 414 if (!err)
391 415 err = drm_copy_field(version->date, &version->date_len,
392 return 0; 416 dev->driver->date);
417 if (!err)
418 err = drm_copy_field(version->desc, &version->desc_len,
419 dev->driver->desc);
420
421 return err;
393} 422}
394 423
395/** 424/**