[linux-dvb] [patch] fix two minor issues in dvb_core
Peter Beutner
p.beutner at gmx.net
Sat Jun 4 21:48:13 CEST 2005
Hi
i recently stumbled over these two little bugs in the dvb_core code:
1.
As the FE_SET_FRONTEND ioctl is asynchronous it is not guaranteed that
the tuner is already reconfigured when the next ioctl occurs. In case of
the FE_READ_STATUS ioctl this would return the signal status of the
previous,now obsolete tuning to the user. Which is kind of bad for apps
which do something like:
tune();
while(!has_lock())
sleep(500);
read_data();
Prevent this by automatically returning zero if frontend state is FE_RETUNE.
2.
In dvb_dmxdev_filter_start if we go out because of an error, release
previously allocated demux_feed.
Signed-off-by: Peter Beutner <p.beutner at gmx.net>
-------------- next part --------------
Index: linux/drivers/media/dvb/dvb-core/dvb_frontend.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/dvb-core/dvb_frontend.c,v
retrieving revision 1.108
diff -p -u -r1.108 dvb_frontend.c
--- linux/drivers/media/dvb/dvb-core/dvb_frontend.c 13 May 2005 23:08:22 -0000 1.108
+++ linux/drivers/media/dvb/dvb-core/dvb_frontend.c 4 Jun 2005 16:20:02 -0000
@@ -627,11 +627,21 @@ static int dvb_frontend_ioctl(struct ino
break;
}
- case FE_READ_STATUS:
+ case FE_READ_STATUS: {
+ fe_status_t* status = parg;
+
+ /* if retune was requested but hasn't occured yet, prevent
+ * that user get signal state from previous tuning */
+ if(fepriv->state == FESTATE_RETUNE) {
+ err=0;
+ *status = 0;
+ break;
+ }
+
if (fe->ops->read_status)
- err = fe->ops->read_status(fe, (fe_status_t*) parg);
+ err = fe->ops->read_status(fe, status);
break;
-
+ }
case FE_READ_BER:
if (fe->ops->read_ber)
err = fe->ops->read_ber(fe, (__u32*) parg);
Index: linux/drivers/media/dvb/dvb-core/dmxdev.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/dvb-core/dmxdev.c,v
retrieving revision 1.40
diff -p -u -r1.40 dmxdev.c
--- linux/drivers/media/dvb/dvb-core/dmxdev.c 5 Apr 2005 00:54:19 -0000 1.40
+++ linux/drivers/media/dvb/dvb-core/dmxdev.c 2 Jun 2005 21:53:56 -0000
@@ -669,8 +669,10 @@ static int dvb_dmxdev_filter_start(struc
ret = filter->feed.ts->start_filtering(filter->feed.ts);
- if (ret < 0)
+ if (ret < 0) {
+ dmxdev->demux->release_ts_feed(dmxdev->demux, *tsfeed);
return ret;
+ }
break;
}
More information about the linux-dvb
mailing list