All of lore.kernel.org
 help / color / mirror / Atom feed
* PATCH: libselinux matchpathcon() eliminate %as scanf format
@ 2007-01-25 23:59 Todd C. Miller
  2007-02-01 21:25 ` Karl MacMillan
  0 siblings, 1 reply; 2+ messages in thread
From: Todd C. Miller @ 2007-01-25 23:59 UTC (permalink / raw)
  To: SE Linux

This is a patch I sent in last year but forgot to split up as
requested; it still applies to the recently-released selinux-1.34.0.

THe patch replaces usage of the non-standard %as scanf() format
(which conflicts with C99) with strtok_r().  This does mean that
line_buf is modified but this variable is only used as an argument
to process_line() and is freed thereafter.

I made this change as part of the port of libselinux to SEBSD and
SEDarwin.

 - todd

--- matchpathcon.c	2007-01-25 14:19:39.000000000 -0500
+++ matchpathcon.c	2007-01-25 14:21:32.000000000 -0500
@@ -444,7 +444,7 @@
 			int pass, unsigned lineno)
 {
 	int items, len, regerr, ret;
-	char *buf_p;
+	char *buf_p, *ptr;
 	char *regex, *type, *context;
 	const char *reg_buf;
 	char *anchored_regex;
@@ -459,7 +459,11 @@
 	/* Skip comment lines and empty lines. */
 	if (*buf_p == '#' || *buf_p == 0)
 		return 0;
-	items = sscanf(line_buf, "%as %as %as", &regex, &type, &context);
+
+	regex = strtok_r(buf_p, " \t", &ptr);
+	type = strtok_r(NULL, " \t", &ptr);
+	context = strtok_r(NULL, " \t", &ptr);
+	items = !!regex + !!type + !!context;
 	if (items < 2) {
 		myprintf("%s:  line %d is missing fields, skipping\n", path,
 			 lineno);
@@ -470,6 +474,15 @@
 		type = NULL;
 	}
 
+	regex = strdup(regex);
+	if (type != NULL)
+		type = strdup(type);
+	context = strdup(context);
+	if (!!regex + !!type + !!context != items) {
+		ret = -1;
+		goto finish;
+	}
+
 	reg_buf = regex;
 	len = get_stem_from_spec(reg_buf);
 	if (len && prefix && strncmp(prefix, regex, len)) {

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

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

* Re: PATCH: libselinux matchpathcon() eliminate %as scanf format
  2007-01-25 23:59 PATCH: libselinux matchpathcon() eliminate %as scanf format Todd C. Miller
@ 2007-02-01 21:25 ` Karl MacMillan
  0 siblings, 0 replies; 2+ messages in thread
From: Karl MacMillan @ 2007-02-01 21:25 UTC (permalink / raw)
  To: Todd C. Miller; +Cc: SE Linux

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

Todd C. Miller wrote:
> This is a patch I sent in last year but forgot to split up as
> requested; it still applies to the recently-released selinux-1.34.0.
> 
> THe patch replaces usage of the non-standard %as scanf() format
> (which conflicts with C99) with strtok_r().  This does mean that
> line_buf is modified but this variable is only used as an argument
> to process_line() and is freed thereafter.
> 
> I made this change as part of the port of libselinux to SEBSD and
> SEDarwin.
> 
>  - todd

Acked-by: Karl MacMillan <kmacmillan@mentalrootkit.com>

I made a few updates for style (the !! thing was too clever for me) and 
merged into trunk and stable. Actual merged version is attached.

> --- matchpathcon.c	2007-01-25 14:19:39.000000000 -0500
> +++ matchpathcon.c	2007-01-25 14:21:32.000000000 -0500
> @@ -444,7 +444,7 @@
>  			int pass, unsigned lineno)
>  {
>  	int items, len, regerr, ret;
> -	char *buf_p;
> +	char *buf_p, *ptr;
>  	char *regex, *type, *context;
>  	const char *reg_buf;
>  	char *anchored_regex;
> @@ -459,7 +459,11 @@
>  	/* Skip comment lines and empty lines. */
>  	if (*buf_p == '#' || *buf_p == 0)
>  		return 0;
> -	items = sscanf(line_buf, "%as %as %as", &regex, &type, &context);
> +
> +	regex = strtok_r(buf_p, " \t", &ptr);
> +	type = strtok_r(NULL, " \t", &ptr);
> +	context = strtok_r(NULL, " \t", &ptr);
> +	items = !!regex + !!type + !!context;
>  	if (items < 2) {
>  		myprintf("%s:  line %d is missing fields, skipping\n", path,
>  			 lineno);
> @@ -470,6 +474,15 @@
>  		type = NULL;
>  	}
>  
> +	regex = strdup(regex);
> +	if (type != NULL)
> +		type = strdup(type);
> +	context = strdup(context);
> +	if (!!regex + !!type + !!context != items) {
> +		ret = -1;
> +		goto finish;
> +	}
> +
>  	reg_buf = regex;
>  	len = get_stem_from_spec(reg_buf);
>  	if (len && prefix && strncmp(prefix, regex, len)) {
> 
> --
> This message was distributed to subscribers of the selinux mailing list.
> If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
> the words "unsubscribe selinux" without quotes as the message.


[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 1293 bytes --]

Index: libselinux/src/matchpathcon.c
===================================================================
--- libselinux/src/matchpathcon.c	(revision 2209)
+++ libselinux/src/matchpathcon.c	(working copy)
@@ -444,7 +444,7 @@
 			int pass, unsigned lineno)
 {
 	int items, len, regerr, ret;
-	char *buf_p;
+	char *buf_p, *ptr;
 	char *regex, *type, *context;
 	const char *reg_buf;
 	char *anchored_regex;
@@ -459,7 +459,18 @@
 	/* Skip comment lines and empty lines. */
 	if (*buf_p == '#' || *buf_p == 0)
 		return 0;
-	items = sscanf(line_buf, "%as %as %as", &regex, &type, &context);
+
+	items = 0;
+	regex = strtok_r(buf_p, " \t", &ptr);
+	if (regex)
+		items += 1;
+	type = strtok_r(NULL, " \t", &ptr);
+	if (type)
+		items += 1;
+	context = strtok_r(NULL, " \t", &ptr);
+	if (context)
+		items += 1;
+	
 	if (items < 2) {
 		myprintf("%s:  line %d is missing fields, skipping\n", path,
 			 lineno);
@@ -470,6 +481,23 @@
 		type = NULL;
 	}
 
+	regex = strdup(regex);
+	if (!regex) {
+		return -1;
+	}
+	if (type) {
+		type = strdup(type);
+		if (!type) {
+			ret = -1;
+			goto finish;
+		}
+	}
+	context = strdup(context);
+	if (!context) {
+		ret = -1;
+		goto finish;
+	}
+
 	reg_buf = regex;
 	len = get_stem_from_spec(reg_buf);
 	if (len && prefix && strncmp(prefix, regex, len)) {

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

end of thread, other threads:[~2007-02-01 21:24 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-01-25 23:59 PATCH: libselinux matchpathcon() eliminate %as scanf format Todd C. Miller
2007-02-01 21:25 ` Karl MacMillan

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.