Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] stk-webcam: fix an endian bug in stk_camera_read_reg()

We pass an int pointer to stk_camera_read_reg() but only write to the
highest byte. It's a bug on big endian systems and generally a nasty
thing to do and doesn't match the write function either.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

authored by

Dan Carpenter and committed by
Mauro Carvalho Chehab
d08876f5 414e72c7

+10 -9
+3 -3
drivers/media/usb/stkwebcam/stk-sensor.c
··· 228 228 static int stk_sensor_outb(struct stk_camera *dev, u8 reg, u8 val) 229 229 { 230 230 int i = 0; 231 - int tmpval = 0; 231 + u8 tmpval = 0; 232 232 233 233 if (stk_camera_write_reg(dev, STK_IIC_TX_INDEX, reg)) 234 234 return 1; ··· 253 253 static int stk_sensor_inb(struct stk_camera *dev, u8 reg, u8 *val) 254 254 { 255 255 int i = 0; 256 - int tmpval = 0; 256 + u8 tmpval = 0; 257 257 258 258 if (stk_camera_write_reg(dev, STK_IIC_RX_INDEX, reg)) 259 259 return 1; ··· 274 274 if (stk_camera_read_reg(dev, STK_IIC_RX_VALUE, &tmpval)) 275 275 return 1; 276 276 277 - *val = (u8) tmpval; 277 + *val = tmpval; 278 278 return 0; 279 279 } 280 280
+6 -5
drivers/media/usb/stkwebcam/stk-webcam.c
··· 144 144 return 0; 145 145 } 146 146 147 - int stk_camera_read_reg(struct stk_camera *dev, u16 index, int *value) 147 + int stk_camera_read_reg(struct stk_camera *dev, u16 index, u8 *value) 148 148 { 149 149 struct usb_device *udev = dev->udev; 150 150 unsigned char *buf; ··· 163 163 sizeof(u8), 164 164 500); 165 165 if (ret >= 0) 166 - memcpy(value, buf, sizeof(u8)); 166 + *value = *buf; 167 167 168 168 kfree(buf); 169 169 return ret; ··· 171 171 172 172 static int stk_start_stream(struct stk_camera *dev) 173 173 { 174 - int value; 174 + u8 value; 175 175 int i, ret; 176 - int value_116, value_117; 176 + u8 value_116, value_117; 177 + 177 178 178 179 if (!is_present(dev)) 179 180 return -ENODEV; ··· 214 213 215 214 static int stk_stop_stream(struct stk_camera *dev) 216 215 { 217 - int value; 216 + u8 value; 218 217 int i; 219 218 if (is_present(dev)) { 220 219 stk_camera_read_reg(dev, 0x0100, &value);
+1 -1
drivers/media/usb/stkwebcam/stk-webcam.h
··· 129 129 #define vdev_to_camera(d) container_of(d, struct stk_camera, vdev) 130 130 131 131 int stk_camera_write_reg(struct stk_camera *, u16, u8); 132 - int stk_camera_read_reg(struct stk_camera *, u16, int *); 132 + int stk_camera_read_reg(struct stk_camera *, u16, u8 *); 133 133 134 134 int stk_sensor_init(struct stk_camera *); 135 135 int stk_sensor_configure(struct stk_camera *);