udlfb: fix issues found with Sparse static analysis
Add __user casting, a missing copy_from_user, and proper boolean Signed-off-by: Dr. David Alan Gilbert <linux@treblig.org> Signed-off-by: Bernie Thompson <bernie@plugable.com> Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
This commit is contained in:
parent
f2e1fc9d5d
commit
def7660868
1 changed files with 16 additions and 14 deletions
|
@ -776,14 +776,13 @@ static int dlfb_ops_ioctl(struct fb_info *info, unsigned int cmd,
|
||||||
{
|
{
|
||||||
|
|
||||||
struct dlfb_data *dev = info->par;
|
struct dlfb_data *dev = info->par;
|
||||||
struct dloarea *area = NULL;
|
|
||||||
|
|
||||||
if (!atomic_read(&dev->usb_active))
|
if (!atomic_read(&dev->usb_active))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* TODO: Update X server to get this from sysfs instead */
|
/* TODO: Update X server to get this from sysfs instead */
|
||||||
if (cmd == DLFB_IOCTL_RETURN_EDID) {
|
if (cmd == DLFB_IOCTL_RETURN_EDID) {
|
||||||
char *edid = (char *)arg;
|
void __user *edid = (void __user *)arg;
|
||||||
if (copy_to_user(edid, dev->edid, dev->edid_size))
|
if (copy_to_user(edid, dev->edid, dev->edid_size))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -791,6 +790,11 @@ static int dlfb_ops_ioctl(struct fb_info *info, unsigned int cmd,
|
||||||
|
|
||||||
/* TODO: Help propose a standard fb.h ioctl to report mmap damage */
|
/* TODO: Help propose a standard fb.h ioctl to report mmap damage */
|
||||||
if (cmd == DLFB_IOCTL_REPORT_DAMAGE) {
|
if (cmd == DLFB_IOCTL_REPORT_DAMAGE) {
|
||||||
|
struct dloarea area;
|
||||||
|
|
||||||
|
if (copy_from_user(&area, (void __user *)arg,
|
||||||
|
sizeof(struct dloarea)))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we have a damage-aware client, turn fb_defio "off"
|
* If we have a damage-aware client, turn fb_defio "off"
|
||||||
|
@ -802,21 +806,19 @@ static int dlfb_ops_ioctl(struct fb_info *info, unsigned int cmd,
|
||||||
if (info->fbdefio)
|
if (info->fbdefio)
|
||||||
info->fbdefio->delay = DL_DEFIO_WRITE_DISABLE;
|
info->fbdefio->delay = DL_DEFIO_WRITE_DISABLE;
|
||||||
|
|
||||||
area = (struct dloarea *)arg;
|
if (area.x < 0)
|
||||||
|
area.x = 0;
|
||||||
|
|
||||||
if (area->x < 0)
|
if (area.x > info->var.xres)
|
||||||
area->x = 0;
|
area.x = info->var.xres;
|
||||||
|
|
||||||
if (area->x > info->var.xres)
|
if (area.y < 0)
|
||||||
area->x = info->var.xres;
|
area.y = 0;
|
||||||
|
|
||||||
if (area->y < 0)
|
if (area.y > info->var.yres)
|
||||||
area->y = 0;
|
area.y = info->var.yres;
|
||||||
|
|
||||||
if (area->y > info->var.yres)
|
dlfb_handle_damage(dev, area.x, area.y, area.w, area.h,
|
||||||
area->y = info->var.yres;
|
|
||||||
|
|
||||||
dlfb_handle_damage(dev, area->x, area->y, area->w, area->h,
|
|
||||||
info->screen_base);
|
info->screen_base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -864,7 +866,7 @@ static int dlfb_ops_open(struct fb_info *info, int user)
|
||||||
* preventing other clients (X) from working properly. Usually
|
* preventing other clients (X) from working properly. Usually
|
||||||
* not what the user wants. Fail by default with option to enable.
|
* not what the user wants. Fail by default with option to enable.
|
||||||
*/
|
*/
|
||||||
if ((user == 0) & (!console))
|
if ((user == 0) && (!console))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
/* If the USB device is gone, we don't accept new opens */
|
/* If the USB device is gone, we don't accept new opens */
|
||||||
|
|
Loading…
Reference in a new issue