[pacman-dev] makepkg: protect against unexpected whitespace in filenames

Message ID 20191027070510.1824060-1-eschwartz@archlinux.org
State Accepted, archived
Headers show
Series [pacman-dev] makepkg: protect against unexpected whitespace in filenames | expand

Commit Message

Eli Schwartz Oct. 27, 2019, 7:05 a.m. UTC
zipman:

read -r protects against those evil manpages whose filenames contain
backslash escapes, (muahahaha?)

IFS= read protects against filenames with:

- leading whitespace (but no one is actually stupid enough to configure
  their MAN_DIRS=() in makepkg.conf with such silly directories, *right*?)

- trailing whitespace (but likewise, no one should be stupid enough to
  write an uncompressed manpage for section '1 ' or something)

Also fix several other cases where we read filenames without protecting
against surrounding whitespace, or without using null-delimited
filenames when we could trivially do so.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
---

unrelated to filesize counting issues, except that filesize counting
should be inspired from the fixed code I show here, not from the
released zipman

 scripts/libmakepkg/tidy/staticlibs.sh.in | 2 +-
 scripts/libmakepkg/tidy/strip.sh.in      | 6 +++---
 scripts/libmakepkg/tidy/zipman.sh.in     | 8 ++++----
 scripts/makepkg.sh.in                    | 6 +++---
 4 files changed, 11 insertions(+), 11 deletions(-)

Patch

diff --git a/scripts/libmakepkg/tidy/staticlibs.sh.in b/scripts/libmakepkg/tidy/staticlibs.sh.in
index eaa6ac8a..bf7601d2 100644
--- a/scripts/libmakepkg/tidy/staticlibs.sh.in
+++ b/scripts/libmakepkg/tidy/staticlibs.sh.in
@@ -34,7 +34,7 @@  tidy_staticlibs() {
 	if check_option "staticlibs" "n"; then
 		msg2 "$(gettext "Removing static library files...")"
 		local l
-		while read -rd '' l; do
+		while IFS= read -rd '' l; do
 			if [[ -f "${l%.a}.so" || -h "${l%.a}.so" ]]; then
 				rm "$l"
 			fi
diff --git a/scripts/libmakepkg/tidy/strip.sh.in b/scripts/libmakepkg/tidy/strip.sh.in
index 99bfcada..1bd810f0 100644
--- a/scripts/libmakepkg/tidy/strip.sh.in
+++ b/scripts/libmakepkg/tidy/strip.sh.in
@@ -57,7 +57,7 @@  strip_file() {
 
 		# copy source files to debug directory
 		local f t
-		while read -r t; do
+		while IFS= read -r t; do
 			f=${t/${dbgsrcdir}/"$srcdir"}
 			mkdir -p "${dbgsrc/"$dbgsrcdir"/}${t%/*}"
 			cp -- "$f" "${dbgsrc/"$dbgsrcdir"/}$t"
@@ -69,7 +69,7 @@  strip_file() {
 		objcopy --add-gnu-debuglink="$dbgdir/${binary#/}.debug" "$binary"
 
 		# create any needed hardlinks
-		while read -rd '' file ; do
+		while IFS= read -rd '' file ; do
 			if [[ "${binary}" -ef "${file}" && ! -f "$dbgdir/${file}.debug" ]]; then
 				mkdir -p "$dbgdir/${file%/*}"
 				ln "$dbgdir/${binary}.debug" "$dbgdir/${file}.debug"
@@ -110,7 +110,7 @@  tidy_strip() {
 		fi
 
 		local binary strip_flags
-		find . -type f -perm -u+w -print0 2>/dev/null | while read -rd '' binary ; do
+		find . -type f -perm -u+w -print0 2>/dev/null | while IFS= read -rd '' binary ; do
 			case "$(file -bi "$binary")" in
 				*application/x-sharedlib*)  # Libraries (.so)
 					strip_flags="$STRIP_SHARED";;
diff --git a/scripts/libmakepkg/tidy/zipman.sh.in b/scripts/libmakepkg/tidy/zipman.sh.in
index 3c2e261e..ba2f006c 100644
--- a/scripts/libmakepkg/tidy/zipman.sh.in
+++ b/scripts/libmakepkg/tidy/zipman.sh.in
@@ -35,9 +35,9 @@  tidy_zipman() {
 		msg2 "$(gettext "Compressing man and info pages...")"
 		local file files inode link
 		while read -rd ' ' inode; do
-			read file
-			find ${MAN_DIRS[@]} -type l 2>/dev/null |
-			while read -r link ; do
+			IFS= read -r file
+			find "${MAN_DIRS[@]}" -type l -print0 2>/dev/null |
+			while IFS= read -rd '' link ; do
 				if [[ "${file}" -ef "${link}" ]] ; then
 					rm -f "$link" "${link}.gz"
 					if [[ ${file%/*} = "${link%/*}" ]]; then
@@ -55,7 +55,7 @@  tidy_zipman() {
 				ln "${files[$inode]}.gz" "${file}.gz"
 				chmod 644 "${file}.gz"
 			fi
-		done < <(find ${MAN_DIRS[@]} -type f \! -name "*.gz" \! -name "*.bz2" \
+		done < <(find "${MAN_DIRS[@]}" -type f \! -name "*.gz" \! -name "*.bz2" \
 			-exec @INODECMD@ '{}' + 2>/dev/null)
 	fi
 }
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 997c8668..947a30c5 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -474,7 +474,7 @@  find_libdepends() {
 	local libdeps filename soarch sofile soname soversion
 	declare -A libdeps
 
-	while read -r filename; do
+	while IFS= read -rd '' filename; do
 		# get architecture of the file; if soarch is empty it's not an ELF binary
 		soarch=$(LC_ALL=C readelf -h "$filename" 2>/dev/null | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p')
 		[[ -n "$soarch" ]] || continue
@@ -495,7 +495,7 @@  find_libdepends() {
 				libdeps[$soname]="${soversion}-${soarch}"
 			fi
 		done
-	done < <(find "$pkgdir" -type f -perm -u+x)
+	done < <(find "$pkgdir" -type f -perm -u+x -print0)
 
 	local libdepends v
 	for d in "${depends[@]}"; do
@@ -1320,7 +1320,7 @@  if (( INFAKEROOT )); then
 	else
 		run_split_packaging
 	fi
-	
+
 	create_debug_package
 
 	msg "$(gettext "Leaving %s environment.")" "fakeroot"