Re: [PATCH V2] libselinux: Fix property processing and cleanup formatting

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

 



On 06/15/2015 11:41 AM, Richard Haines wrote:
> Fix memory issues flagged by valgrind.
> These changes bring the property service in line with Android [1]
> 
> V2 reverts to original upstream %u when logging errors. Android needs
> these corrections also.
> 
> [1] https://android-review.googlesource.com/#/c/153580/
> 
> Signed-off-by: Richard Haines <richard_c_haines@xxxxxxxxxxxxxx>

Thanks, applied.

> ---
>  libselinux/src/label_android_property.c | 60 ++++++++++++++++++---------------
>  1 file changed, 33 insertions(+), 27 deletions(-)
> 
> diff --git a/libselinux/src/label_android_property.c b/libselinux/src/label_android_property.c
> index dadb160..cf1cd7b 100644
> --- a/libselinux/src/label_android_property.c
> +++ b/libselinux/src/label_android_property.c
> @@ -1,5 +1,5 @@
>  /*
> - * Property Service contexts backend for labeling Android 
> + * Property Service contexts backend for labeling Android
>   * property keys
>   */
>  
> @@ -16,7 +16,7 @@
>  /* A property security context specification. */
>  typedef struct spec {
>  	struct selabel_lookup_rec lr;	/* holds contexts for lookup result */
> -	char *property_key;	/* property key string */
> +	char *property_key;		/* property key string */
>  } spec_t;
>  
>  /* Our stored configuration */
> @@ -56,21 +56,23 @@ static int nodups_specs(struct saved_data *data, const char *path)
>  	for (ii = 0; ii < data->nspec; ii++) {
>  		curr_spec = &spec_arr[ii];
>  		for (jj = ii + 1; jj < data->nspec; jj++) {
> -			if (!strcmp(spec_arr[jj].property_key, curr_spec->property_key)) {
> +			if (!strcmp(spec_arr[jj].property_key,
> +					    curr_spec->property_key)) {
>  				rc = -1;
>  				errno = EINVAL;
> -				if (strcmp(spec_arr[jj].lr.ctx_raw, curr_spec->lr.ctx_raw)) {
> -					selinux_log(SELINUX_ERROR,
> -						    "%s: Multiple different specifications for %s  (%s and %s).\n",
> -						    path,
> -						    curr_spec->property_key,
> -						    spec_arr[jj].lr.ctx_raw,
> -						    curr_spec->lr.ctx_raw);
> +				if (strcmp(spec_arr[jj].lr.ctx_raw,
> +						    curr_spec->lr.ctx_raw)) {
> +					selinux_log
> +						(SELINUX_ERROR,
> +						 "%s: Multiple different specifications for %s  (%s and %s).\n",
> +						 path, curr_spec->property_key,
> +						 spec_arr[jj].lr.ctx_raw,
> +						 curr_spec->lr.ctx_raw);
>  				} else {
> -					selinux_log(SELINUX_ERROR,
> -						    "%s: Multiple same specifications for %s.\n",
> -						    path,
> -						    curr_spec->property_key);
> +					selinux_log
> +						(SELINUX_ERROR,
> +						 "%s: Multiple same specifications for %s.\n",
> +						 path, curr_spec->property_key);
>  				}
>  			}
>  		}
> @@ -95,21 +97,24 @@ static int process_line(struct selabel_handle *rec,
>  		selinux_log(SELINUX_WARNING,
>  			    "%s:  line %u is missing fields, skipping\n", path,
>  			    lineno);
> +		free(prop);
>  		return 0;
>  	}
>  
> -	if (pass == 1) {
> +	if (pass == 0) {
> +		free(prop);
> +		free(context);
> +	} else if (pass == 1) {
>  		/* On the second pass, process and store the specification in spec. */
> -		spec_arr[nspec].property_key = strdup(prop);
> +		spec_arr[nspec].property_key = prop;
>  		if (!spec_arr[nspec].property_key) {
>  			selinux_log(SELINUX_WARNING,
>  				    "%s:  out of memory at line %u on prop %s\n",
>  				    path, lineno, prop);
>  			return -1;
> -
>  		}
>  
> -		spec_arr[nspec].lr.ctx_raw = strdup(context);
> +		spec_arr[nspec].lr.ctx_raw = context;
>  		if (!spec_arr[nspec].lr.ctx_raw) {
>  			selinux_log(SELINUX_WARNING,
>  				    "%s:  out of memory at line %u on context %s\n",
> @@ -149,7 +154,7 @@ static int init(struct selabel_handle *rec, struct selinux_opt *opts,
>  			break;
>  		}
>  
> -	if (!path) 
> +	if (!path)
>  		return -1;
>  
>  	/* Open the specification file. */
> @@ -164,17 +169,18 @@ static int init(struct selabel_handle *rec, struct selinux_opt *opts,
>  
>  	/*
>  	 * Two passes of the specification file. First is to get the size.
> -	 * After the first pass, the spec array is malloced to the appropriate 
> -	 * size. Second pass is to populate the spec array and check for 
> +	 * After the first pass, the spec array is malloced to the appropriate
> +	 * size. Second pass is to populate the spec array and check for
>  	 * dups.
>  	 */
>  	maxnspec = UINT_MAX / sizeof(spec_t);
>  	for (pass = 0; pass < 2; pass++) {
>  		data->nspec = 0;
>  
> -		while (fgets(line_buf, sizeof line_buf - 1, fp)
> +		while (fgets(line_buf, sizeof(line_buf) - 1, fp)
>  		       && data->nspec < maxnspec) {
> -			if (process_line(rec, path, line_buf, pass, ++lineno) != 0)
> +			if (process_line(rec, path, line_buf, pass, ++lineno)
> +									  != 0)
>  				goto finish;
>  		}
>  
> @@ -186,7 +192,6 @@ static int init(struct selabel_handle *rec, struct selinux_opt *opts,
>  		}
>  
>  		if (pass == 0) {
> -
>  			if (data->nspec == 0) {
>  				status = 0;
>  				goto finish;
> @@ -234,7 +239,7 @@ static void closef(struct selabel_handle *rec)
>  
>  static struct selabel_lookup_rec *lookup(struct selabel_handle *rec,
>  					 const char *key,
> -					 int __attribute__ ((unused)) type)
> +					 int __attribute__((unused)) type)
>  {
>  	struct saved_data *data = (struct saved_data *)rec->data;
>  	spec_t *spec_arr = data->spec_arr;
> @@ -267,12 +272,13 @@ finish:
>  	return ret;
>  }
>  
> -static void stats(struct selabel_handle __attribute__ ((unused)) * rec)
> +static void stats(struct selabel_handle __attribute__((unused)) *rec)
>  {
>  	selinux_log(SELINUX_WARNING, "'stats' functionality not implemented.\n");
>  }
>  
> -int selabel_property_init(struct selabel_handle *rec, struct selinux_opt *opts,
> +int selabel_property_init(struct selabel_handle *rec,
> +			  struct selinux_opt *opts,
>  			  unsigned nopts)
>  {
>  	struct saved_data *data;
> 

_______________________________________________
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