Re: [PATCH] libsemanage: Add file_contexts and seusers to the store

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

 



On 07/22/2015 09:29 AM, Stephen Smalley wrote:
> On 07/21/2015 03:08 PM, Yuli Khodorkovskiy wrote:
>> This patch writes file_contexts and seusers to the policy store as well as
>> /etc/selinux/. Additionally, file_contexts and seusers are now parsed from the
>> store rather than the final directory which was the old behavior. This allows
>> all policy related files to be kept in the policy store.
>>
>> Signed-off-by: Yuli Khodorkovskiy <ykhodorkovskiy@xxxxxxxxxx>
> 
> Thanks, applied.

One caveat with these changes:  they require a semodule -B when
upgrading.  Otherwise any read-only transaction, e.g. semodule login -l,
will yield no results.

> 
>> ---
>>  libsemanage/src/direct_api.c             | 69 +++++++++++++++++++++++++-------
>>  libsemanage/src/semanage_store.c         | 49 ++++-------------------
>>  libsemanage/src/semanage_store.h         |  5 ++-
>>  libsemanage/utils/semanage_migrate_store |  3 +-
>>  4 files changed, 66 insertions(+), 60 deletions(-)
>>
>> diff --git a/libsemanage/src/direct_api.c b/libsemanage/src/direct_api.c
>> index 3c6b168..b11f2ba 100644
>> --- a/libsemanage/src/direct_api.c
>> +++ b/libsemanage/src/direct_api.c
>> @@ -248,18 +248,14 @@ int semanage_direct_connect(semanage_handle_t * sh)
>>  		goto err;
>>  
>>  	if (fcontext_file_dbase_init(sh,
>> -				     semanage_final_path(SEMANAGE_FINAL_SELINUX,
>> -							 SEMANAGE_FC),
>> -				     semanage_final_path(SEMANAGE_FINAL_TMP,
>> -							 SEMANAGE_FC),
>> +				     semanage_path(SEMANAGE_ACTIVE, SEMANAGE_STORE_FC),
>> +				     semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_FC),
>>  				     semanage_fcontext_dbase_policy(sh)) < 0)
>>  		goto err;
>>  
>>  	if (seuser_file_dbase_init(sh,
>> -				   semanage_final_path(SEMANAGE_FINAL_SELINUX,
>> -						       SEMANAGE_SEUSERS),
>> -				   semanage_final_path(SEMANAGE_FINAL_TMP,
>> -						       SEMANAGE_SEUSERS),
>> +				   semanage_path(SEMANAGE_ACTIVE, SEMANAGE_STORE_SEUSERS),
>> +				   semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_SEUSERS),
>>  				   semanage_seuser_dbase_policy(sh)) < 0)
>>  		goto err;
>>  
>> @@ -602,7 +598,7 @@ static int semanage_direct_update_seuser(semanage_handle_t * sh, cil_db_t *cildb
>>  	}
>>  
>>  	if (size > 0) {
>> -		ofilename = semanage_final_path(SEMANAGE_FINAL_TMP, SEMANAGE_SEUSERS);
>> +		ofilename = semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_SEUSERS);
>>  		if (ofilename == NULL) {
>>  			return -1;
>>  		}
>> @@ -1039,7 +1035,8 @@ static int semanage_direct_commit(semanage_handle_t * sh)
>>  	size_t fc_buffer_len = 0;
>>  	const char *ofilename = NULL;
>>  	const char *path;
>> -	int retval = -1, num_modinfos = 0, i, missing_policy_kern = 0;
>> +	int retval = -1, num_modinfos = 0, i, missing_policy_kern = 0,
>> +		missing_seusers = 0, missing_fc = 0, missing = 0;
>>  	sepol_policydb_t *out = NULL;
>>  	struct cil_db *cildb = NULL;
>>  	semanage_module_info_t *modinfos = NULL;
>> @@ -1151,10 +1148,26 @@ static int semanage_direct_commit(semanage_handle_t * sh)
>>  		if (access(path, F_OK) != 0) {
>>  			missing_policy_kern = 1;
>>  		}
>> +
>> +		path = semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_FC);
>> +
>> +		if (access(path, F_OK) != 0) {
>> +			missing_fc = 1;
>> +		}
>> +
>> +		path = semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_SEUSERS);
>> +
>> +		if (access(path, F_OK) != 0) {
>> +			missing_seusers = 1;
>> +		}
>>  	}
>>  
>> +	missing |= missing_policy_kern;
>> +	missing |= missing_fc;
>> +	missing |= missing_seusers;
>> +
>>  	/* If there were policy changes, or explicitly requested, rebuild the policy */
>> -	if (sh->do_rebuild || modified || missing_policy_kern) {
>> +	if (sh->do_rebuild || modified || missing) {
>>  		/* =================== Module expansion =============== */
>>  
>>  		retval = semanage_get_active_modules(sh, &modinfos, &num_modinfos);
>> @@ -1312,15 +1325,41 @@ static int semanage_direct_commit(semanage_handle_t * sh)
>>  	if (retval < 0)
>>  		goto cleanup;
>>  
>> -	retval = semanage_copy_policydb(sh);
>> -	if (retval < 0)
>> +	retval = semanage_copy_file(semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_KERNEL),
>> +			semanage_final_path(SEMANAGE_FINAL_TMP, SEMANAGE_KERNEL),
>> +			sh->conf->file_mode);
>> +	if (retval < 0) {
>>  		goto cleanup;
>> +	}
>>  
>>  	path = semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_FC_LOCAL);
>>  	if (access(path, F_OK) == 0) {
>> -		retval = semanage_copy_fc_local(sh);
>> -		if (retval < 0)
>> +		retval = semanage_copy_file(semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_FC_LOCAL),
>> +							semanage_final_path(SEMANAGE_FINAL_TMP, SEMANAGE_FC_LOCAL),
>> +							sh->conf->file_mode);
>> +		if (retval < 0) {
>>  			goto cleanup;
>> +		}
>> +	}
>> +
>> +	path = semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_FC);
>> +	if (access(path, F_OK) == 0) {
>> +		retval = semanage_copy_file(semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_FC),
>> +							semanage_final_path(SEMANAGE_FINAL_TMP, SEMANAGE_FC),
>> +							sh->conf->file_mode);
>> +		if (retval < 0) {
>> +			goto cleanup;
>> +		}
>> +	}
>> +
>> +	path = semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_SEUSERS);
>> +	if (access(path, F_OK) == 0) {
>> +		retval = semanage_copy_file(semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_SEUSERS),
>> +							semanage_final_path(SEMANAGE_FINAL_TMP, SEMANAGE_SEUSERS),
>> +							sh->conf->file_mode);
>> +		if (retval < 0) {
>> +			goto cleanup;
>> +		}
>>  	}
>>  
>>  	/* run genhomedircon if its enabled, this should be the last operation
>> diff --git a/libsemanage/src/semanage_store.c b/libsemanage/src/semanage_store.c
>> index 2856aaf..fa0876f 100644
>> --- a/libsemanage/src/semanage_store.c
>> +++ b/libsemanage/src/semanage_store.c
>> @@ -111,7 +111,9 @@ static const char *semanage_sandbox_paths[SEMANAGE_STORE_NUM_PATHS] = {
>>  	"/preserve_tunables",
>>  	"/modules/disabled",
>>  	"/policy.kern",
>> -	"/file_contexts.local"
>> +	"/file_contexts.local",
>> +	"/file_contexts",
>> +	"/seusers"
>>  };
>>  
>>  static char const * const semanage_final_prefix[SEMANAGE_FINAL_NUM] = {
>> @@ -666,7 +668,7 @@ static int semanage_filename_select(const struct dirent *d)
>>  
>>  /* Copies a file from src to dst.  If dst already exists then
>>   * overwrite it.  Returns 0 on success, -1 on error. */
>> -static int semanage_copy_file(const char *src, const char *dst, mode_t mode)
>> +int semanage_copy_file(const char *src, const char *dst, mode_t mode)
>>  {
>>  	int in, out, retval = 0, amount_read, n, errsv = errno;
>>  	char tmp[PATH_MAX];
>> @@ -1425,11 +1427,11 @@ int semanage_split_fc(semanage_handle_t * sh)
>>  		goto cleanup;
>>  	}
>>  
>> -	fc = open(semanage_final_path(SEMANAGE_FINAL_TMP, SEMANAGE_FC),
>> +	fc = open(semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_FC),
>>  		  O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
>>  	if (fc < 0) {
>>  		ERR(sh, "Could not open %s for writing.",
>> -		    semanage_final_path(SEMANAGE_FINAL_TMP, SEMANAGE_FC));
>> +		    semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_FC));
>>  		goto cleanup;
>>  	}
>>  	hd = open(semanage_path(SEMANAGE_TMP, SEMANAGE_HOMEDIR_TMPL),
>> @@ -1454,8 +1456,7 @@ int semanage_split_fc(semanage_handle_t * sh)
>>  		} else {
>>  			if (write(fc, buf, strlen(buf)) < 0) {
>>  				ERR(sh, "Write to %s failed.",
>> -				    semanage_final_path(SEMANAGE_FINAL_TMP,
>> -							SEMANAGE_FC));
>> +				    semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_FC));
>>  				goto cleanup;
>>  			}
>>  		}
>> @@ -2914,39 +2915,3 @@ int semanage_nc_sort(semanage_handle_t * sh, const char *buf, size_t buf_len,
>>  
>>  	return 0;
>>  }
>> -
>> -int semanage_copy_policydb(semanage_handle_t *sh)
>> -{
>> -	const char *src = NULL;
>> -	const char *dst = NULL;
>> -	int rc = -1;
>> -
>> -	src = semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_KERNEL);
>> -	dst = semanage_final_path(SEMANAGE_FINAL_TMP, SEMANAGE_KERNEL);
>> -
>> -	rc = semanage_copy_file(src, dst, sh->conf->file_mode);
>> -	if (rc != 0) {
>> -		goto cleanup;
>> -	}
>> -
>> -cleanup:
>> -	return rc;
>> -}
>> -
>> -int semanage_copy_fc_local(semanage_handle_t *sh)
>> -{
>> -	const char *src = NULL;
>> -	const char *dst = NULL;
>> -	int rc = -1;
>> -
>> -	src = semanage_path(SEMANAGE_TMP, SEMANAGE_STORE_FC_LOCAL);
>> -	dst = semanage_final_path(SEMANAGE_FINAL_TMP, SEMANAGE_FC_LOCAL);
>> -
>> -	rc = semanage_copy_file(src, dst, sh->conf->file_mode);
>> -	if (rc != 0) {
>> -		goto cleanup;
>> -	}
>> -
>> -cleanup:
>> -	return rc;
>> -}
>> diff --git a/libsemanage/src/semanage_store.h b/libsemanage/src/semanage_store.h
>> index ade43f2..acb6e3f 100644
>> --- a/libsemanage/src/semanage_store.h
>> +++ b/libsemanage/src/semanage_store.h
>> @@ -57,6 +57,8 @@ enum semanage_sandbox_defs {
>>  	SEMANAGE_MODULES_DISABLED,
>>  	SEMANAGE_STORE_KERNEL,
>>  	SEMANAGE_STORE_FC_LOCAL,
>> +	SEMANAGE_STORE_FC,
>> +	SEMANAGE_STORE_SEUSERS,
>>  	SEMANAGE_STORE_NUM_PATHS
>>  };
>>  
>> @@ -150,7 +152,6 @@ int semanage_nc_sort(semanage_handle_t * sh,
>>  		     size_t buf_len,
>>  		     char **sorted_buf, size_t * sorted_buf_len);
>>  
>> -int semanage_copy_policydb(semanage_handle_t *sh);
>> -int semanage_copy_fc_local(semanage_handle_t *sh);
>> +int semanage_copy_file(const char *src, const char *dst, mode_t mode);
>>  
>>  #endif
>> diff --git a/libsemanage/utils/semanage_migrate_store b/libsemanage/utils/semanage_migrate_store
>> index b170eda..6443002 100755
>> --- a/libsemanage/utils/semanage_migrate_store
>> +++ b/libsemanage/utils/semanage_migrate_store
>> @@ -244,7 +244,8 @@ if __name__ == "__main__":
>>  		"users_extra.local",
>>  		"disable_dontaudit",
>>  		"preserve_tunables",
>> -		"policy.kern" ]
>> +		"policy.kern",
>> +		"file_contexts"]
>>  
>>  
>>  	create_dir(newroot_path(), 0o755)
>>
> 
> _______________________________________________
> 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.
> 

_______________________________________________
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