Re: [PATCH] libselinux: Fix mmap memory release for file labeling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09/15/2015 09:33 AM, Richard Haines wrote:
> Ensure the mmap start address and length are not modified so the memory
> used can be released when selabel_close(3) is called.
> 
> Signed-off-by: Richard Haines <richard_c_haines@xxxxxxxxxxxxxx>

Thanks, applied.

> ---
>  libselinux/src/label_file.c | 12 ++++++------
>  libselinux/src/label_file.h | 14 ++++++++------
>  2 files changed, 14 insertions(+), 12 deletions(-)
> 
> diff --git a/libselinux/src/label_file.c b/libselinux/src/label_file.c
> index 687d0a7..bf91885 100644
> --- a/libselinux/src/label_file.c
> +++ b/libselinux/src/label_file.c
> @@ -159,8 +159,8 @@ static int load_mmap(struct selabel_handle *rec, const char *path,
>  	}
>  
>  	/* save where we mmap'd the file to cleanup on close() */
> -	mmap_area->addr = addr;
> -	mmap_area->len = len;
> +	mmap_area->addr = mmap_area->next_addr = addr;
> +	mmap_area->len = mmap_area->next_len = len;
>  	mmap_area->next = data->mmap_areas;
>  	data->mmap_areas = mmap_area;
>  
> @@ -231,7 +231,7 @@ static int load_mmap(struct selabel_handle *rec, const char *path,
>  
>  		/* Check for stem_len wrap around. */
>  		if (stem_len < UINT32_MAX) {
> -			buf = (char *)mmap_area->addr;
> +			buf = (char *)mmap_area->next_addr;
>  			/* Check if over-run before null check. */
>  			rc = next_entry(NULL, mmap_area, (stem_len + 1));
>  			if (rc < 0)
> @@ -317,7 +317,7 @@ static int load_mmap(struct selabel_handle *rec, const char *path,
>  			goto err;
>  		}
>  
> -		spec->regex_str = (char *)mmap_area->addr;
> +		spec->regex_str = (char *)mmap_area->next_addr;
>  		rc = next_entry(NULL, mmap_area, entry_len);
>  		if (rc < 0)
>  			goto err;
> @@ -369,7 +369,7 @@ static int load_mmap(struct selabel_handle *rec, const char *path,
>  			rc = -1;
>  			goto err;
>  		}
> -		spec->regex = (pcre *)mmap_area->addr;
> +		spec->regex = (pcre *)mmap_area->next_addr;
>  		rc = next_entry(NULL, mmap_area, entry_len);
>  		if (rc < 0)
>  			goto err;
> @@ -387,7 +387,7 @@ static int load_mmap(struct selabel_handle *rec, const char *path,
>  			rc = -1;
>  			goto err;
>  		}
> -		spec->lsd.study_data = (void *)mmap_area->addr;
> +		spec->lsd.study_data = (void *)mmap_area->next_addr;
>  		spec->lsd.flags |= PCRE_EXTRA_STUDY_DATA;
>  		rc = next_entry(NULL, mmap_area, entry_len);
>  		if (rc < 0)
> diff --git a/libselinux/src/label_file.h b/libselinux/src/label_file.h
> index e6a687a..2492826 100644
> --- a/libselinux/src/label_file.h
> +++ b/libselinux/src/label_file.h
> @@ -49,8 +49,10 @@ struct stem {
>  
>  /* Where we map the file in during selabel_open() */
>  struct mmap_area {
> -	void *addr;	/* Start of area - gets incremented by next_entry() */
> -	size_t len;	/* Length - gets decremented by next_entry() */
> +	void *addr;	/* Start addr + len used to release memory at close */
> +	size_t len;
> +	void *next_addr;	/* Incremented by next_entry() */
> +	size_t next_len;	/* Decremented by next_entry() */
>  	struct mmap_area *next;
>  };
>  
> @@ -310,14 +312,14 @@ static inline int find_stem_from_spec(struct saved_data *data, const char *buf)
>   * current buffer). */
>  static inline int next_entry(void *buf, struct mmap_area *fp, size_t bytes)
>  {
> -	if (bytes > fp->len)
> +	if (bytes > fp->next_len)
>  		return -1;
>  
>  	if (buf)
> -		memcpy(buf, fp->addr, bytes);
> +		memcpy(buf, fp->next_addr, bytes);
>  
> -	fp->addr = (char *)fp->addr + bytes;
> -	fp->len -= bytes;
> +	fp->next_addr = (char *)fp->next_addr + bytes;
> +	fp->next_len -= bytes;
>  	return 0;
>  }
>  
> 

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.



[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux