Re: [PATCH V2] libselinux: Fix if file_contexts not '\n' terminated

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

 



On 06/26/2015 11:03 AM, Richard Haines wrote:
> If the last line of a file_contexts file is not '\n' terminated
> or if any line has additional isspace(3) characters at end, it
> gave an invalid file type error.
> read_spec_entries now handles these situations.
> 
> Signed-off-by: Richard Haines <richard_c_haines@xxxxxxxxxxxxxx>

Thanks, applied.

> ---
>  libselinux/src/label_support.c | 28 +++++++++++++++++++---------
>  1 file changed, 19 insertions(+), 9 deletions(-)
> 
> diff --git a/libselinux/src/label_support.c b/libselinux/src/label_support.c
> index cf91dfa..b3ab8ab 100644
> --- a/libselinux/src/label_support.c
> +++ b/libselinux/src/label_support.c
> @@ -17,9 +17,8 @@
>   */
>  
>  /* Read an entry from a spec file (e.g. file_contexts) */
> -static inline int read_spec_entry(char **entry, char **ptr)
> +static inline int read_spec_entry(char **entry, char **ptr, int *len)
>  {
> -	int entry_len = 0;
>  	*entry = NULL;
>  	char *tmp_buf = NULL;
>  
> @@ -27,15 +26,18 @@ static inline int read_spec_entry(char **entry, char **ptr)
>  		(*ptr)++;
>  
>  	tmp_buf = *ptr;
> +	*len = 0;
>  
>  	while (!isspace(**ptr) && **ptr != '\0') {
>  		(*ptr)++;
> -		entry_len++;
> +		(*len)++;
>  	}
>  
> -	*entry = strndup(tmp_buf, entry_len);
> -	if (!*entry)
> -		return -1;
> +	if (*len) {
> +		*entry = strndup(tmp_buf, *len);
> +		if (!*entry)
> +			return -1;
> +	}
>  
>  	return 0;
>  }
> @@ -51,12 +53,17 @@ static inline int read_spec_entry(char **entry, char **ptr)
>  int hidden read_spec_entries(char *line_buf, int num_args, ...)
>  {
>  	char **spec_entry, *buf_p;
> -	int len, rc, items;
> +	int len, rc, items, entry_len = 0;
>  	va_list ap;
>  
>  	len = strlen(line_buf);
>  	if (line_buf[len - 1] == '\n')
>  		line_buf[len - 1] = '\0';
> +	else
> +		/* Handle case if line not \n terminated by bumping
> +		 * the len for the check below (as the line is NUL
> +		 * terminated by getline(3)) */
> +		len++;
>  
>  	buf_p = line_buf;
>  	while (isspace(*buf_p))
> @@ -69,7 +76,8 @@ int hidden read_spec_entries(char *line_buf, int num_args, ...)
>  	/* Process the spec file entries */
>  	va_start(ap, num_args);
>  
> -	for (items = 0; items < num_args; items++) {
> +	items = 0;
> +	while (items < num_args) {
>  		spec_entry = va_arg(ap, char **);
>  
>  		if (len - 1 == buf_p - line_buf) {
> @@ -77,11 +85,13 @@ int hidden read_spec_entries(char *line_buf, int num_args, ...)
>  			return items;
>  		}
>  
> -		rc = read_spec_entry(spec_entry, &buf_p);
> +		rc = read_spec_entry(spec_entry, &buf_p, &entry_len);
>  		if (rc < 0) {
>  			va_end(ap);
>  			return rc;
>  		}
> +		if (entry_len)
> +			items++;
>  	}
>  	va_end(ap);
>  	return items;
> 

_______________________________________________
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