summaryrefslogtreecommitdiff
path: root/libavdevice
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2021-11-25 11:27:02 +0100
committerAnton Khirnov <anton@khirnov.net>2021-12-07 11:16:14 +0100
commite1151fbf224da62f75fa975a1b18b7e74a13b1b1 (patch)
treef8ff6aa39a6219677fdbc13f246b9f70afb572f2 /libavdevice
parent007819a5bc0d3c01c0de26d9e1c6f909877e7c45 (diff)
lavd/v4l2: do not clobber the context FD in v4l2_get_device_list()
The FD opened here is local to the loop iteration, there is no reason to store it in the context. Since read_header() may have already been called, this may ovewrite an existing valid FD.
Diffstat (limited to 'libavdevice')
-rw-r--r--libavdevice/v4l2.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index b5997fba33..4b7984f1b0 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -1033,16 +1033,17 @@ static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList *device_l
return ret;
}
while ((entry = readdir(dir))) {
+ int fd = -1;
char device_name[256];
if (!v4l2_is_v4l_dev(entry->d_name))
continue;
snprintf(device_name, sizeof(device_name), "/dev/%s", entry->d_name);
- if ((s->fd = device_open(ctx, device_name)) < 0)
+ if ((fd = device_open(ctx, device_name)) < 0)
continue;
- if (v4l2_ioctl(s->fd, VIDIOC_QUERYCAP, &cap) < 0) {
+ if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0) {
ret = AVERROR(errno);
av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYCAP): %s\n", av_err2str(ret));
goto fail;
@@ -1064,8 +1065,7 @@ static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList *device_l
&device_list->nb_devices, device)) < 0)
goto fail;
- v4l2_close(s->fd);
- s->fd = -1;
+ v4l2_close(fd);
continue;
fail:
@@ -1074,9 +1074,7 @@ static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList *device_l
av_freep(&device->device_description);
av_freep(&device);
}
- if (s->fd >= 0)
- v4l2_close(s->fd);
- s->fd = -1;
+ v4l2_close(fd);
break;
}
closedir(dir);