|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] libxc: fix memory leak in migration v2
On 26/07/2015 22:34, Wei Liu wrote:
> Originally there was only one counter to keep track of pages. It was
> used erroneously to keep track of how many pages were mapped and how
> many pages needed to be sent. In the end munmap(2) always had 0 as the
> length argument, which resulted in leaking the mapping.
>
> This problem was discovered on 32bit toolstack because 32bit applications
> have notably smaller address space. In fact this bug affects 64bit
> toolstack too.
>
> Use a separate counter to keep track of the number of mapped pages to
> solve this problem.
>
> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
>
> v2:
> 1. Use nr_pages_mapped to produce smaller patch.
> 2. Fix typos in commit message.
> ---
> tools/libxc/xc_sr_save.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/tools/libxc/xc_sr_save.c b/tools/libxc/xc_sr_save.c
> index d63b783..1b6be2a 100644
> --- a/tools/libxc/xc_sr_save.c
> +++ b/tools/libxc/xc_sr_save.c
> @@ -84,7 +84,7 @@ static int write_batch(struct xc_sr_context *ctx)
> void **guest_data = NULL;
> void **local_pages = NULL;
> int *errors = NULL, rc = -1;
> - unsigned i, p, nr_pages = 0;
> + unsigned i, p, nr_pages = 0, nr_pages_mapped = 0;
> unsigned nr_pfns = ctx->save.nr_batch_pfns;
> void *page, *orig_page;
> uint64_t *rec_pfns = NULL;
> @@ -160,6 +160,7 @@ static int write_batch(struct xc_sr_context *ctx)
> PERROR("Failed to map guest pages");
> goto err;
> }
> + nr_pages_mapped = nr_pages;
>
> for ( i = 0, p = 0; i < nr_pfns; ++i )
> {
> @@ -262,7 +263,7 @@ static int write_batch(struct xc_sr_context *ctx)
> err:
> free(rec_pfns);
> if ( guest_mapping )
> - munmap(guest_mapping, nr_pages * PAGE_SIZE);
> + munmap(guest_mapping, nr_pages_mapped * PAGE_SIZE);
> for ( i = 0; local_pages && i < nr_pfns; ++i )
> free(local_pages[i]);
> free(iov);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |