summaryrefslogtreecommitdiff
path: root/libavdevice
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2021-11-25 11:29:07 +0100
committerAnton Khirnov <anton@khirnov.net>2021-12-07 11:16:14 +0100
commit877b6a9e82f73e772b8ac40d4b119f21ee037f0f (patch)
tree0aa646de6397ddba39dbc3277207ee632b6d7242 /libavdevice
parentb532ca3d2f1f1caab71c0aab979949882b695198 (diff)
lavd/v4l2: detect device name truncation
Silences the following warning with gcc 10: src/libavdevice/v4l2.c: In function ‘v4l2_get_device_list’: src/libavdevice/v4l2.c:1042:64: warning: ‘%s’ directive output may be truncated writing up to 255 bytes into a region of size 251 [-Wformat-truncation=] 1042 | ret = snprintf(device_name, sizeof(device_name), "/dev/%s", entry->d_name); | ^~ src/libavdevice/v4l2.c:1042:15: note: ‘snprintf’ output between 6 and 261 bytes into a destination of size 256 1042 | ret = snprintf(device_name, sizeof(device_name), "/dev/%s", entry->d_name); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Previous patches intending to silence it have proposed increasing the buffer size, but doing that correctly seems to be tricky. Failing on truncation is simpler and just as effective (as excessively long device names are unlikely).
Diffstat (limited to 'libavdevice')
-rw-r--r--libavdevice/v4l2.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index fefea54142..2ecfb9fae7 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -1033,13 +1033,19 @@ static int v4l2_get_device_list(AVFormatContext *ctx, AVDeviceInfoList *device_l
while ((entry = readdir(dir))) {
AVDeviceInfo *device = NULL;
struct v4l2_capability cap;
- int fd = -1;
+ int fd = -1, size;
char device_name[256];
if (!v4l2_is_v4l_dev(entry->d_name))
continue;
- snprintf(device_name, sizeof(device_name), "/dev/%s", entry->d_name);
+ size = snprintf(device_name, sizeof(device_name), "/dev/%s", entry->d_name);
+ if (size >= sizeof(device_name)) {
+ av_log(ctx, AV_LOG_ERROR, "Device name too long.\n");
+ ret = AVERROR(ENOSYS);
+ break;
+ }
+
if ((fd = device_open(ctx, device_name)) < 0)
continue;