diff options
author | Stefan Hajnoczi <stefanha@redhat.com> | 2019-02-14 11:10:04 +0800 |
---|---|---|
committer | Eduardo Habkost <ehabkost@redhat.com> | 2019-03-11 10:44:19 -0300 |
commit | 314aec4a6e06844937f1677f6cba21981005f389 (patch) | |
tree | 9321a3ea8b1083ef391d6ca5123f8b73eada42a5 /backends/hostmem-file.c | |
parent | 336cfef495f0cd5b1606251c52628d0372e9a809 (diff) | |
download | qemu-314aec4a6e06844937f1677f6cba21981005f389.zip qemu-314aec4a6e06844937f1677f6cba21981005f389.tar.gz qemu-314aec4a6e06844937f1677f6cba21981005f389.tar.bz2 |
hostmem-file: reject invalid pmem file sizes
Guests started with NVDIMMs larger than the underlying host file produce
confusing errors inside the guest. This happens because the guest
accesses pages beyond the end of the file.
Check the pmem file size on startup and print a clear error message if
the size is invalid.
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1669053
Cc: Wei Yang <richardw.yang@linux.intel.com>
Cc: Zhang Yi <yi.z.zhang@linux.intel.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-Id: <20190214031004.32522-3-stefanha@redhat.com>
Reviewed-by: Wei Yang <richardw.yang@linux.intel.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Pankaj Gupta <pagupta@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Diffstat (limited to 'backends/hostmem-file.c')
-rw-r--r-- | backends/hostmem-file.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c index ce54788..37ac644 100644 --- a/backends/hostmem-file.c +++ b/backends/hostmem-file.c @@ -56,6 +56,29 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) error_setg(errp, "mem-path property not set"); return; } + + /* + * Verify pmem file size since starting a guest with an incorrect size + * leads to confusing failures inside the guest. + */ + if (fb->is_pmem) { + Error *local_err = NULL; + uint64_t size; + + size = qemu_get_pmem_size(fb->mem_path, &local_err); + if (!size) { + error_propagate(errp, local_err); + return; + } + + if (backend->size > size) { + error_setg(errp, "size property %" PRIu64 " is larger than " + "pmem file \"%s\" size %" PRIu64, backend->size, + fb->mem_path, size); + return; + } + } + backend->force_prealloc = mem_prealloc; name = host_memory_backend_get_name(backend); memory_region_init_ram_from_file(&backend->mr, OBJECT(backend), |