LoginSignup
0
0

Ubuntuを利用していて最新のカーネルを自前でビルドした際にv4l2loopbackのdkmsがビルドエラーになった場合

Posted at

概要

  • 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ライフを

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0