libxc: Check xc_domain_maximum_gpfn for negative return values

Instead of assuming everything is always OK. We stash
the gpfns value as an parameter. Since we use it in three
of places we might as well update xc_domain_maximum_gpfn
to do the right thing.

Suggested-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
Konrad Rzeszutek Wilk authored and Ian Campbell committed 2015-03-20 16:06:53 +00:00
1 parent af5d428947
commit a8f8a590e0
5 files changed
+30 -29

No files matched your search

+1 -1
View File
@@ -1315,7 +1315,7 @@ int xc_domain_get_tsc_info(xc_interface *xch,
int xc_domain_disable_migrate(xc_interface *xch, uint32_t domid);
int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid);
int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid, xen_pfn_t *gpfns);
int xc_domain_increase_reservation(xc_interface *xch,
uint32_t domid,
+4 -7
View File
@@ -30,12 +30,6 @@ xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt,
return 0;
}
static int nr_gpfns(xc_interface *xch, domid_t domid)
{
return xc_domain_maximum_gpfn(xch, domid) + 1;
}
int
xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info)
{
@@ -48,9 +42,12 @@ xc_core_arch_memory_map_get(xc_interface *xch, struct xc_core_arch_context *unus
xc_core_memory_map_t **mapp,
unsigned int *nr_entries)
{
unsigned long p2m_size = nr_gpfns(xch, info->domid);
xen_pfn_t p2m_size = 0;
xc_core_memory_map_t *map;
if ( xc_domain_maximum_gpfn(xch, info->domid, &p2m_size) < 0 )
return -1;
map = malloc(sizeof(*map));
if ( map == NULL )
{
+11 -18
View File
@@ -35,12 +35,6 @@ xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt,
return 1;
}
static int nr_gpfns(xc_interface *xch, domid_t domid)
{
return xc_domain_maximum_gpfn(xch, domid) + 1;
}
int
xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info)
{
@@ -53,9 +47,12 @@ xc_core_arch_memory_map_get(xc_interface *xch, struct xc_core_arch_context *unus
xc_core_memory_map_t **mapp,
unsigned int *nr_entries)
{
unsigned long p2m_size = nr_gpfns(xch, info->domid);
xen_pfn_t p2m_size = 0;
xc_core_memory_map_t *map;
if ( xc_domain_maximum_gpfn(xch, info->domid, &p2m_size) < 0 )
return -1;
map = malloc(sizeof(*map));
if ( map == NULL )
{
@@ -88,7 +85,12 @@ xc_core_arch_map_p2m_rw(xc_interface *xch, struct domain_info_context *dinfo, xc
int err;
int i;
dinfo->p2m_size = nr_gpfns(xch, info->domid);
if ( xc_domain_maximum_gpfn(xch, info->domid, &dinfo->p2m_size) < 0 )
{
ERROR("Could not get maximum GPFN!");
goto out;
}
if ( dinfo->p2m_size < info->nr_pages )
{
ERROR("p2m_size < nr_pages -1 (%lx < %lx", dinfo->p2m_size, info->nr_pages - 1);
@@ -210,16 +212,7 @@ int
xc_core_arch_get_scratch_gpfn(xc_interface *xch, domid_t domid,
xen_pfn_t *gpfn)
{
int rc;
rc = xc_domain_maximum_gpfn(xch, domid);
if ( rc < 0 )
return rc;
*gpfn = (xen_pfn_t)rc + 1;
return 0;
return xc_domain_maximum_gpfn(xch, domid, gpfn);
}
/*
+9 -2
View File
@@ -789,9 +789,16 @@ int xc_domain_get_tsc_info(xc_interface *xch,
}
int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid)
int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid, xen_pfn_t *gpfns)
{
return do_memory_op(xch, XENMEM_maximum_gpfn, &domid, sizeof(domid));
int rc = do_memory_op(xch, XENMEM_maximum_gpfn, &domid, sizeof(domid));
if ( rc >= 0 )
{
*gpfns = rc + 1;
rc = 0;
}
return rc;
}
int xc_domain_increase_reservation(xc_interface *xch,
+5 -1
View File
@@ -939,7 +939,11 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
}
/* Get the size of the P2M table */
dinfo->p2m_size = xc_domain_maximum_gpfn(xch, dom) + 1;
if ( xc_domain_maximum_gpfn(xch, dom, &dinfo->p2m_size) < 0 )
{
ERROR("Could not get maximum GPFN!");
goto out;
}
if ( dinfo->p2m_size > ~XEN_DOMCTL_PFINFO_LTAB_MASK )
{
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.