概要
- Ubuntuを利用している
- カーネルを自前でビルドしてインストールしている
- v4l2loopbackをdkmsで利用している
- Ubuntu 23.10でのaptでインストールされるバージョンは0.12.7
という場合にLinux Kernel 6.8をインストールした際にdkmsのビルドがエラーになった件の調査と対応となります
原因
- Linux Kernel 6.8で
strlcpy()
関数がなくなった - v4l2loopback.cで該当の関数を利用している
対応
-
strlcpy()
をstrscpy()
で置き換える
(参考)
strlcpy()
と strscpy()
の違いは上記リンク先を参照してもらうとして、v4l2loopback.cで strlcpy()
を利用している箇所では戻り値は参照されない
これより、文字列のコピー処理については strlcpy()
と strscpy()
の挙動が同様になるので strlcpy()
を strscpy()
で置き換えることにする
diff
--- v4l2loopback.c.orig 2023-07-05 21:05:05.000000000 +0900
+++ v4l2loopback.c 2024-03-13 21:16:45.204190824 +0900
@@ -739,7 +739,7 @@ static int vidioc_querycap(struct file *
->devicenr;
__u32 capabilities = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
- strlcpy(cap->driver, "v4l2 loopback", sizeof(cap->driver));
+ strscpy(cap->driver, "v4l2 loopback", sizeof(cap->driver));
vidioc_fill_name(cap->card, sizeof(cap->card), devnr);
snprintf(cap->bus_info, sizeof(cap->bus_info),
"platform:v4l2loopback-%03d", devnr);
@@ -1247,7 +1247,7 @@ static int vidioc_queryctrl(struct file
if (!cnf)
BUG();
- strlcpy(q->name, cnf->name, sizeof(q->name));
+ strscpy(q->name, cnf->name, sizeof(q->name));
q->default_value = cnf->def;
q->type = cnf->type;
q->minimum = cnf->min;
@@ -1352,7 +1352,7 @@ static int vidioc_enum_output(struct fil
memset(outp, 0, sizeof(*outp));
outp->index = index;
- strlcpy(outp->name, "loopback in", sizeof(outp->name));
+ strscpy(outp->name, "loopback in", sizeof(outp->name));
outp->type = V4L2_OUTPUT_TYPE_ANALOG;
outp->audioset = 0;
outp->modulator = 0;
@@ -1411,7 +1411,7 @@ static int vidioc_enum_input(struct file
memset(inp, 0, sizeof(*inp));
inp->index = index;
- strlcpy(inp->name, "loopback", sizeof(inp->name));
+ strscpy(inp->name, "loopback", sizeof(inp->name));
inp->type = V4L2_INPUT_TYPE_CAMERA;
inp->audioset = 0;
inp->tuner = 0;
注意事項
sudo apt install v4l2loopback-dkms
というコマンドでソースコードは /usr/src/v4l2loopback-0.12.7/
にインストールされている
そこに今回対象とする v4l2loopback.c
が置いてある
ビルドが失敗した際のエラーメッセージに /var/lib/dkms/v4l2loopback/0.12.7/build/make.log
を見ろと表示され、そこに v4l2loopback.c
があったので最初そこにパッチを当てたがビルドされる際に生成されるディレクトリーの模様で反映されなかった
/var/lib/dkms/v4l2loopback/0.12.7/source
というシンボリックリンクがあり、これが /usr/src/v4l2loopback-0.12.7
を指していた
なおGitHub上の最新のコードではすでに strscpy()
が利用されている
ちなみにマクロを利用してkernelのバージョンが4.3以前の場合は strlcpy()
を使う模様
Ubuntu 24.04ではkernelは6.8を採用するようですがv4l2loopback-dkmsのバージョンは引き続き0.12.7のようなのでビルド出来ない件に対するパッチが当たってるのか気になるところです👀
さすがに対応されてるとは思いますが、もしおかしなことがあった場合に今回の記事が参考になれば幸いです
それでは良いLinuxライフを