migrate-set-parameters passes the size to xbzrle_cache_resize(). xbzrle_cache_resize() checks it fits into size_t before it passes it on to cache_init(). cache_init() checks it is a power of two no smaller than @page_size.
cache_init() is also called from xbzrle_init(), bypassing xbzrle_cache_resize()'s check. Drop xbzrle_cache_resize()'s check, and check more carefully in cache_init(). Signed-off-by: Markus Armbruster <arm...@redhat.com> --- migration/page_cache.c | 15 ++++----------- migration/ram.c | 7 ------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/migration/page_cache.c b/migration/page_cache.c index b384f265fb..e07f4ad1dc 100644 --- a/migration/page_cache.c +++ b/migration/page_cache.c @@ -41,17 +41,10 @@ struct PageCache { PageCache *cache_init(uint64_t new_size, size_t page_size, Error **errp) { int64_t i; - size_t num_pages = new_size / page_size; + uint64_t num_pages = new_size / page_size; PageCache *cache; - if (new_size < page_size) { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size", - "is smaller than one target page size"); - return NULL; - } - - /* round down to the nearest power of 2 */ - if (!is_power_of_2(num_pages)) { + if (num_pages != (size_t)num_pages || !is_power_of_2(num_pages)) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size", "is not a power of two number of pages"); return NULL; @@ -71,8 +64,8 @@ PageCache *cache_init(uint64_t new_size, size_t page_size, Error **errp) trace_migration_pagecache_init(cache->max_num_items); /* We prefer not to abort if there is no memory */ - cache->page_cache = g_try_malloc((cache->max_num_items) * - sizeof(*cache->page_cache)); + cache->page_cache = g_try_malloc_n(cache->max_num_items, + sizeof(*cache->page_cache)); if (!cache->page_cache) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size", "Failed to allocate page cache"); diff --git a/migration/ram.c b/migration/ram.c index a84425d04f..d632ae694c 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -131,13 +131,6 @@ int xbzrle_cache_resize(uint64_t new_size, Error **errp) PageCache *new_cache; int64_t ret = 0; - /* Check for truncation */ - if (new_size != (size_t)new_size) { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size", - "exceeding address space"); - return -1; - } - if (new_size == migrate_xbzrle_cache_size()) { /* nothing to do */ return 0; -- 2.26.2