Discussion:
[gentoo-portage-dev] [PATCH v2 2/3] ecompress: Fix crash on duplicate compressed & uncompressed files
Michał Górny
2018-09-25 19:53:48 UTC
Permalink
Fix crash due to race condition in handling the same file being present
both in compressed and uncompressed variants. If that is the case,
just queue the uncompressed variant for compression, and ignore
the other compressed variants.

Bug: https://bugs.gentoo.org/667072
Signed-off-by: Michał Górny <***@gentoo.org>
---
bin/ecompress | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/bin/ecompress b/bin/ecompress
index 36bdb585b..d5ff3796c 100755
--- a/bin/ecompress
+++ b/bin/ecompress
@@ -49,6 +49,13 @@ while [[ $# -gt 0 ]] ; do
find_args+=( -size "+${PORTAGE_DOCOMPRESS_SIZE_LIMIT}c" )

while IFS= read -d '' -r path; do
+ # if both compressed and uncompressed variant exists,
+ # skip the compressed variants (bug #667072)
+ case ${path} in
+ *.Z|*.gz|*.bz2|*.lzma|*.xz)
+ [[ -s ${path%.*} ]] && continue
+ ;;
+ esac
"${path}.ecompress" || die
done < <(find "${find_args[@]}" -print0 || die)
fi
--
2.19.0
Michał Górny
2018-09-25 19:53:49 UTC
Permalink
Fix the pre-compressed file warning to be reported only once, now that
files are processed in parallel.

Signed-off-by: Michał Górny <***@gentoo.org>
---
bin/ecompress | 7 +++++++
bin/ecompress-file | 16 +++-------------
2 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/bin/ecompress b/bin/ecompress
index d5ff3796c..f927a336f 100755
--- a/bin/ecompress
+++ b/bin/ecompress
@@ -53,6 +53,7 @@ while [[ $# -gt 0 ]] ; do
# skip the compressed variants (bug #667072)
case ${path} in
*.Z|*.gz|*.bz2|*.lzma|*.xz)
+ >> "${T}"/.ecompress_had_precompressed
[[ -s ${path%.*} ]] && continue
;;
esac
@@ -150,6 +151,12 @@ find "${ED}" -name '*.ecompress' -delete -print0 |
___parallel_xargs -0 "${PORTAGE_BIN_PATH}"/ecompress-file
ret=${?}

+if [[ -f ${T}/.ecompress_had_precompressed ]]; then
+ eqawarn "One or more compressed files were found in docompress-ed directories."
+ eqawarn "Please fix the ebuild not to install compressed files (manpages,"
+ eqawarn "documentation) when automatic compression is used."
+fi
+
fix_symlinks
: $(( ret |= ${?} ))
[[ $ret -ne 0 ]] && __helpers_die "${0##*/} failed"
diff --git a/bin/ecompress-file b/bin/ecompress-file
index 18269c91b..bc8fe5451 100755
--- a/bin/ecompress-file
+++ b/bin/ecompress-file
@@ -14,7 +14,6 @@ compress_file() {
set +f
mask_ext_re="^(${mask_ext_re:1})\$"
local filtered_args=()
- local had_precompressed=
for x in "$@" ; do
[[ ${x##*.} =~ $mask_ext_re ]] && continue
[[ -s ${x} ]] || continue
@@ -23,16 +22,13 @@ compress_file() {
case ${x} in
*.gz|*.Z)
gunzip -f "${x}" || __helpers_die "gunzip failed"
- x=${x%.*}
- had_precompressed=1;;
+ x=${x%.*};;
*.bz2)
bunzip2 -f "${x}" || __helpers_die "bunzip2 failed"
- x=${x%.bz2}
- had_precompressed=1;;
+ x=${x%.bz2};;
*.lzma|*.xz)
unxz -f "${x}" || __helpers_die "unxz failed"
- x=${x%.*}
- had_precompressed=1;;
+ x=${x%.*};;
esac

filtered_args+=( "$x" )
@@ -40,12 +36,6 @@ compress_file() {
[[ ${#filtered_args[@]} -eq 0 ]] && return 0
set -- "${filtered_args[@]}"

- if [[ ${had_precompressed} ]]; then
- eqawarn "One or more compressed files were found in docompress-ed directories."
- eqawarn "Please fix the ebuild not to install compressed files (manpages,"
- eqawarn "documentation) when automatic compression is used."
- fi
-
# If a compressed version of the file already exists, simply
# delete it so that the compressor doesn't whine (bzip2 will
# complain and skip, gzip will prompt for input)
--
2.19.0
Loading...