From 7199e523ef71d24cd8030ea454fca00bb52d58f0 Mon Sep 17 00:00:00 2001
From: Henrik Kurelid
Date: Fri, 5 Dec 2008 10:00:16 +0100
Subject: firedtv: use length_field() of PMT as length

Parsed and used the length_field() of the PMT message instead of using
the length field of the message struct, which does not seem to be filled
correctly by e.g. MythTV.

Signed-off-by: Henrik Kurelid <henrik@kurelid.se>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
---
 drivers/media/dvb/firesat/firesat-ci.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

(limited to 'drivers/media')

diff --git a/drivers/media/dvb/firesat/firesat-ci.c b/drivers/media/dvb/firesat/firesat-ci.c
index 0deb47eefa10..783ed2000102 100644
--- a/drivers/media/dvb/firesat/firesat-ci.c
+++ b/drivers/media/dvb/firesat/firesat-ci.c
@@ -127,14 +127,20 @@ static int firesat_ca_pmt(struct firesat *firesat, void *arg)
 {
 	struct ca_msg *msg = arg;
 	int data_pos;
+	int data_length;
+	int i;
+
+	data_pos = 4;
+	if (msg->msg[3] & 0x80) {
+		data_length = 0;
+		for (i = 0; i < (msg->msg[3] & 0x7F); i++)
+			data_length = (data_length << 8) + msg->msg[data_pos++];
+	} else {
+		data_length = msg->msg[3];
+	}
 
-	if (msg->msg[3] & 0x80)
-		data_pos = (msg->msg[4] && 0x7F) + 4;
-	else
-		data_pos = 4;
-
-	return avc_ca_pmt(firesat, &msg->msg[data_pos],
-			  msg->length - data_pos) ? -EFAULT : 0;
+	return avc_ca_pmt(firesat, &msg->msg[data_pos], data_length) ?
+	       -EFAULT : 0;
 }
 
 static int firesat_ca_send_msg(struct firesat *firesat, void *arg)
-- 
cgit v1.2.3-55-g7522