public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Kylene Jo Hall <kjhall@us.ibm.com>
To: Dave Hansen <haveblue@us.ibm.com>
Cc: linux-kernel <linux-kernel@vger.kernel.org>,
	LSM ML <linux-security-module@vger.kernel.org>,
	Dave Safford <safford@us.ibm.com>, Mimi Zohar <zohar@us.ibm.com>,
	Serge Hallyn <sergeh@us.ibm.com>
Subject: Re: [RFC][PATCH 3/6] SLIM main patch
Date: Fri, 14 Jul 2006 12:25:57 -0700	[thread overview]
Message-ID: <1152905158.23584.35.camel@localhost.localdomain> (raw)
In-Reply-To: <1152901664.314.35.camel@localhost.localdomain>

Comments inline below.

On Fri, 2006-07-14 at 11:27 -0700, Dave Hansen wrote:
> On Fri, 2006-07-14 at 10:24 -0700, Kylene Jo Hall wrote:
> > +static int is_guard_integrity(struct slm_file_xattr *level)
> > +{
> > +	if ((level->guard.iac_r != SLM_IAC_NOTDEFINED)
> > +	    && (level->guard.iac_wx != SLM_IAC_NOTDEFINED))
> > +		return 1;
> > +	return 0;
> > +}
> > +
> > +static int is_guard_secrecy(struct slm_file_xattr *level)
> > +{
> > +	if ((level->guard.sac_rx != SLM_SAC_NOTDEFINED)
> > +	    && (level->guard.sac_w != SLM_SAC_NOTDEFINED))
> > +		return 1;
> > +	return 0;
> > +}
> 
> This is a nice helper function.  I think there are a couple of other
> places where nice helpers like this could really clean things up.
> 
I'll try to clean this up better in the next version.

> > +
> > +#define do_demote_thread_list(head, member) { \
> > +	struct task_struct *thread_tsk; \
> > +	list_for_each_entry(thread_tsk, head, member) \
> > +		do_demote_thread_entry(thread_tsk); \
> > +}
> 
> Can this be an inline function instead?
> 
I wanted to make it a static inline but how would I pass the member
field name that list_for_each_entry needs.  I presume this is why the
list_for_each_* functions are #defines themselves.

> > +static void demote_threads(void)
> > +{
> > +	do_demote_thread_list(&current->sibling, sibling);
> > +	do_demote_thread_list(&current->children, children);
> > +}
> > +
> > +/*
> > + * Revoke write permissions and demote threads using shared memory
> > + */
> > +static void revoke_permissions(struct slm_file_xattr *cur_level)
> > +{
> > +	if ((!is_kernel_thread(current)) && (current->pid != 1)) {
> > +		if (using_shmem())
> > +			demote_threads();
> > +
> > +		revoke_mmap_wperm(cur_level);
> > +		revoke_file_wperm(cur_level);
> > +	}
> > +}
> 
> Is that using_shmem() check really necessary?  IF you're not a threaded
> process and you get asked to demote your threads, I would imagine that
> the code would fall out of the loop immediately.  What does this protect
> against?

