All of lore.kernel.org
 help / color / mirror / Atom feed
* [mcstransd] Fails after Reload Translations
@ 2014-07-17  6:02 wenzong fan
  2014-07-17 13:15 ` Joe Nall
  0 siblings, 1 reply; 3+ messages in thread
From: wenzong fan @ 2014-07-17  6:02 UTC (permalink / raw)
  To: selinux

[-- Attachment #1: Type: text/plain, Size: 2132 bytes --]

Hello,

Generally the mcstransd works well on mls enabled system, but if 
"restart daemon" triggered, it will fail to trans the mls levels.

* To reproduce the issue:
1) apply attached patch: force-to-reload-translations.patch
2) build mcstransd and replace the one: "/sbin/mcstransd"
3) start the daemon and check results:

   $ run_init /etc/init.d/mcstrans start
   $ id -Z
   staff_u:lspp_test_r:lspp_harness_t:s0-s15:c0.c1023

   $ ps aux|grep mcs
   root      3004  0.0  0.0  14884   668 ?        Ss   09:37   0:00 
mcstransd
   root      3116  0.0  0.0 103252   832 pts/1    S+   10:39   0:00 grep mcs

   $ grep mcs /var/log/messages
   Jul 17 09:37:05 localhost mcstransd: mcstransd starting
   Jul 17 09:37:05 localhost mcstransd: Failed to initialize color 
translations
   Jul 17 09:37:05 localhost mcstransd: No color information will be 
available
   Jul 17 09:37:05 localhost mcstransd: mcstransd initialized
   Jul 17 09:37:05 localhost mcstransd: Reload Translations
   Jul 17 09:37:05 localhost mcstransd: cache sizes: tr = 26, rt = 26
   Jul 17 09:37:05 localhost mcstransd: Failed to initialize color 
translations
   Jul 17 09:37:05 localhost mcstransd: No color information will be 
available

I tested this on CentOS 6.5 with mls policy enabled.

* Why does it fail?

Check process_trans() in mcstrans.c:

  723 process_trans(char *buffer) {
  724         static domain_t *domain;
  [snip] ...
  784         if (!domain) {
  785                 domain = create_domain("Default");
  786                 if (!domain)
  787                         return -1;
  788                 group = NULL;
  789         }

As I think, the static pointer "domain" will be initialized when the 
daemon is starting, it will work well if that's all; But if "restart 
daemon" triggered after that, the point "domain" will have an old value 
but not NULL, this will prevent the create_domain() from running. In 
this case, an empty "domains" causes the translation failed.

I have a workaround to get it works: workaround-for-mcstransd.patch, but 
it's a bit ugly, I hope someone could give a better fix for it:)

Thanks
Wenzong

[-- Attachment #2: force-to-reload-translations.patch --]
[-- Type: text/x-diff, Size: 435 bytes --]

diff --git a/policycoreutils/mcstrans/src/mcstransd.c b/policycoreutils/mcstrans/src/mcstransd.c
index a65076d..1dd905a 100644
--- a/policycoreutils/mcstrans/src/mcstransd.c
+++ b/policycoreutils/mcstrans/src/mcstransd.c
@@ -416,6 +416,7 @@ process_connections(void)
 	ufds[0].events = POLLIN|POLLPRI;
 	ufds[0].revents = 0;
 
+	restart_daemon = 1;
 	while (1) {
 		if (restart_daemon) {
 			syslog(LOG_NOTICE, "Reload Translations");

[-- Attachment #3: workaround-for-mcstransd.patch --]
[-- Type: text/x-diff, Size: 1946 bytes --]

diff --git a/policycoreutils/mcstrans/src/mcstrans.c b/policycoreutils/mcstrans/src/mcstrans.c
index 4d31857..00747a6 100644
--- a/policycoreutils/mcstrans/src/mcstrans.c
+++ b/policycoreutils/mcstrans/src/mcstrans.c
@@ -719,9 +719,9 @@ static int read_translations(const char *filename);
    Remove white space and set raw do data before the "=" and tok to data after it
    Modifies the data pointed to by the buffer parameter
  */
+static domain_t *localdomain;
 static int
 process_trans(char *buffer) {
-	static domain_t *domain;
 	static word_group_t *group;
 	static int base_classification;
 	static int lineno = 0;
@@ -776,14 +776,14 @@ process_trans(char *buffer) {
 	}
 
 	if (!strcmp(raw, "Domain")) {
-		domain = create_domain(tok);
+		localdomain = create_domain(tok);
 		group = NULL;
 		return 0;
 	}
 
-	if (!domain) {
-		domain = create_domain("Default");
-		if (!domain)
+	if (!localdomain) {
+		localdomain = create_domain("Default");
+		if (!localdomain)
 			return -1;
 		group = NULL;
 	}
@@ -814,7 +814,7 @@ process_trans(char *buffer) {
 	} else if (!strcmp(raw, "Base")) {
 		base_classification = 1;
 	} else if (!strcmp(raw, "ModifierGroup")) {
-		group = create_group(&domain->groups, tok);
+		group = create_group(&localdomain->groups, tok);
 		if (!group)
 			return -1;
 		base_classification = 0;
@@ -844,12 +844,12 @@ process_trans(char *buffer) {
 		}
 	} else {
 		if (base_classification) {
-			if (add_base_classification(domain, raw, tok) < 0) {
+			if (add_base_classification(localdomain, raw, tok) < 0) {
 				syslog(LOG_ERR, "unable to add base_classification on line %d", lineno);
 				return -1;
 			}
 		}
-		if (add_cache(domain, raw, tok) < 0)
+		if (add_cache(localdomain, raw, tok) < 0)
 			return -1;
 	}
 	return 0;
@@ -1758,5 +1758,6 @@ finish_context_translations(void) {
 		destroy_cat_constraint(&cat_constraints, cat_constraints);
 		cat_constraints = next;
 	}
+	localdomain = NULL;
 }
 

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [mcstransd] Fails after Reload Translations
  2014-07-17  6:02 [mcstransd] Fails after Reload Translations wenzong fan
@ 2014-07-17 13:15 ` Joe Nall
  2014-07-25  2:12   ` wenzong fan
  0 siblings, 1 reply; 3+ messages in thread
From: Joe Nall @ 2014-07-17 13:15 UTC (permalink / raw)
  To: wenzong fan; +Cc: selinux


On Jul 17, 2014, at 1:02 AM, wenzong fan <wenzong.fan@windriver.com> wrote:

> Hello,
> 
> Generally the mcstransd works well on mls enabled system, but if "restart daemon" triggered, it will fail to trans the mls levels.

domain does seems to be scoped improperly for a reload. I'll take a look and get back in a couple of days.

joe

> 
> * To reproduce the issue:
> 1) apply attached patch: force-to-reload-translations.patch
> 2) build mcstransd and replace the one: "/sbin/mcstransd"
> 3) start the daemon and check results:
> 
>  $ run_init /etc/init.d/mcstrans start
>  $ id -Z
>  staff_u:lspp_test_r:lspp_harness_t:s0-s15:c0.c1023
> 
>  $ ps aux|grep mcs
>  root      3004  0.0  0.0  14884   668 ?        Ss   09:37   0:00 mcstransd
>  root      3116  0.0  0.0 103252   832 pts/1    S+   10:39   0:00 grep mcs
> 
>  $ grep mcs /var/log/messages
>  Jul 17 09:37:05 localhost mcstransd: mcstransd starting
>  Jul 17 09:37:05 localhost mcstransd: Failed to initialize color translations
>  Jul 17 09:37:05 localhost mcstransd: No color information will be available
>  Jul 17 09:37:05 localhost mcstransd: mcstransd initialized
>  Jul 17 09:37:05 localhost mcstransd: Reload Translations
>  Jul 17 09:37:05 localhost mcstransd: cache sizes: tr = 26, rt = 26
>  Jul 17 09:37:05 localhost mcstransd: Failed to initialize color translations
>  Jul 17 09:37:05 localhost mcstransd: No color information will be available
> 
> I tested this on CentOS 6.5 with mls policy enabled.
> 
> * Why does it fail?
> 
> Check process_trans() in mcstrans.c:
> 
> 723 process_trans(char *buffer) {
> 724         static domain_t *domain;
> [snip] ...
> 784         if (!domain) {
> 785                 domain = create_domain("Default");
> 786                 if (!domain)
> 787                         return -1;
> 788                 group = NULL;
> 789         }
> 
> As I think, the static pointer "domain" will be initialized when the daemon is starting, it will work well if that's all; But if "restart daemon" triggered after that, the point "domain" will have an old value but not NULL, this will prevent the create_domain() from running. In this case, an empty "domains" causes the translation failed.
> 
> I have a workaround to get it works: workaround-for-mcstransd.patch, but it's a bit ugly, I hope someone could give a better fix for it:)
> 
> Thanks
> Wenzong
> <force-to-reload-translations.patch><workaround-for-mcstransd.patch>_______________________________________________
> Selinux mailing list
> Selinux@tycho.nsa.gov
> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov.
> To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [mcstransd] Fails after Reload Translations
  2014-07-17 13:15 ` Joe Nall
