From 15c8ff7d0ccfaab37cbcf5e32f3760e95760628e Mon Sep 17 00:00:00 2001 From: Nadav Har'El Date: Thu, 14 Mar 2019 15:24:51 +0200 Subject: [PATCH] build: don't fail build if pathname has space Ideally, the build shouldn't care what is the pathname of the build directory. But some parts of the build process use, for historical reasons and for convenience, full pathnames, and some of that code did not correctly handle the case where the pathname might contain spaces, and the build fails. The fix is to use relative pathnames where it's easy, but where it's not, be more careful to quote the filename or avoid using the shell's argument splitting in Python code. Fixes #1034 for basic "make" and "scripts/build image=rogue", but some modules (e.g., Java) still don't build properly in this case and should be fixed separately. Signed-off-by: Nadav Har'El Message-Id: <20190314132451.26548-1-nyh@scylladb.com> --- Makefile | 10 +++++----- scripts/build | 22 +++++++++++----------- scripts/imgedit.py | 7 +++++-- scripts/upload_manifest.py | 2 +- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index 3f56080706..a433074dd7 100644 --- a/Makefile +++ b/Makefile @@ -231,10 +231,10 @@ local-includes = INCLUDES = $(local-includes) -Iarch/$(arch) -I. -Iinclude -Iarch/common INCLUDES += -isystem include/glibc-compat -glibcbase = $(CURDIR)/external/$(arch)/glibc.bin -gccbase = $(CURDIR)/external/$(arch)/gcc.bin -miscbase = $(CURDIR)/external/$(arch)/misc.bin -jdkbase := $(shell find $(CURDIR)/external/$(arch)/openjdk.bin/usr/lib/jvm \ +glibcbase = external/$(arch)/glibc.bin +gccbase = external/$(arch)/gcc.bin +miscbase = external/$(arch)/misc.bin +jdkbase := $(shell find external/$(arch)/openjdk.bin/usr/lib/jvm \ -maxdepth 1 -type d -name 'java*') @@ -1911,7 +1911,7 @@ $(bootfs_manifest_dep): phony $(out)/bootfs.bin: scripts/mkbootfs.py $(bootfs_manifest) $(bootfs_manifest_dep) $(tools:%=$(out)/%) \ $(out)/zpool.so $(out)/zfs.so $(out)/libenviron.so $(out)/libvdso.so - $(call quiet, olddir=`pwd`; cd $(out); $$olddir/scripts/mkbootfs.py -o bootfs.bin -d bootfs.bin.d -m $$olddir/$(bootfs_manifest) \ + $(call quiet, olddir=`pwd`; cd $(out); "$$olddir"/scripts/mkbootfs.py -o bootfs.bin -d bootfs.bin.d -m "$$olddir"/$(bootfs_manifest) \ -D jdkbase=$(jdkbase) -D gccbase=$(gccbase) -D \ glibcbase=$(glibcbase) -D miscbase=$(miscbase), MKBOOTFS $@) diff --git a/scripts/build b/scripts/build index 557a88a43c..03366ded20 100755 --- a/scripts/build +++ b/scripts/build @@ -119,10 +119,10 @@ esac modules=${vars[modules]-!$image} # TODO: some modules need these... Would be better if they wouldn't... -jdkbase=${vars[jdkbase]-`find $SRC/external/$arch/openjdk.bin/usr/lib/jvm -maxdepth 1 -type d -name 'java*'`} -gccbase=${vars[gccbase]-$SRC/external/$arch/gcc.bin} -glibcbase=${vars[glibcbase]-$SRC/external/$arch/glibc.bin} -miscbase=${vars[miscbase]-$SRC/external/$arch/misc.bin} +jdkbase=${vars[jdkbase]-`find "$SRC"/external/$arch/openjdk.bin/usr/lib/jvm -maxdepth 1 -type d -name 'java*'`} +gccbase=${vars[gccbase]-"$SRC"/external/$arch/gcc.bin} +glibcbase=${vars[glibcbase]-"$SRC"/external/$arch/glibc.bin} +miscbase=${vars[miscbase]-"$SRC"/external/$arch/misc.bin} case $OUT in /*) OSV_BUILD_PATH=$OUT;; @@ -182,26 +182,26 @@ case $fs_type in zfs) cp loader.img bare.raw zfs_size=$(($fs_size - $kernel_end)) - $SRC/scripts/imgedit.py setpartition "-f raw bare.raw" 2 $kernel_end $zfs_size + "$SRC"/scripts/imgedit.py setpartition "-f raw bare.raw" 2 $kernel_end $zfs_size qemu-img convert -f raw -O qcow2 bare.raw usr.img qemu-img resize usr.img ${fs_size}b >/dev/null 2>&1 if [ "$export" == "none" ] then - $SRC/scripts/upload_manifest.py -o usr.img -m usr.manifest -D jdkbase=$jdkbase -D gccbase=$gccbase -D glibcbase=$glibcbase -D miscbase=$miscbase + "$SRC"/scripts/upload_manifest.py -o usr.img -m usr.manifest -D jdkbase="$jdkbase" -D gccbase="$gccbase" -D glibcbase="$glibcbase" -D miscbase="$miscbase" else export_dir=${vars[export_dir]-$SRC/build/export} - $SRC/scripts/export_manifest.py -e "$export_dir" -m usr.manifest -D jdkbase=$jdkbase -D gccbase=$gccbase -D glibcbase=$glibcbase -D miscbase=$miscbase + "$SRC"/scripts/export_manifest.py -e "$export_dir" -m usr.manifest -D jdkbase="$jdkbase" -D gccbase="$gccbase" -D glibcbase="$glibcbase" -D miscbase="$miscbase" fi ;; rofs) rm -rf rofs.img - $SRC/scripts/gen-${fs_type}-img.py -o rofs.img -m usr.manifest -D jdkbase=$jdkbase -D gccbase=$gccbase -D glibcbase=$glibcbase -D miscbase=$miscbase + "$SRC"/scripts/gen-${fs_type}-img.py -o rofs.img -m usr.manifest -D jdkbase="$jdkbase" -D gccbase="$gccbase" -D glibcbase="$glibcbase" -D miscbase="$miscbase" rofs_size=`stat --printf %s rofs.img` img_size=$((kernel_end + rofs_size)) cp loader.img bare.raw - $SRC/scripts/imgedit.py setpartition "-f raw bare.raw" 2 $kernel_end $rofs_size + "$SRC"/scripts/imgedit.py setpartition "-f raw bare.raw" 2 $kernel_end $rofs_size qemu-img resize bare.raw ${img_size}b >/dev/null 2>&1 dd if=rofs.img of=bare.raw obs=${kernel_end} seek=1 >/dev/null 2>&1 qemu-img convert -f raw -O qcow2 bare.raw usr.img @@ -211,14 +211,14 @@ ramfs) ;; esac -$SRC/scripts/imgedit.py setargs usr.img `cat cmdline` +"$SRC"/scripts/imgedit.py setargs usr.img `cat cmdline` # Support "build check" for i do case $i in check) set -x - cd $SRC + cd "$SRC" exec ./scripts/test.py esac done diff --git a/scripts/imgedit.py b/scripts/imgedit.py index a58e9b8c82..7fa566c277 100755 --- a/scripts/imgedit.py +++ b/scripts/imgedit.py @@ -50,13 +50,16 @@ def write_cstr(file, str): class nbd_file(object): def __init__(self, filename): + fileformat = [] + if filename.startswith("-f raw "): + filename = filename[7:] + fileformat = ['-f', 'raw'] self._filename = filename self._offset = 0 self._buf = None self._closed = True nbd_port = randint(10809, 20809) - self._process = subprocess.Popen("qemu-nbd -p %d %s" % (nbd_port, filename), - shell=True, stdout=_devnull) + self._process = subprocess.Popen(["qemu-nbd", "-p", str(nbd_port)] + fileformat + [filename], shell=False, stdout=_devnull) # wait for qemu-nbd to start: this thing doesn't tell anything on stdout while True: try: diff --git a/scripts/upload_manifest.py b/scripts/upload_manifest.py index 341c43491d..ae13cfbf2e 100755 --- a/scripts/upload_manifest.py +++ b/scripts/upload_manifest.py @@ -154,7 +154,7 @@ def main(): image_path = os.path.abspath(options.output) upload_port = find_free_port() - osv = subprocess.Popen('cd ../..; scripts/run.py --vnc none -m 512 -c1 -i %s -u -s -e "--norandom --nomount --noinit /tools/mkfs.so; /tools/cpiod.so --prefix /zfs/zfs/; /zfs.so set compression=off osv" --forward tcp:127.0.0.1:%s-:10000' % (image_path,upload_port), shell=True, stdout=subprocess.PIPE) + osv = subprocess.Popen('cd ../..; scripts/run.py --vnc none -m 512 -c1 -i "%s" -u -s -e "--norandom --nomount --noinit /tools/mkfs.so; /tools/cpiod.so --prefix /zfs/zfs/; /zfs.so set compression=off osv" --forward tcp:127.0.0.1:%s-:10000' % (image_path,upload_port), shell=True, stdout=subprocess.PIPE) upload(osv, manifest, depends, upload_port)