ソースを参照

do not hang on piped input in PipedFileFdPrivate

This effects only compressors configured on the fly (rather then the
inbuilt ones as they use a library).
David Kalnischkies 10 年 前
コミット
bdc4221170
共有4 個のファイルを変更した42 個の追加3 個の削除を含む
  1. 5 0
      apt-pkg/contrib/fileutl.cc
  2. 6 2
      test/integration/framework
  3. 30 0
      test/integration/test-apt-helper-cat-file
  4. 1 1
      test/integration/test-compressed-indexes

+ 5 - 0
apt-pkg/contrib/fileutl.cc

@@ -1978,6 +1978,11 @@ public:
    virtual bool InternalClose(std::string const &) APT_OVERRIDE
    {
       bool Ret = true;
+      if (filefd->iFd != -1)
+      {
+	 close(filefd->iFd);
+	 filefd->iFd = -1;
+      }
       if (compressor_pid > 0)
 	 Ret &= ExecWait(compressor_pid, "FileFdCompressor", true);
       compressor_pid = -1;

+ 6 - 2
test/integration/framework

@@ -539,6 +539,10 @@ EOF
 	testempty --nomsg gcc -Wall -Wextra -fPIC -shared -o noopchroot.so noopchroot.c -ldl
 }
 configcompression() {
+	if [ "$1" = 'ALL' ]; then
+		configcompression '.' $(aptconfig dump APT::Compressor --format '%t %v%n' | sed -n 's#^Extension \.\(.*\)$#\1#p')
+		return
+	fi
 	local CMD='apthelper cat-file -C'
 	while [ -n "$1" ]; do
 		case "$1" in
@@ -963,7 +967,7 @@ buildaptarchivefromfiles() {
 }
 
 compressfile() {
-	cat "${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf" | while read compressor extension command; do
+	while read compressor extension command; do
 		if [ "$compressor" = '.' ]; then
 			if [ -n "$2" ]; then
 				touch -d "$2" "$1"
@@ -974,7 +978,7 @@ compressfile() {
 		if [ -n "$2" ]; then
 			touch -d "$2" "${1}.${extension}"
 		fi
-	done
+	done < "${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf"
 }
 
 # can be overridden by testcases for their pleasure

+ 30 - 0
test/integration/test-apt-helper-cat-file

@@ -0,0 +1,30 @@
+#!/bin/sh
+set -e
+
+TESTDIR="$(readlink -f "$(dirname "$0")")"
+. "$TESTDIR/framework"
+setupenvironment
+
+cat >rootdir/etc/apt/apt.conf.d/rev-as-compressor <<EOF
+APT::Compressor::rev {
+	Name "rev";
+	Extension ".rev";
+	Binary "rev";
+	Cost "1";
+};
+EOF
+
+configcompression 'ALL'
+cat >./test.txt <<EOF
+This is a test.
+EOF
+
+compressfile ./test.txt
+while read compressor extension command; do
+	if [ "$compressor" = '.' ]; then
+		FILE='./test.txt'
+	else
+		FILE="./test.txt.${extension}"
+	fi
+	testsuccessequal "$(cat ./test.txt)" apthelper cat-file "$FILE"
+done < "${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf"

+ 1 - 1
test/integration/test-compressed-indexes

@@ -5,7 +5,7 @@ TESTDIR="$(readlink -f "$(dirname "$0")")"
 . "$TESTDIR/framework"
 
 setupenvironment
-configcompression '.' $(aptconfig dump APT::Compressor --format '%t %v%n' | sed -n 's#^Extension \.\(.*\)$#\1#p')
+configcompression 'ALL'
 configarchitecture 'i386'
 LOWCOSTEXT='lz4'