diff options
-rw-r--r-- | daemon/proto.c | 6 | ||||
-rwxr-xr-x | regressions/test-cancellation-download-librarycancels.sh | 26 |
2 files changed, 26 insertions, 6 deletions
diff --git a/daemon/proto.c b/daemon/proto.c index 88e2d28c..238ee88c 100644 --- a/daemon/proto.c +++ b/daemon/proto.c @@ -101,6 +101,12 @@ main_loop (int _sock) "guestfsd: main_loop: new request, len 0x%" PRIx32 "\n", len); + /* Cancellation sent from the library and received after the + * previous request has finished processing. Just ignore it. + */ + if (len == GUESTFS_CANCEL_FLAG) + continue; + if (len > GUESTFS_MESSAGE_MAX) { fprintf (stderr, "guestfsd: incoming message is too long (%u bytes)\n", len); diff --git a/regressions/test-cancellation-download-librarycancels.sh b/regressions/test-cancellation-download-librarycancels.sh index 20f89d23..5f6ebf1e 100755 --- a/regressions/test-cancellation-download-librarycancels.sh +++ b/regressions/test-cancellation-download-librarycancels.sh @@ -18,22 +18,36 @@ # Test download where the library cancels. # -# +# Download big and small files to /dev/full. This should fail but not +# kill the appliance. We test various randomized file sizes because +# there are many potential race conditions -- for example the daemon +# may or may not send all of its data because the error condition is +# detected. set -e rm -f test.img -../fish/guestfish <<'EOF' -add ../images/test.iso +size=$(awk 'BEGIN{ srand(); print int(16*1024*rand()) }') +echo "$0: test size $size (bytes)" + +../fish/guestfish <<EOF +# We want the file to be fully allocated. +alloc test.img 10M run -mount-ro /dev/sda / +part-disk /dev/sda mbr +mkfs ext2 /dev/sda1 +mount-options "" /dev/sda1 / -# Download a file to /dev/full. --download /100krandom /dev/full +fallocate64 /file $size +# Download the file into /dev/full so it fails. +-download /file /dev/full + +# The daemon should still be reachable after the failure. ping-daemon + EOF rm -f test.img |