diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-06-05 14:30:47 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-06-05 14:30:47 -0700 |
commit | b2ab26ab28cfed076ee8a83627d008472f6ac54f (patch) | |
tree | ad3eac0592d956492d6bc4f56a5de92a14c3d50d /drivers/media/dvb/ttpci | |
parent | 5965087dc96167298ab83598f681d4d6f9d324fa (diff) | |
parent | be573e7872432918e1017cf1e917e73817dcdad6 (diff) | |
download | kernel_samsung_smdk4412-b2ab26ab28cfed076ee8a83627d008472f6ac54f.zip kernel_samsung_smdk4412-b2ab26ab28cfed076ee8a83627d008472f6ac54f.tar.gz kernel_samsung_smdk4412-b2ab26ab28cfed076ee8a83627d008472f6ac54f.tar.bz2 |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (48 commits)
V4L/DVB (8001): dib0070: fix dib0070_attach when !CONFIG_DVB_TUNER_DIB0070
V4L/DVB (8000): tda827x: fix NULL pointer in tda827xa_lna_gain
V4L/DVB (7990): Fix entry for PowerColor RA 330 and make it run with firmware version 2.7
V4L/DVB (7983): tda18271_calc_rf_cal must return the return value of tda18271_lookup_map
V4L/DVB (7978): cx18: explicitly test for XC2028 tuner
V4L/DVB (7977): cx18: fix init order and remove duplicate open_on_first_use.
V4L/DVB (7975): saa7134_empress
V4L/DVB (7974): fix MEDIA_TUNER && FW_LOADER build error
V4L/DVB (7972): or51132.c: unaligned
V4L/DVB (7971): usb: unaligned
V4L/DVB (7970): mix trivial endianness annotations
V4L/DVB (7969): m920x: unaligned access
V4L/DVB (7968): zoran: endianness annotations
V4L/DVB (7967): bt8xx: unaligned access
V4L/DVB (7966): cx18: direct dereferencing of iomem
V4L/DVB (7965): annotate bcx_riscmem
V4L/DVB (7964): cx18 iomem annotations
V4L/DVB (7963): ivtv: trivial annotations
V4L/DVB (7962): ttusb endianness annotations and fixes
V4L/DVB (7961): fix endianness bug in dib0700_devices.c
...
Diffstat (limited to 'drivers/media/dvb/ttpci')
-rw-r--r-- | drivers/media/dvb/ttpci/av7110.c | 9 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/av7110_av.c | 34 |
2 files changed, 32 insertions, 11 deletions
diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c index 747e7f1..f05d43d 100644 --- a/drivers/media/dvb/ttpci/av7110.c +++ b/drivers/media/dvb/ttpci/av7110.c @@ -51,6 +51,7 @@ #include <linux/crc32.h> #include <linux/i2c.h> #include <linux/kthread.h> +#include <asm/unaligned.h> #include <asm/system.h> @@ -1461,9 +1462,9 @@ static int check_firmware(struct av7110* av7110) ptr += 4; /* check dpram file */ - crc = ntohl(*(u32*) ptr); + crc = get_unaligned_be32(ptr); ptr += 4; - len = ntohl(*(u32*) ptr); + len = get_unaligned_be32(ptr); ptr += 4; if (len >= 512) { printk("dvb-ttpci: dpram file is way too big.\n"); @@ -1478,9 +1479,9 @@ static int check_firmware(struct av7110* av7110) ptr += len; /* check root file */ - crc = ntohl(*(u32*) ptr); + crc = get_unaligned_be32(ptr); ptr += 4; - len = ntohl(*(u32*) ptr); + len = get_unaligned_be32(ptr); ptr += 4; if (len <= 200000 || len >= 300000 || diff --git a/drivers/media/dvb/ttpci/av7110_av.c b/drivers/media/dvb/ttpci/av7110_av.c index 3e6b650..ec55a968 100644 --- a/drivers/media/dvb/ttpci/av7110_av.c +++ b/drivers/media/dvb/ttpci/av7110_av.c @@ -965,8 +965,9 @@ static u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x static int play_iframe(struct av7110 *av7110, char __user *buf, unsigned int len, int nonblock) { - int i, n; + unsigned i, n; int progressive = 0; + int match = 0; dprintk(2, "av7110:%p, \n", av7110); @@ -975,12 +976,31 @@ static int play_iframe(struct av7110 *av7110, char __user *buf, unsigned int len return -EBUSY; } - for (i = 0; i < len - 5; i++) { - /* get progressive flag from picture extension */ - if (buf[i] == 0x00 && buf[i+1] == 0x00 && - buf[i+2] == 0x01 && (unsigned char)buf[i+3] == 0xb5 && - (buf[i+4] & 0xf0) == 0x10) - progressive = buf[i+5] & 0x08; + /* search in buf for instances of 00 00 01 b5 1? */ + for (i = 0; i < len; i++) { + unsigned char c; + if (get_user(c, buf + i)) + return -EFAULT; + if (match == 5) { + progressive = c & 0x08; + match = 0; + } + if (c == 0x00) { + match = (match == 1 || match == 2) ? 2 : 1; + continue; + } + switch (match++) { + case 2: if (c == 0x01) + continue; + break; + case 3: if (c == 0xb5) + continue; + break; + case 4: if ((c & 0xf0) == 0x10) + continue; + break; + } + match = 0; } /* setting n always > 1, fixes problems when playing stillframes |