Commit 62d50add authored by Trent Piepho's avatar Trent Piepho Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (5163): Add checks for CAP_SYS_ADMIN to VIDIOC_DBG_G_REGISTER



Before, root privileges were only needed to set hardware registers, not
to read them.  On some hardware, reading from the wrong place at the
wrong time can hang the machine.  So, to be consistent, root privileges
are required to read registers on all hardware.

Signed-off-by: default avatarTrent Piepho <xyzzy@speakeasy.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent e7b58f52
Loading
Loading
Loading
Loading
+4 −10
Original line number Diff line number Diff line
@@ -629,15 +629,6 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
	/* ioctls to allow direct access to the
	 * cx25840 registers for testing */
	case VIDIOC_DBG_G_REGISTER:
	{
		struct v4l2_register *reg = arg;

		if (reg->i2c_id != I2C_DRIVERID_CX25840)
			return -EINVAL;
		reg->val = cx25840_read(client, reg->reg & 0x0fff);
		break;
	}

	case VIDIOC_DBG_S_REGISTER:
	{
		struct v4l2_register *reg = arg;
@@ -646,6 +637,9 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
			return -EINVAL;
		if (!capable(CAP_SYS_ADMIN))
			return -EPERM;
		if (cmd == VIDIOC_DBG_G_REGISTER)
			reg->val = cx25840_read(client, reg->reg & 0x0fff);
		else
			cx25840_write(client, reg->reg & 0x0fff, reg->val & 0xff);
		break;
	}
+4 −10
Original line number Diff line number Diff line
@@ -1418,15 +1418,6 @@ static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *ar

#ifdef CONFIG_VIDEO_ADV_DEBUG
	case VIDIOC_DBG_G_REGISTER:
	{
		struct v4l2_register *reg = arg;

		if (reg->i2c_id != I2C_DRIVERID_SAA711X)
			return -EINVAL;
		reg->val = saa711x_read(client, reg->reg & 0xff);
		break;
	}

	case VIDIOC_DBG_S_REGISTER:
	{
		struct v4l2_register *reg = arg;
@@ -1435,6 +1426,9 @@ static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *ar
			return -EINVAL;
		if (!capable(CAP_SYS_ADMIN))
			return -EPERM;
		if (cmd == VIDIOC_DBG_G_REGISTER)
			reg->val = saa711x_read(client, reg->reg & 0xff);
		else
			saa711x_write(client, reg->reg & 0xff, reg->val & 0xff);
		break;
	}
+4 −10
Original line number Diff line number Diff line
@@ -615,15 +615,6 @@ static int saa7127_command(struct i2c_client *client,

#ifdef CONFIG_VIDEO_ADV_DEBUG
	case VIDIOC_DBG_G_REGISTER:
	{
		struct v4l2_register *reg = arg;

		if (reg->i2c_id != I2C_DRIVERID_SAA7127)
			return -EINVAL;
		reg->val = saa7127_read(client, reg->reg & 0xff);
		break;
	}

	case VIDIOC_DBG_S_REGISTER:
	{
		struct v4l2_register *reg = arg;
@@ -632,6 +623,9 @@ static int saa7127_command(struct i2c_client *client,
			return -EINVAL;
		if (!capable(CAP_SYS_ADMIN))
			return -EPERM;
		if (cmd == VIDIOC_DBG_G_REGISTER)
			reg->val = saa7127_read(client, reg->reg & 0xff);
		else
			saa7127_write(client, reg->reg & 0xff, reg->val & 0xff);
		break;
	}
+4 −10
Original line number Diff line number Diff line
@@ -951,15 +951,6 @@ static int tvp5150_command(struct i2c_client *c,

#ifdef CONFIG_VIDEO_ADV_DEBUG
	case VIDIOC_DBG_G_REGISTER:
	{
		struct v4l2_register *reg = arg;

		if (reg->i2c_id != I2C_DRIVERID_TVP5150)
			return -EINVAL;
		reg->val = tvp5150_read(c, reg->reg & 0xff);
		break;
	}

	case VIDIOC_DBG_S_REGISTER:
	{
		struct v4l2_register *reg = arg;
@@ -968,6 +959,9 @@ static int tvp5150_command(struct i2c_client *c,
			return -EINVAL;
		if (!capable(CAP_SYS_ADMIN))
			return -EPERM;
		if (cmd == VIDIOC_DBG_G_REGISTER)
			reg->val = tvp5150_read(c, reg->reg & 0xff);
		else
			tvp5150_write(c, reg->reg & 0xff, reg->val & 0xff);
		break;
	}
+4 −12
Original line number Diff line number Diff line
@@ -163,26 +163,18 @@ static int upd64031a_command(struct i2c_client *client, unsigned int cmd, void *

#ifdef CONFIG_VIDEO_ADV_DEBUG
	case VIDIOC_DBG_G_REGISTER:
	{
		struct v4l2_register *reg = arg;

		if (reg->i2c_id != I2C_DRIVERID_UPD64031A)
			return -EINVAL;
		reg->val = upd64031a_read(client, reg->reg & 0xff);
		break;
	}

	case VIDIOC_DBG_S_REGISTER:
	{
		struct v4l2_register *reg = arg;
		u8 addr = reg->reg & 0xff;
		u8 val = reg->val & 0xff;

		if (reg->i2c_id != I2C_DRIVERID_UPD64031A)
			return -EINVAL;
		if (!capable(CAP_SYS_ADMIN))
			return -EPERM;
		upd64031a_write(client, addr, val);
		if (cmd == VIDIOC_DBG_G_REGISTER)
			reg->val = upd64031a_read(client, reg->reg & 0xff);
		else
			upd64031a_write(client, reg->reg & 0xff, reg->val & 0xff);
		break;
	}
#endif
Loading