2011/4/20 Eric Paris <eparis@xxxxxxxxxx>: > On Sat, 2011-04-16 at 16:09 +0200, Kohei KaiGai wrote: >> This patch allows to accept percent-encoded object name as the forth >> argument of /selinux/create interface to avoid possible bugs when we >> supply an object name that includes whitespace or multibytes. >> >> Although I could not test this patch on named TYPE_TRANSITION rules, >> but printk() messages for debugging seems to me the logic works correctly. >> I assume the libselinux provide the logic to encode object name, so it shall >> be applied transparently for the viewpoint of application. > > > "You assume" libselinux provides this. Does it? Or are you going to > send a patch to support it? I honestly don't know.... > Yes. I'll update my libselinux patch to support this feature. > Thanks! > -Eric > >> >> Signed-off-by: KaiGai Kohei <kohei.kaigai@xxxxxxxxxx> >> --- >> security/selinux/selinuxfs.c | 38 +++++++++++++++++++++++++++++++++++++- >> 1 files changed, 37 insertions(+), 1 deletions(-) >> >> diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c >> index 973f5a4..4fde279 100644 >> --- a/security/selinux/selinuxfs.c >> +++ b/security/selinux/selinuxfs.c >> @@ -28,6 +28,7 @@ >> #include <linux/percpu.h> >> #include <linux/audit.h> >> #include <linux/uaccess.h> >> +#include <linux/ctype.h> >> >> /* selinuxfs pseudo filesystem for exporting the security policy API. >> Based on the proc code and the fs/nfsd/nfsctl.c code. */ >> @@ -750,6 +751,15 @@ out: >> return length; >> } >> >> +static inline int hexcode_to_int(int code) >> +{ >> + if (code == '\0' || !isxdigit(code)) >> + return -1; >> + if (isdigit(code)) >> + return code - '0'; >> + return tolower(code) - 'a' + 10; >> +} >> + >> static ssize_t sel_write_create(struct file *file, char *buf, size_t size) >> { >> char *scon = NULL, *tcon = NULL; >> @@ -784,8 +794,34 @@ static ssize_t sel_write_create(struct file >> *file, char *buf, size_t size) >> nargs = sscanf(buf, "%s %s %hu %s", scon, tcon, &tclass, namebuf); >> if (nargs < 3 || nargs > 4) >> goto out; >> - if (nargs == 4) >> + if (nargs == 4) { >> + /* >> + * If and when the name of new object to be queried contains >> + * either whitespace or multibyte characters, they shall be >> + * encoded based on the percentage-encoding rule. >> + * If not encoded, the sscanf logic picks up only left-half >> + * of the supplied name; splitted by a whitespace unexpectedly. >> + */ >> + char *r, *w; >> + int c1, c2; >> + >> + r = w = namebuf; >> + do { >> + c1 = *r++; >> + if (c1 == '+') >> + c1 = ' '; >> + else if (c1 == '%') { >> + if ((c1 = hexcode_to_int(*r++)) < 0) >> + goto out; >> + if ((c2 = hexcode_to_int(*r++)) < 0) >> + goto out; >> + c1 = (c1 << 4) | c2; >> + } >> + *w++ = c1; >> + } while (c1 != '\0'); >> + >> objname = namebuf; >> + } >> >> length = security_context_to_sid(scon, strlen(scon) + 1, &ssid); >> if (length) > > > -- KaiGai Kohei <kaigai@xxxxxxxxxxxx> -- 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.