I'll test it out.
> 
> > +static enum slm_iac_level set_iac(char *token)
> > +{
> > +	int iac;
> > +
> > +	if (memcmp(token, EXEMPT_STR, strlen(EXEMPT_STR)) == 0)
> > +		return SLM_IAC_EXEMPT;
> > +	else {
> 
> Might as well add brackets here.  Or, just kill the else{} block and
> pull the code back to the lower indenting level.  The else is really
> unnecessary because of the return;

I'll fix next revision.
> 
> > +		for (iac = 0; iac < sizeof(slm_iac_str) / sizeof(char *); iac++) {
> > +			if (memcmp(token, slm_iac_str[iac],
> > +				   strlen(slm_iac_str[iac])) == 0)
> > +				return iac;
> 
> Why not use strcmp?
> 
> > +static enum slm_sac_level set_sac(char *token)
> > +{
> > +	int sac;
> > +
> > +	if (memcmp(token, EXEMPT_STR, strlen(EXEMPT_STR)) == 0)
> > +		return SLM_SAC_EXEMPT;
> > +	else {
> > +		for (sac = 0; sac < sizeof(slm_sac_str) / sizeof(char *); sac++) {
> > +			if (memcmp(token, slm_sac_str[sac],
> > +				   strlen(slm_sac_str[sac])) == 0)
> > +				return sac;
> > +		}
> > +	}
> > +	return SLM_SAC_ERROR;
> > +}
> 
> This function looks awfully similar :).  Can you just pass that array in
> as an argument, and get rid of one of the functions?

Sure that shouldn't be a problem.

> 
> > +static inline int set_bounds(char *token)
> > +{
> > +	if (memcmp(token, UNLIMITED_STR, strlen(UNLIMITED_STR)) == 0)
> > +		return 1;
> > +	return 0;
> > +}
> 
> strcmp?
> 
> > +/* 
> > + * Get the 7 access class levels from the extended attribute 
> > + * Format: TIMESTAMP INTEGRITY SECRECY [INTEGRITY_GUARD INTEGRITY_GUARD] [SECRECY_GUARD SECRECY_GUARD] [GUARD_ TYPE]
> > + */
> > +static int slm_parse_xattr(char *xattr_value, int xattr_len,
> > +			   struct slm_file_xattr *level)
> > +{
> > +	char *token;
> > +	int token_len;
> > +	char *buf, *buf_end;
> > +	int fieldno = 0;
> > +	int rc = -1;
> > +
> > +	buf = xattr_value + sizeof(time_t);
> > +	if (*buf == 0x20)
> > +		buf++;		/* skip blank after timestamp */
> > +	buf_end = xattr_value + xattr_len;
> > +
> > +	while ((token = get_token(buf, buf_end, ' ', &token_len)) != NULL) {
> > +		buf = token + token_len;
> > +		switch (++fieldno) {
> > +		case 1:
> > +			if ((level->iac_level =
> > +			     set_iac(token)) != SLM_IAC_ERROR)
> > +				rc = 0;
> > +			break;
> 
> How about:
> 
> 			level->iac_level = set_iac(token);
> 			if (level->iac_level != SLM_IAC_ERROR)
> 				rc = 0;
> 			break;

ok

> > +	isec->lock = SPIN_LOCK_UNLOCKED;
> > +	return isec;
> > +}
> 
> Is that safe, or is will the spin_lock_init() version make the lock
> debugging code happier?

Ok.

> > +/*
> > + * Exempt objects without extended attribute support 
> > + */
> > +static int is_exempt(struct inode *inode)
> > +{
> > +	if ((inode->i_sb->s_magic == PROC_SUPER_MAGIC)
> > +	    || S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
> > +		return 1;
> > +	return 0;
> > +}
> 
> This could probably be a much more generic function, no?  
> 
> inode_supports_xaddr()?  Seems like something that should check a
> superblock flag or something.

I don't know of any such flags.

Thanks,
Kylie


  reply	other threads:[~2006-07-14 19:25 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-07-14 17:24 [RFC][PATCH 3/6] SLIM main patch Kylene Jo Hall
2006-07-14 17:44 ` Dave Hansen
2006-07-14 18:06   ` Kylene Jo Hall
2006-07-14 18:28     ` Dave Hansen
2006-07-14 18:27 ` Dave Hansen
2006-07-14 19:25   ` Kylene Jo Hall [this message]
2006-07-14 19:34     ` Dave Hansen
2006-07-14 20:51       ` David Safford
2006-07-14 19:52   ` Serge E. Hallyn
2006-07-14 20:01   ` Kylene Jo Hall
2006-07-14 20:06     ` Dave Hansen
2006-07-15 16:54 ` Pavel Machek
  -- strict thread matches above, loose matches on Subject: below --
2006-07-24 17:51 Kylene Jo Hall
2006-07-28  6:01 ` Pavel Machek
2006-07-28 19:05   ` Kylene Jo Hall
2006-07-24 17:51 Kylene Jo Hall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1152905158.23584.35.camel@localhost.localdomain \
    --to=kjhall@us.ibm.com \
    --cc=haveblue@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=safford@us.ibm.com \
    --cc=sergeh@us.ibm.com \
    --cc=zohar@us.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox