Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sudo meson install するとバージョンのgitコミット情報が消える #965

Closed
ma8ma opened this issue Apr 23, 2022 · 6 comments · Fixed by #967
Closed

sudo meson install するとバージョンのgitコミット情報が消える #965

ma8ma opened this issue Apr 23, 2022 · 6 comments · Fixed by #967
Labels
bug バグの追跡 build ビルドに関するトピック

Comments

@ma8ma
Copy link
Collaborator

ma8ma commented Apr 23, 2022

sudo meson install するとバージョンのgitコミット情報が消える

バグの説明

mesonでビルドした実行ファイルをroot権限でインストールすると
バージョン情報からgitで取得したコミット情報が消えて代替の日付に置き換わります。

  • ビルドした実行ファイル
    JDim 0.7.0-20220417(git:379ab46aee)
  • sudo meson install した実行ファイル
    JDim 0.7.0-20220402

https://next2ch.net/test/read.cgi/linux/1613035222/830

再現の方法

通常のユーザーでgitリポジトリをcloneしてjdimをビルドし、root権限(sudo)でインストールします。

git clone --depth 1 https://github.com/JDimproved/JDim.git rootinstall
cd rootinstall

meson _build --prefix=/path/to/install
ninja -C _build
./_build/src/jdim -V # ビルドしたjdimのバージョン確認

sudo meson install -C _build
/path/to/install/bin/jdim -V # インストールしたjdimのバージョン確認

やりたかったこと・期待する結果

sudo meson installでインストールした実行ファイルにgitコミット情報を付ける。

スクリーンショット

なし

動作環境

[バージョン] JDim 0.7.0-20220417(git:379ab46aee)
[ディストリ ] Ubuntu 21.10 (x86_64)
[パッケージ] バイナリ/ソース( <配布元> )
[ DE/WM ] KDE
[ gtkmm  ] 3.24.5
[ glibmm  ] 2.64.2
[ TLS lib ] GnuTLS 3.7.1
[オプション ] '--with-alsa''--with-pangolayout'
[ そ の 他 ] 

追加の情報

gitの脆弱性修正が原因のようです。
Git 2.35.2をはじめCVE-2022-24765の対策が取り込まれたgitを使う場合
ユーザーが所有していないリポジトリは操作がエラーになります。
つまり、通常ユーザーでcloneしたgitリポジトリに対してrootユーザーでgitコマンドを実行すると失敗します。

jdimのmeson構成は毎回gitコミット情報を取得するためrootでgitコマンドに失敗して情報が消去されてしまい代替の日付が使われるようです。

エラーログの例

$ git clone --depth 1 https://github.com/JDimproved/JDim.git non-root
$ sudo git -C non-root log -n1
fatal: unsafe repository ('/path/to/non-root' is owned by someone else)
To add an exception for this directory, call:

        git config --global --add safe.directory /path/to/non-root
@ma8ma ma8ma added bug バグの追跡 build ビルドに関するトピック labels Apr 23, 2022
@ma8ma ma8ma moved this to Todo in State of JDim-v0.7.0+ Apr 23, 2022
@ma8ma
Copy link
Collaborator Author

ma8ma commented Apr 23, 2022

回避策

インストール時にgitコミット情報が消えないようにする回避策がいくつかあります。

  • (a) インストール時に再ビルドしないようにする
    sudo meson install -C _build --no-rebuild
  • (b) cp や install コマンドで実行ファイルを配置する
    sudo cp ./_build/src/jdim /path/to/install/
  • (c) debなど作成してバイナリパッケージをインストールする
  • (d) root権限が必要ない場所に実行ファイルをインストールする
    meson _build --prefix=$HOME/.local
  • (e) 例外のディレクトリとしてgitの設定にリポジトリを追加する
    git config --global --add safe.directory /path/to/your/repository
  • (f) root権限(sudo)でgit cloneしてリポジトリの所有者をrootにする
    sudo git clone https://github.com/JDimproved/JDim.git rootclone

@ma8ma
Copy link
Collaborator Author

ma8ma commented Apr 23, 2022

問題のポイントは

  • 脆弱性修正の結果なのでgitコマンドが失敗するのは意図された挙動
  • jdimのmeson構成はインストール時にもgitコマンドを呼び出している
    →上記の回避策(a)
  • 現状はgitのエラーメッセージを表示しないためコマンド失敗が判別できない
    →下記の修正案(b)
  • gitがエラーでもビルドを続行する仕組み(代替の日付利用)になっている

対応・修正の案は

  • (a) ドキュメントに注意書きをする
    • シングルユーザーでjdimを使う人には$HOME/.localへのインストールを案内する
    • root権限が必要な場所にインストールするときは--no-rebuildを付けてインストール実行するように書く
  • (b) gitコマンドに失敗したメッセージを表示する(可能?)
  • (c) gitコマンドに失敗してもコミット情報が消えないようにする(可能?)
  • (d) mesonにオプションを追加してgitコマンドを初回だけ呼び出すモードを追加する
    →新しい動作(初回のみ)をデフォルトにしないと問題が解消しないので重たく感じる

@mtasaka
Copy link
Collaborator

mtasaka commented Apr 23, 2022

Fedoraでは mesonを使ったソフトウェアで、rpm化するために一時的に(パッケージの為のディレクトリに)インストールするとき、%meson_install というマクロを使う事を推奨されていますが、このマクロの定義自体は何とupstream (github) の meson の中にあって、explicitに --no-rebuild を入れてますね...

https://github.com/mesonbuild/meson/blob/2cdddbab56ffdbca6accfc626521968fbe2c917e/data/macros.meson#L34-L38

@ma8ma
Copy link
Collaborator Author

ma8ma commented Apr 23, 2022

--no-rebuildが実践的なやり方のようですね
個人的にはsudo make installの要領でやると思わぬ結果になるのが微妙な感じするので修正案(b)(c)あたりができないか検討してみます。

@ma8ma
Copy link
Collaborator Author

ma8ma commented Apr 30, 2022

#967 で修正したため閉じます。

@ma8ma ma8ma closed this as completed Apr 30, 2022
Repository owner moved this from Todo to Done in State of JDim-v0.7.0+ Apr 30, 2022
@ma8ma ma8ma linked a pull request Jun 18, 2022 that will close this issue
@ma8ma
Copy link
Collaborator Author

ma8ma commented Mar 25, 2023

追記:
meson 1.1.0 からsudo meson installを実行したときに行われる再ビルドではrootではなく元のユーザーでninja呼び出すように変更されるようです。

https://mesonbuild.com/Release-notes-for-1-1-0.html#sudo-meson-install-now-drops-privileges-when-rebuilding-targets

Meson now tries to be extra safe as a general solution. sudo meson install will attempt to rebuild, but has learned to run ninja as the original (pre-sudo or pre-doas) user, ensuring that build outputs are generated/compiled as non-root.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug バグの追跡 build ビルドに関するトピック
Projects
No open projects
Development

Successfully merging a pull request may close this issue.

2 participants