ChangeSet 1.1243.50.3, 2003/06/06 15:02:42-07:00, [EMAIL PROTECTED]
[PATCH] USB: vicam.c patch
I noticed a version of vicam.c a few revisions ago had all the /proc fs
writing removed because I was incorrectly using potentially tainted user
space pointers. Here's a patch which I think fixes the pointer issue and
restores the /proc fs interface to vicam. If this fix is still
problematic, please let me know and I'll fix whatever comes up.
drivers/usb/media/vicam.c | 57 ++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 53 insertions(+), 4 deletions(-)
diff -Nru a/drivers/usb/media/vicam.c b/drivers/usb/media/vicam.c
--- a/drivers/usb/media/vicam.c Tue Jun 10 17:12:06 2003
+++ b/drivers/usb/media/vicam.c Tue Jun 10 17:12:06 2003
@@ -1101,6 +1101,52 @@
((struct vicam_camera *)data)->gain);
}
+static int
+vicam_write_proc_shutter(struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+ u16 stmp;
+ char kbuf[8];
+ struct vicam_camera *cam = (struct vicam_camera *) data;
+
+ if (count > 6)
+ return -EINVAL;
+
+ if (copy_from_user(kbuf, buffer, count))
+ return -EFAULT;
+
+ stmp = (u16) simple_strtoul(kbuf, NULL, 10);
+ if (stmp < 4 || stmp > 32000)
+ return -EINVAL;
+
+ cam->shutter_speed = stmp;
+
+ return count;
+}
+
+static int
+vicam_write_proc_gain(struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+ u16 gtmp;
+ char kbuf[8];
+
+ struct vicam_camera *cam = (struct vicam_camera *) data;
+
+ if (count > 4)
+ return -EINVAL;
+
+ if (copy_from_user(kbuf, buffer, count))
+ return -EFAULT;
+
+ gtmp = (u16) simple_strtoul(kbuf, NULL, 10);
+ if (gtmp > 255)
+ return -EINVAL;
+ cam->gain = gtmp;
+
+ return count;
+}
+
static void
vicam_create_proc_root(void)
{
@@ -1142,18 +1188,21 @@
if ( !cam->proc_dir )
return; // FIXME: We should probably return an error here
- ent =
- create_proc_entry("shutter", S_IFREG | S_IRUGO, cam->proc_dir);
+ ent = create_proc_entry("shutter", S_IFREG | S_IRUGO | S_IWUSR,
+ cam->proc_dir);
if (ent) {
ent->data = cam;
ent->read_proc = vicam_read_proc_shutter;
+ ent->write_proc = vicam_write_proc_shutter;
ent->size = 64;
}
- ent = create_proc_entry("gain", S_IFREG | S_IRUGO , cam->proc_dir);
- if ( ent ) {
+ ent = create_proc_entry("gain", S_IFREG | S_IRUGO | S_IWUSR,
+ cam->proc_dir);
+ if (ent) {
ent->data = cam;
ent->read_proc = vicam_read_proc_gain;
+ ent->write_proc = vicam_write_proc_gain;
ent->size = 64;
}
}
-------------------------------------------------------
This SF.net email is sponsored by: Etnus, makers of TotalView, The best
thread debugger on the planet. Designed with thread debugging features
you've never dreamed of, try TotalView 6 free at www.etnus.com.
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel