diff --git a/daemon/proto.c b/daemon/proto.c index 88e2d28c7..238ee88c6 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 20f89d233..5f6ebf1ed 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 <