diff options
author | Anton Khirnov <anton@khirnov.net> | 2021-11-25 11:27:02 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2021-12-07 11:16:14 +0100 |
commit | e1151fbf224da62f75fa975a1b18b7e74a13b1b1 (patch) | |
tree | f8ff6aa39a6219677fdbc13f246b9f70afb572f2 | |
parent | 007819a5bc0d3c01c0de26d9e1c6f909877e7c45 (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.
-rw-r--r-- | libavdevice/v4l2.c | 12 |
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); |