パッチ:パイプとLD_PRELOAD / libtrashを含む「無効なファイル記述子」

パッチ:パイプとLD_PRELOAD / libtrashを含む「無効なファイル記述子」

非常に簡単な要約: cat "$file" | patchエラーは生成されますBad file descriptorが、 patch < "$file"libtrashは事前にロードされ、LD_PRELOAD大規模プロジェクトでのみ機能します。

説明する: この例では、[1]からダウンロードしたlinux-3.18.21カーネルソースコードを使用しました(もちろんアーカイブも抽出されました)。

ダウンロードしたvon [2]でTuxOnIceを使用してパッチを適用して解凍したいと思います。

この例では、小さなファイルだけですべてがうまくいくので、いくつかの大きなプロジェクトを紹介します。

私はパッチがあるトップレベルのLinuxソースディレクトリで作業しています../patches/tuxonice-for-linux-3.18.21-2015-09-08.patch。関連するシンボリックリンクはなく、すべてが同じファイルシステムにあります。

次のようなことが発生します。

$ cat ../patches/tuxonice-for-linux-3.18.21-2015-09-08.patch | patch -p1 --dry-run
patch: **** can't open file Documentation/kernel-parameters.txt : Bad file descriptor

(終了コード:2)

しかし、:

$ patch -p1 --dry-run < ../patches/tuxonice-for-linux-3.18.21-2015-09-08.patch 
checking file Documentation/kernel-parameters.txt
checking file Documentation/power/tuxonice-internals.txt
[...]

(成功的に実行されます)。

libtrash.soこの問題は、環境変数を介したロードに関連していますLD_PRELOAD

  • export LD_PRELOAD=/usr/lib/libtrash.soデフォルトでは[3]があります。
  • Iexport LD_PRELOAD=''または裏面はunset LD_PRELOAD正常に動作します。
  • export TRASH_OFF=YESlibtrashが提供する手段を介してlibtrashの機能をオフにしても(しかしプリロードされたまま)、問題はまだ存在します。
  • libtrash自体ではなくlibtrashに関連している必要がありますLD_PRELOAD。これは、I export LD_PRELOAD='/usr/lib/libgtk3-nocsd.so.0'(ファイルが存在する)のときにパッチがcat $file | patch機能するためです。

事実cat "$file" | "$programme"と同じ結果が出ると予想したのです"$programme" < "$file"が、そうではありませんでした。

実際には使用せず、代わりに圧縮catパッチファイルのようなxzcatものを使用してbzcat追加のステップで最初に解凍する必要がないため、これは本当に面倒な作業です。

を使用しますが(同じ範囲bash内で)重要ではありません。 1.2.10を示すGNUパッチバージョン2.7.5。私はアーチLinuxディストリビューションを使用していますが、この問題は実際にはアップデートを含む少なくとも数ヶ月間続きました。カーネル 3.18.21.zshpatchglib-config --version

strace以下は、Once strace-ing cat、Once strace-ing patch、および2つの出力export LD_PRELOAD=/usr/lib/libtrash.soですexport TRASH_OFF=YES

注文する:

$ strace cat ../patches/tuxonice-for-linux-3.18.21-2015-09-08.patch | patch -p1 --dry-run

出力:

http://pastebin.com/TD81znz6

注文する:

$ cat ../patches/tuxonice-for-linux-3.18.21-2015-09-08.patch | strace patch -p1 --dry-run

出力:

http://pastebin.com/snvN3YCu

(リンクして申し訳ありません。直接入れると、stackexchangeは理由を知らせず、私の投稿を受け入れません。)

strace私は動的リンクなどに精通していません。

何が起こっているのか知っている人はいますか?これがどこかで間違いだったら、どこですか? (パッチ、libc、libtrash、動的リンカー、...、...、?)

xzcat /usr/src/linux-3.18.21.tar.xz | tar -xv動作しますが、xzcat some.patch.xz | patch動作しないので、少なくともpatch

[1]Linuxカーネル:https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.18.21.tar.xz

[2]氷の上のタキシード:http://tuxonice.nigelcunningham.com.au/downloads/all/tuxonice-for-linux-3.18.21-2015-09-08.patch.bz2

[3]図書館ごみ:http://pages.stern.nyu.edu/~marriaga/software/libtrash/

答え1

libtrash壊れる:

たとえば、次のようになりますhelpers.c

char* make_absolute_path_from_dirfd_relpath(int dirfd, const char *arg_pathname)
{
   char *abs_path = NULL;

   if (arg_pathname == NULL)
     {
    return NULL;
     }
   else if (arg_pathname[0] == '/' || dirfd == AT_FDCWD)
     {
    return arg_pathname;
     }
   else if (dirfd <= 0)
     {
    errno = EBADF;
    return NULL;
     }

0ファイル記述子の値は完全に正当です。リダイレクトを使用しているので、stdinつまりファイル記述子を読んでいます0。私はこれがどこかで起こる問題だと思いますlibtrash

答え2

Andrew Henleが指摘したように、これはlibtrashのバグによるものです。私は投稿しました。新バージョンこれはこの問題を解決します。

関連情報