Re: [PATCH v3] libsemanage: Enable configuration of bzip behavior

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

 



On 08/04/2009 10:38 AM, Stephen Smalley wrote:
> Allow the administrator to customize the bzip block size and "small"
> flag via semanage.conf.  After applying you can add entries like these
> to your /etc/selinux/semanage.conf to trade off memory vs disk space
> (block size) and to trade off memory vs runtime (small):
> 
> bzip-blocksize=4
> bzip-small=true
> 
> You can also disable bzip compression altogether for your module store
> via:
> bzip-blocksize=0
> 
> The semanage.conf entries are now validated against legal value ranges
> at handle creation time.
> 
> Signed-off-by:  Stephen Smalley <sds@xxxxxxxxxxxxx>
> 
> diff --git a/libsemanage/src/conf-parse.y b/libsemanage/src/conf-parse.y
> index 2001afb..f2473aa 100644
> --- a/libsemanage/src/conf-parse.y
> +++ b/libsemanage/src/conf-parse.y
> @@ -58,6 +58,7 @@ static int parse_errors;
>  
>  %token MODULE_STORE VERSION EXPAND_CHECK FILE_MODE SAVE_PREVIOUS SAVE_LINKED
>  %token LOAD_POLICY_START SETFILES_START DISABLE_GENHOMEDIRCON HANDLE_UNKNOWN
> +%token BZIP_BLOCKSIZE BZIP_SMALL
>  %token VERIFY_MOD_START VERIFY_LINKED_START VERIFY_KERNEL_START BLOCK_END
>  %token PROG_PATH PROG_ARGS
>  %token <s> ARG
> @@ -82,6 +83,8 @@ single_opt:     module_store
>          |       save_linked
>          |       disable_genhomedircon
>          |       handle_unknown
> +	|	bzip_blocksize
> +	|	bzip_small
>          ;
>  
>  module_store:   MODULE_STORE '=' ARG {
> @@ -163,6 +166,26 @@ handle_unknown: HANDLE_UNKNOWN '=' ARG {
>  	free($3);
>   }
>  
> +bzip_blocksize:  BZIP_BLOCKSIZE '=' ARG {
> +	int blocksize = atoi($3);
> +	free($3);
> +	if (blocksize > 9)
> +		yyerror("bzip-blocksize can only be in the range 0-9");
> +	else
> +		current_conf->bzip_blocksize = blocksize;
> +}
> +	
> +bzip_small:  BZIP_SMALL '=' ARG {
> +	if (strcasecmp($3, "false") == 0) {
> +		current_conf->bzip_small = 0;
> +	} else if (strcasecmp($3, "true") == 0) {
> +		current_conf->bzip_small = 1;
> +	} else {
> +		yyerror("bzip-small can only be 'true' or 'false'");
> +	}
> +	free($3);
> +}
> +
>  command_block: 
>                  command_start external_opts BLOCK_END  {
>                          if (new_external->path == NULL) {
> @@ -230,6 +253,8 @@ static int semanage_conf_init(semanage_conf_t * conf)
>  	conf->expand_check = 1;
>  	conf->handle_unknown = -1;
>  	conf->file_mode = 0644;
> +	conf->bzip_blocksize = 9;
> +	conf->bzip_small = 0;
>  
>  	conf->save_previous = 0;
>  	conf->save_linked = 0;
> diff --git a/libsemanage/src/conf-scan.l b/libsemanage/src/conf-scan.l
> index faa0aeb..8af5137 100644
> --- a/libsemanage/src/conf-scan.l
> +++ b/libsemanage/src/conf-scan.l
> @@ -47,6 +47,8 @@ save-previous     return SAVE_PREVIOUS;
>  save-linked       return SAVE_LINKED;
>  disable-genhomedircon return DISABLE_GENHOMEDIRCON;
>  handle-unknown    return HANDLE_UNKNOWN;
> +bzip-blocksize	return BZIP_BLOCKSIZE;
> +bzip-small	return BZIP_SMALL;
>  "[load_policy]"   return LOAD_POLICY_START;
>  "[setfiles]"      return SETFILES_START;
>  "[verify module]" return VERIFY_MOD_START;
> diff --git a/libsemanage/src/direct_api.c b/libsemanage/src/direct_api.c
> index bd13387..92799ad 100644
> --- a/libsemanage/src/direct_api.c
> +++ b/libsemanage/src/direct_api.c
> @@ -401,7 +401,9 @@ static int parse_base_headers(semanage_handle_t * sh,
>  
>  /* bzip() a data to a file, returning the total number of compressed bytes
>   * in the file.  Returns -1 if file could not be compressed. */
> -static ssize_t bzip(const char *filename, char *data, size_t num_bytes) {
> +static ssize_t bzip(semanage_handle_t *sh, const char *filename, char *data,
> +			size_t num_bytes) 
> +{
>  	BZFILE* b;
>  	size_t  size = 1<<16;
>  	int     bzerror;
> @@ -413,7 +415,16 @@ static ssize_t bzip(const char *filename, char *data, size_t num_bytes) {
>  		return -1;
>  	}
>  
> -	b = BZ2_bzWriteOpen( &bzerror, f, 9, 0, 0);
> +	if (!sh->conf->bzip_blocksize) {
> +		if (fwrite(data, 1, num_bytes, f) < num_bytes) {
> +			fclose(f);
> +			return -1;
> +		}
> +		fclose(f);
> +		return num_bytes;
> +	}
> +
> +	b = BZ2_bzWriteOpen( &bzerror, f, sh->conf->bzip_blocksize, 0, 0);
>  	if (bzerror != BZ_OK) {
>  		BZ2_bzWriteClose ( &bzerror, b, 1, 0, 0 );
>  		return -1;
> @@ -443,15 +454,19 @@ static ssize_t bzip(const char *filename, char *data, size_t num_bytes) {
>  
>  /* bunzip() a file to '*data', returning the total number of uncompressed bytes
>   * in the file.  Returns -1 if file could not be decompressed. */
> -ssize_t bunzip(FILE *f, char **data) {
> +ssize_t bunzip(semanage_handle_t *sh, FILE *f, char **data)
> +{
>  	BZFILE* b;
>  	size_t  nBuf;
>  	char    buf[1<<18];
>  	size_t  size = sizeof(buf);
>  	int     bzerror;
>  	size_t  total=0;
> +
> +	if (!sh->conf->bzip_blocksize)
> +		return -1;
>  	
> -	b = BZ2_bzReadOpen ( &bzerror, f, 0, 0, NULL, 0 );
> +	b = BZ2_bzReadOpen ( &bzerror, f, 0, sh->conf->bzip_small, NULL, 0 );
>  	if ( bzerror != BZ_OK ) {
>  		BZ2_bzReadClose ( &bzerror, b );
>  		return -1;
> @@ -486,11 +501,12 @@ ssize_t bunzip(FILE *f, char **data) {
>   * the file into '*data'.
>   * Returns the total number of bytes in memory .
>   * Returns -1 if file could not be opened or mapped. */
> -static ssize_t map_file(int fd, char **data, int *compressed)
> +static ssize_t map_file(semanage_handle_t *sh, int fd, char **data,
> +			int *compressed)
>  {
>  	ssize_t size = -1;
>  	char *uncompress;
> -	if ((size = bunzip(fdopen(fd, "r"), &uncompress)) > 0) {
> +	if ((size = bunzip(sh, fdopen(fd, "r"), &uncompress)) > 0) {
>  		*data = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
>  		if (*data == MAP_FAILED) {
>  			free(uncompress);
> @@ -997,7 +1013,7 @@ static int semanage_direct_install(semanage_handle_t * sh,
>  					   &filename)) != 0) {
>  		goto cleanup;
>  	}
> -	if (bzip(filename, data, data_len) <= 0) {
> +	if (bzip(sh, filename, data, data_len) <= 0) {
>  		ERR(sh, "Error while writing to %s.", filename);
>  		retval = -3;
>  		goto cleanup;
> @@ -1029,7 +1045,7 @@ static int semanage_direct_install_file(semanage_handle_t * sh,
>  		return -1;
>  	}
>  
> -	if ((data_len = map_file(in_fd, &data, &compressed)) <= 0) {
> +	if ((data_len = map_file(sh, in_fd, &data, &compressed)) <= 0) {
>  		goto cleanup;
>  	}
>  		
> @@ -1127,7 +1143,7 @@ static int semanage_direct_upgrade(semanage_handle_t * sh,
>  						 data, data_len, 
>  						 &filename);
>  	if (retval == 0) {
> -		if (bzip(filename, data, data_len) <= 0) {
> +		if (bzip(sh, filename, data, data_len) <= 0) {
>  			ERR(sh, "Error while writing to %s.", filename);
>  			retval = -3;
>  		}
> @@ -1155,7 +1171,7 @@ static int semanage_direct_upgrade_file(semanage_handle_t * sh,
>  		return -1;
>  	}
>  
> -	if ((data_len = map_file(in_fd, &data, &compressed)) <= 0) {
> +	if ((data_len = map_file(sh, in_fd, &data, &compressed)) <= 0) {
>  		goto cleanup;
>  	}
>  
> @@ -1197,7 +1213,7 @@ static int semanage_direct_install_base(semanage_handle_t * sh,
>  	if ((filename = semanage_path(SEMANAGE_TMP, SEMANAGE_BASE)) == NULL) {
>  		goto cleanup;
>  	}
> -	if (bzip(filename, base_data, data_len) <= 0) {
> +	if (bzip(sh, filename, base_data, data_len) <= 0) {
>  		ERR(sh, "Error while writing to %s.", filename);
>  		retval = -3;
>  		goto cleanup;
> @@ -1225,7 +1241,7 @@ static int semanage_direct_install_base_file(semanage_handle_t * sh,
>  		return -1;
>  	}
>  
> -	if ((data_len = map_file(in_fd, &data, &compressed)) <= 0) {
> +	if ((data_len = map_file(sh, in_fd, &data, &compressed)) <= 0) {
>  		goto cleanup;
>  	}
>  		
> @@ -1347,7 +1363,7 @@ static int semanage_direct_list(semanage_handle_t * sh,
>  		ssize_t size;
>  		char *data = NULL;
>  
> -		if ((size = bunzip(fp, &data)) > 0) {
> +		if ((size = bunzip(sh, fp, &data)) > 0) {
>  			fclose(fp);
>  			fp = fmemopen(data, size, "rb");
>  			if (!fp) {
> diff --git a/libsemanage/src/direct_api.h b/libsemanage/src/direct_api.h
> index 1ad7d1d..e56107b 100644
> --- a/libsemanage/src/direct_api.h
> +++ b/libsemanage/src/direct_api.h
> @@ -41,6 +41,6 @@ int semanage_direct_mls_enabled(struct semanage_handle *sh);
>  
>  #include <stdio.h>
>  #include <unistd.h>
> -ssize_t bunzip(FILE *f, char **data);
> +ssize_t bunzip(struct semanage_handle *sh, FILE *f, char **data);
>  
>  #endif
> diff --git a/libsemanage/src/semanage_conf.h b/libsemanage/src/semanage_conf.h
> index 7ee139f..4118910 100644
> --- a/libsemanage/src/semanage_conf.h
> +++ b/libsemanage/src/semanage_conf.h
> @@ -40,6 +40,8 @@ typedef struct semanage_conf {
>  	int disable_genhomedircon;
>  	int handle_unknown;
>  	mode_t file_mode;
> +	int bzip_blocksize;
> +	int bzip_small;
>  	struct external_prog *load_policy;
>  	struct external_prog *setfiles;
>  	struct external_prog *mod_prog, *linked_prog, *kernel_prog;
> diff --git a/libsemanage/src/semanage_store.c b/libsemanage/src/semanage_store.c
> index 6d4c3ce..a3b0819 100644
> --- a/libsemanage/src/semanage_store.c
> +++ b/libsemanage/src/semanage_store.c
> @@ -1529,7 +1529,7 @@ static int semanage_load_module(semanage_handle_t * sh, const char *filename,
>  	ssize_t size;
>  	char *data = NULL;
>  
> -	if ((size = bunzip(fp, &data)) > 0) {
> +	if ((size = bunzip(sh, fp, &data)) > 0) {
>  		fclose(fp);
>  		fp = fmemopen(data, size, "rb");
>  		if (!fp) {
> 
I just want to make sure that if I change the size in semanage.conf, it will still handle all sizes of bzipped files.
So if we ship xguest.pp.bz2 format it will work.

--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

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

  Powered by Linux