Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1fab46f0decd226fcbae73b23d7f8ed478416fbb
Commit:     1fab46f0decd226fcbae73b23d7f8ed478416fbb
Parent:     36c15f8ee41fbc3d8eaf88bba95be3d50268d5d2
Author:     Oliver Endriss <[EMAIL PROTECTED]>
AuthorDate: Mon Jul 23 21:00:36 2007 -0300
Committer:  Mauro Carvalho Chehab <[EMAIL PROTECTED]>
CommitDate: Tue Oct 9 22:03:28 2007 -0300

    V4L/DVB (5935): dvb_frontend: Range check of frequency and symbol rate
    
    Add range check of frequency and symbol rate to the FE_SET_FRONTEND ioctl.
    
    This will also avoid a divide-by zero exception in the stv0297 driver,
    if symbol rate is set to 0.
    
    Signed-off-by: Oliver Endriss <[EMAIL PROTECTED]>
    Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>
---
 drivers/media/dvb/dvb-core/dvb_frontend.c |   46 +++++++++++++++++++++++++++++
 1 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c 
b/drivers/media/dvb/dvb-core/dvb_frontend.c
index b6c7f66..384b5b8 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -697,6 +697,47 @@ static int dvb_frontend_start(struct dvb_frontend *fe)
        return 0;
 }
 
+static int dvb_frontend_check_parameters(struct dvb_frontend *fe,
+                               struct dvb_frontend_parameters *parms)
+{
+       /* range check: frequency */
+       if ((fe->ops.info.frequency_min &&
+            parms->frequency < fe->ops.info.frequency_min) ||
+           (fe->ops.info.frequency_max &&
+            parms->frequency > fe->ops.info.frequency_max)) {
+               printk(KERN_WARNING "DVB: frontend %u frequency %u out of range 
(%u..%u)\n",
+                      fe->dvb->num, parms->frequency,
+                      fe->ops.info.frequency_min, fe->ops.info.frequency_max);
+               return -EINVAL;
+       }
+
+       /* range check: symbol rate */
+       if (fe->ops.info.type == FE_QPSK) {
+               if ((fe->ops.info.symbol_rate_min &&
+                    parms->u.qpsk.symbol_rate < fe->ops.info.symbol_rate_min) 
||
+                   (fe->ops.info.symbol_rate_max &&
+                    parms->u.qpsk.symbol_rate > fe->ops.info.symbol_rate_max)) 
{
+                       printk(KERN_WARNING "DVB: frontend %u symbol rate %u 
out of range (%u..%u)\n",
+                              fe->dvb->num, parms->u.qpsk.symbol_rate,
+                              fe->ops.info.symbol_rate_min, 
fe->ops.info.symbol_rate_max);
+                       return -EINVAL;
+               }
+
+       } else if (fe->ops.info.type == FE_QAM) {
+               if ((fe->ops.info.symbol_rate_min &&
+                    parms->u.qam.symbol_rate < fe->ops.info.symbol_rate_min) ||
+                   (fe->ops.info.symbol_rate_max &&
+                    parms->u.qam.symbol_rate > fe->ops.info.symbol_rate_max)) {
+                       printk(KERN_WARNING "DVB: frontend %u symbol rate %u 
out of range (%u..%u)\n",
+                              fe->dvb->num, parms->u.qam.symbol_rate,
+                              fe->ops.info.symbol_rate_min, 
fe->ops.info.symbol_rate_max);
+                       return -EINVAL;
+               }
+       }
+
+       return 0;
+}
+
 static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
                        unsigned int cmd, void *parg)
 {
@@ -883,6 +924,11 @@ static int dvb_frontend_ioctl(struct inode *inode, struct 
file *file,
        case FE_SET_FRONTEND: {
                struct dvb_frontend_tune_settings fetunesettings;
 
+               if (dvb_frontend_check_parameters(fe, parg) < 0) {
+                       err = -EINVAL;
+                       break;
+               }
+
                memcpy (&fepriv->parameters, parg,
                        sizeof (struct dvb_frontend_parameters));
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to