@ 2014-07-25  2:12   ` wenzong fan
  0 siblings, 0 replies; 3+ messages in thread
From: wenzong fan @ 2014-07-25  2:12 UTC (permalink / raw)
  To: Joe Nall; +Cc: selinux

On 07/17/2014 09:15 PM, Joe Nall wrote:
>
> On Jul 17, 2014, at 1:02 AM, wenzong fan <wenzong.fan@windriver.com> wrote:
>
>> Hello,
>>
>> Generally the mcstransd works well on mls enabled system, but if "restart daemon" triggered, it will fail to trans the mls levels.
>
> domain does seems to be scoped improperly for a reload. I'll take a look and get back in a couple of days.

Thanks for taking care of this but may I have your patches to replace my 
workaround?

Wenzong

>
> joe
>
>>
>> * To reproduce the issue:
>> 1) apply attached patch: force-to-reload-translations.patch
>> 2) build mcstransd and replace the one: "/sbin/mcstransd"
>> 3) start the daemon and check results:
>>
>>   $ run_init /etc/init.d/mcstrans start
>>   $ id -Z
>>   staff_u:lspp_test_r:lspp_harness_t:s0-s15:c0.c1023
>>
>>   $ ps aux|grep mcs
>>   root      3004  0.0  0.0  14884   668 ?        Ss   09:37   0:00 mcstransd
>>   root      3116  0.0  0.0 103252   832 pts/1    S+   10:39   0:00 grep mcs
>>
>>   $ grep mcs /var/log/messages
>>   Jul 17 09:37:05 localhost mcstransd: mcstransd starting
>>   Jul 17 09:37:05 localhost mcstransd: Failed to initialize color translations
>>   Jul 17 09:37:05 localhost mcstransd: No color information will be available
>>   Jul 17 09:37:05 localhost mcstransd: mcstransd initialized
>>   Jul 17 09:37:05 localhost mcstransd: Reload Translations
>>   Jul 17 09:37:05 localhost mcstransd: cache sizes: tr = 26, rt = 26
>>   Jul 17 09:37:05 localhost mcstransd: Failed to initialize color translations
>>   Jul 17 09:37:05 localhost mcstransd: No color information will be available
>>
>> I tested this on CentOS 6.5 with mls policy enabled.
>>
>> * Why does it fail?
>>
>> Check process_trans() in mcstrans.c:
>>
>> 723 process_trans(char *buffer) {
>> 724         static domain_t *domain;
>> [snip] ...
>> 784         if (!domain) {
>> 785                 domain = create_domain("Default");
>> 786                 if (!domain)
>> 787                         return -1;
>> 788                 group = NULL;
>> 789         }
>>
>> As I think, the static pointer "domain" will be initialized when the daemon is starting, it will work well if that's all; But if "restart daemon" triggered after that, the point "domain" will have an old value but not NULL, this will prevent the create_domain() from running. In this case, an empty "domains" causes the translation failed.
>>
>> I have a workaround to get it works: workaround-for-mcstransd.patch, but it's a bit ugly, I hope someone could give a better fix for it:)
>>
>> Thanks
>> Wenzong
>> <force-to-reload-translations.patch><workaround-for-mcstransd.patch>_______________________________________________
>> Selinux mailing list
>> Selinux@tycho.nsa.gov
>> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov.
>> To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov.
>
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-07-25  2:12 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-17  6:02 [mcstransd] Fails after Reload Translations wenzong fan
2014-07-17 13:15 ` Joe Nall
2014-07-25  2:12   ` wenzong fan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.