ffmpeg | branch: master | Anton Khirnov <an...@khirnov.net> | Thu Nov 25 
11:27:02 2021 +0100| [e1151fbf224da62f75fa975a1b18b7e74a13b1b1] | committer: 
Anton Khirnov

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e1151fbf224da62f75fa975a1b18b7e74a13b1b1
---

 libavdevice/v4l2.c | 12 +++++-------
 1 file 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);

_______________________________________________
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to