패치: 파이프 및 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] 이 있습니다 .
  • I export 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입니다. 저는 아치 리눅스 배포판을 사용하고 있으며 이 문제는 실제로 업데이트를 포함하여 적어도 몇 달 동안 계속되었습니다. 커널 3.18.21.zshpatchglib-config --version

strace다음은 Once strace-ing cat, Once strace-ing patch및 두 가지 출력 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]리눅스 커널: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의 버그 때문입니다. 방금 포스팅했어요새로운 버전이렇게 하면 이 문제가 해결됩니다.

관련 정보