|
@@ -1923,9 +1923,23 @@ static int dvb_frontend_ioctl(struct file *file, unsigned int cmd, void *parg)
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
- if ((file->f_flags & O_ACCMODE) == O_RDONLY &&
|
|
|
- (_IOC_DIR(cmd) != _IOC_READ || cmd == FE_GET_EVENT ||
|
|
|
- cmd == FE_DISEQC_RECV_SLAVE_REPLY)) {
|
|
|
+ /*
|
|
|
+ * If the frontend is opened in read-only mode, only the ioctls
|
|
|
+ * that don't interfere with the tune logic should be accepted.
|
|
|
+ * That allows an external application to monitor the DVB QoS and
|
|
|
+ * statistics parameters.
|
|
|
+ *
|
|
|
+ * That matches all _IOR() ioctls, except for two special cases:
|
|
|
+ * - FE_GET_EVENT is part of the tuning logic on a DVB application;
|
|
|
+ * - FE_DISEQC_RECV_SLAVE_REPLY is part of DiSEqC 2.0
|
|
|
+ * setup
|
|
|
+ * So, those two ioctls should also return -EPERM, as otherwise
|
|
|
+ * reading from them would interfere with a DVB tune application
|
|
|
+ */
|
|
|
+ if ((file->f_flags & O_ACCMODE) == O_RDONLY
|
|
|
+ && (_IOC_DIR(cmd) != _IOC_READ
|
|
|
+ || cmd == FE_GET_EVENT
|
|
|
+ || cmd == FE_DISEQC_RECV_SLAVE_REPLY)) {
|
|
|
up(&fepriv->sem);
|
|
|
return -EPERM;
|
|
|
}
|