diff options
author | Changbing Xiong <cb.xiong@samsung.com> | 2014-08-20 22:05:40 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-09-02 10:50:42 -0400 |
commit | d102cac8097c71bbbba41f4d0cdf5b509d4c64cf (patch) | |
tree | 50f723773396cce972ede6c77e8bc107aae5e615 /drivers/media/dvb-core/dmxdev.c | |
parent | 236c9bfa4a133cbdfeeb3f7a1902950210549634 (diff) |
[media] media: check status of dmxdev->exit in poll functions of demux&dvr
when usb-type tuner is pulled out, user applications did not close device's FD,
and go on polling the device, we should return POLLERR directly.
Signed-off-by: Changbing Xiong <cb.xiong@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/dvb-core/dmxdev.c')
-rw-r--r-- | drivers/media/dvb-core/dmxdev.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c index 7a5c07003c41..42b5e70d5ca7 100644 --- a/drivers/media/dvb-core/dmxdev.c +++ b/drivers/media/dvb-core/dmxdev.c | |||
@@ -1085,9 +1085,10 @@ static long dvb_demux_ioctl(struct file *file, unsigned int cmd, | |||
1085 | static unsigned int dvb_demux_poll(struct file *file, poll_table *wait) | 1085 | static unsigned int dvb_demux_poll(struct file *file, poll_table *wait) |
1086 | { | 1086 | { |
1087 | struct dmxdev_filter *dmxdevfilter = file->private_data; | 1087 | struct dmxdev_filter *dmxdevfilter = file->private_data; |
1088 | struct dmxdev *dmxdev = dmxdevfilter->dev; | ||
1088 | unsigned int mask = 0; | 1089 | unsigned int mask = 0; |
1089 | 1090 | ||
1090 | if (!dmxdevfilter) | 1091 | if ((!dmxdevfilter) || (dmxdev->exit)) |
1091 | return POLLERR; | 1092 | return POLLERR; |
1092 | 1093 | ||
1093 | poll_wait(file, &dmxdevfilter->buffer.queue, wait); | 1094 | poll_wait(file, &dmxdevfilter->buffer.queue, wait); |
@@ -1181,6 +1182,9 @@ static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait) | |||
1181 | 1182 | ||
1182 | dprintk("function : %s\n", __func__); | 1183 | dprintk("function : %s\n", __func__); |
1183 | 1184 | ||
1185 | if (dmxdev->exit) | ||
1186 | return POLLERR; | ||
1187 | |||
1184 | poll_wait(file, &dmxdev->dvr_buffer.queue, wait); | 1188 | poll_wait(file, &dmxdev->dvr_buffer.queue, wait); |
1185 | 1189 | ||
1186 | if ((file->f_flags & O_ACCMODE) == O_RDONLY) { | 1190 | if ((file->f_flags & O_ACCMODE) == O_RDONLY) { |