ACK: [PATCH] lib: fwts_alloc: make allocator more robust

Alex Hung alex.hung at canonical.com
Mon Jul 25 01:38:19 UTC 2016


On 2016-07-23 12:15 AM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Ensure we only consider allocation information when sscanf returns
> the number of items requested.
>
> Also, make all the mmap'd regions MAP_SHARED otherwise they don't appear
> in /proc/self/maps and hence the low memory allocator may not find previously
> mapped pages and try to reallocate them.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>  src/lib/src/fwts_alloc.c | 15 ++++++++-------
>  1 file changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/src/lib/src/fwts_alloc.c b/src/lib/src/fwts_alloc.c
> index f468229..91393f7 100644
> --- a/src/lib/src/fwts_alloc.c
> +++ b/src/lib/src/fwts_alloc.c
> @@ -91,7 +91,7 @@ static void *fwts_low_mmap_walkdown(const size_t requested_size)
>  			continue;
>
>  		mapping = mmap(addr, requested_size, PROT_READ | PROT_WRITE,
> -			MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
> +			MAP_SHARED | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
>  		if (mapping != MAP_FAILED) {
>  			last_addr = mapping;
>  			return mapping;
> @@ -130,8 +130,9 @@ static void *fwts_low_mmap(const size_t requested_size)
>  		return fwts_low_mmap_walkdown(requested_size);
>
>  	while (fgets(buffer, sizeof(buffer), fp) != NULL) {
> -		sscanf(buffer, "%p-%p %*s %*x %*s %*u %1023s",
> -			&addr_start, &addr_end, pathname);
> +		if (sscanf(buffer, "%p-%p %*s %*x %*s %*u %1023s",
> +		    &addr_start, &addr_end, pathname) != 3)
> +			continue;
>  		/*
>  		 *  Try and allocate under first mmap'd address space
>  		 */
> @@ -150,7 +151,7 @@ static void *fwts_low_mmap(const size_t requested_size)
>  				addr = (void*)LIMIT_2GB - sz;
>
>  			ret = mmap(addr, requested_size, PROT_READ | PROT_WRITE,
> -				MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
> +				MAP_SHARED | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
>  			if (ret != MAP_FAILED)
>  				break;	/* Success! */
>
> @@ -167,7 +168,7 @@ static void *fwts_low_mmap(const size_t requested_size)
>  				void *addr = last_addr_end;
>
>  				ret = mmap(addr, requested_size, PROT_READ | PROT_WRITE,
> -					MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
> +					MAP_SHARED | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
>  				if (ret != MAP_FAILED)
>  					break;	/* Success! */
>  			}
> @@ -216,12 +217,12 @@ void *fwts_low_calloc(const size_t nmemb, const size_t size)
>  #ifdef MAP_32BIT
>  	/* Not portable, only x86 */
>  	ret = mmap(NULL, n, PROT_READ | PROT_WRITE,
> -		MAP_PRIVATE | MAP_ANONYMOUS | MAP_32BIT, -1, 0);
> +		MAP_SHARED | MAP_ANONYMOUS | MAP_32BIT, -1, 0);
>  #else
>  	if (sizeof(void *) == 4) {
>  		/* 32 bit mmap by default */
>  		ret = mmap(NULL, n, PROT_READ | PROT_WRITE,
> -			MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> +			MAP_SHARED | MAP_ANONYMOUS, -1, 0);
>  	}
>  #endif
>  	/* 32 bit mmap failed, so bodge our own 32 bit mmap */
>

Acked-by: Alex Hung <alex.hung at canonical.com>



More information about the fwts-devel mailing list