Commit 1429b3ec authored by Al Viro's avatar Al Viro

Untangling ima mess, part 3: kill dead code in ima

Kill the 'update' argument of ima_path_check(), kill
dead code in ima.

Current rules: ima counters are bumped at the same time
when the file switches from put_filp() fodder to fput()
one.  Which happens exactly in two places - alloc_file()
and __dentry_open().  Nothing else needs to do that at
all.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent b65a9cfc
...@@ -1686,7 +1686,7 @@ struct file *do_filp_open(int dfd, const char *pathname, ...@@ -1686,7 +1686,7 @@ struct file *do_filp_open(int dfd, const char *pathname,
path_put(&nd.root); path_put(&nd.root);
if (!IS_ERR(filp)) { if (!IS_ERR(filp)) {
error = ima_path_check(&filp->f_path, filp->f_mode & error = ima_path_check(&filp->f_path, filp->f_mode &
(MAY_READ | MAY_WRITE | MAY_EXEC), 0); (MAY_READ | MAY_WRITE | MAY_EXEC));
if (error) { if (error) {
fput(filp); fput(filp);
filp = ERR_PTR(error); filp = ERR_PTR(error);
...@@ -1747,7 +1747,7 @@ struct file *do_filp_open(int dfd, const char *pathname, ...@@ -1747,7 +1747,7 @@ struct file *do_filp_open(int dfd, const char *pathname,
filp = nameidata_to_filp(&nd, open_flag); filp = nameidata_to_filp(&nd, open_flag);
if (!IS_ERR(filp)) { if (!IS_ERR(filp)) {
error = ima_path_check(&filp->f_path, filp->f_mode & error = ima_path_check(&filp->f_path, filp->f_mode &
(MAY_READ | MAY_WRITE | MAY_EXEC), 0); (MAY_READ | MAY_WRITE | MAY_EXEC));
if (error) { if (error) {
fput(filp); fput(filp);
filp = ERR_PTR(error); filp = ERR_PTR(error);
......
...@@ -2122,8 +2122,7 @@ nfsd_permission(struct svc_rqst *rqstp, struct svc_export *exp, ...@@ -2122,8 +2122,7 @@ nfsd_permission(struct svc_rqst *rqstp, struct svc_export *exp,
*/ */
path.mnt = exp->ex_path.mnt; path.mnt = exp->ex_path.mnt;
path.dentry = dentry; path.dentry = dentry;
err = ima_path_check(&path, acc & (MAY_READ | MAY_WRITE | MAY_EXEC), err = ima_path_check(&path, acc & (MAY_READ | MAY_WRITE | MAY_EXEC));
IMA_COUNT_LEAVE);
nfsd_out: nfsd_out:
return err? nfserrno(err) : 0; return err? nfserrno(err) : 0;
} }
......
...@@ -13,18 +13,14 @@ ...@@ -13,18 +13,14 @@
#include <linux/fs.h> #include <linux/fs.h>
struct linux_binprm; struct linux_binprm;
#define IMA_COUNT_UPDATE 1
#define IMA_COUNT_LEAVE 0
#ifdef CONFIG_IMA #ifdef CONFIG_IMA
extern int ima_bprm_check(struct linux_binprm *bprm); extern int ima_bprm_check(struct linux_binprm *bprm);
extern int ima_inode_alloc(struct inode *inode); extern int ima_inode_alloc(struct inode *inode);
extern void ima_inode_free(struct inode *inode); extern void ima_inode_free(struct inode *inode);
extern int ima_path_check(struct path *path, int mask, int update_counts); extern int ima_path_check(struct path *path, int mask);
extern void ima_file_free(struct file *file); extern void ima_file_free(struct file *file);
extern int ima_file_mmap(struct file *file, unsigned long prot); extern int ima_file_mmap(struct file *file, unsigned long prot);
extern void ima_counts_get(struct file *file); extern void ima_counts_get(struct file *file);
extern void ima_counts_put(struct path *path, int mask);
#else #else
static inline int ima_bprm_check(struct linux_binprm *bprm) static inline int ima_bprm_check(struct linux_binprm *bprm)
...@@ -42,7 +38,7 @@ static inline void ima_inode_free(struct inode *inode) ...@@ -42,7 +38,7 @@ static inline void ima_inode_free(struct inode *inode)
return; return;
} }
static inline int ima_path_check(struct path *path, int mask, int update_counts) static inline int ima_path_check(struct path *path, int mask)
{ {
return 0; return 0;
} }
...@@ -62,9 +58,5 @@ static inline void ima_counts_get(struct file *file) ...@@ -62,9 +58,5 @@ static inline void ima_counts_get(struct file *file)
return; return;
} }
static inline void ima_counts_put(struct path *path, int mask)
{
return;
}
#endif /* CONFIG_IMA_H */ #endif /* CONFIG_IMA_H */
#endif /* _LINUX_IMA_H */ #endif /* _LINUX_IMA_H */
...@@ -49,20 +49,13 @@ static void ima_inc_counts(struct ima_iint_cache *iint, fmode_t mode) ...@@ -49,20 +49,13 @@ static void ima_inc_counts(struct ima_iint_cache *iint, fmode_t mode)
iint->writecount++; iint->writecount++;
} }
/*
* Update the counts given open flags instead of fmode
*/
static void ima_inc_counts_flags(struct ima_iint_cache *iint, int flags)
{
ima_inc_counts(iint, (__force fmode_t)((flags+1) & O_ACCMODE));
}
/* /*
* Decrement ima counts * Decrement ima counts
*/ */
static void ima_dec_counts(struct ima_iint_cache *iint, struct inode *inode, static void ima_dec_counts(struct ima_iint_cache *iint, struct inode *inode,
fmode_t mode) struct file *file)
{ {
mode_t mode = file->f_mode;
BUG_ON(!mutex_is_locked(&iint->mutex)); BUG_ON(!mutex_is_locked(&iint->mutex));
iint->opencount--; iint->opencount--;
...@@ -92,12 +85,6 @@ static void ima_dec_counts(struct ima_iint_cache *iint, struct inode *inode, ...@@ -92,12 +85,6 @@ static void ima_dec_counts(struct ima_iint_cache *iint, struct inode *inode,
} }
} }
static void ima_dec_counts_flags(struct ima_iint_cache *iint,
struct inode *inode, int flags)
{
ima_dec_counts(iint, inode, (__force fmode_t)((flags+1) & O_ACCMODE));
}
/** /**
* ima_file_free - called on __fput() * ima_file_free - called on __fput()
* @file: pointer to file structure being freed * @file: pointer to file structure being freed
...@@ -117,7 +104,7 @@ void ima_file_free(struct file *file) ...@@ -117,7 +104,7 @@ void ima_file_free(struct file *file)
return; return;
mutex_lock(&iint->mutex); mutex_lock(&iint->mutex);
ima_dec_counts(iint, inode, file->f_mode); ima_dec_counts(iint, inode, file);
mutex_unlock(&iint->mutex); mutex_unlock(&iint->mutex);
kref_put(&iint->refcount, iint_free); kref_put(&iint->refcount, iint_free);
} }
...@@ -183,7 +170,7 @@ static int get_path_measurement(struct ima_iint_cache *iint, struct file *file, ...@@ -183,7 +170,7 @@ static int get_path_measurement(struct ima_iint_cache *iint, struct file *file,
* Always return 0 and audit dentry_open failures. * Always return 0 and audit dentry_open failures.
* (Return code will be based upon measurement appraisal.) * (Return code will be based upon measurement appraisal.)
*/ */
int ima_path_check(struct path *path, int mask, int update_counts) int ima_path_check(struct path *path, int mask)
{ {
struct inode *inode = path->dentry->d_inode; struct inode *inode = path->dentry->d_inode;
struct ima_iint_cache *iint; struct ima_iint_cache *iint;
...@@ -197,8 +184,6 @@ int ima_path_check(struct path *path, int mask, int update_counts) ...@@ -197,8 +184,6 @@ int ima_path_check(struct path *path, int mask, int update_counts)
return 0; return 0;
mutex_lock(&iint->mutex); mutex_lock(&iint->mutex);
if (update_counts)
ima_inc_counts_flags(iint, mask);
rc = ima_must_measure(iint, inode, MAY_READ, PATH_CHECK); rc = ima_must_measure(iint, inode, MAY_READ, PATH_CHECK);
if (rc < 0) if (rc < 0)
...@@ -268,35 +253,6 @@ static int process_measurement(struct file *file, const unsigned char *filename, ...@@ -268,35 +253,6 @@ static int process_measurement(struct file *file, const unsigned char *filename,
return rc; return rc;
} }
/*
* ima_counts_put - decrement file counts
*
* File counts are incremented in ima_path_check. On file open
* error, such as ETXTBSY, decrement the counts to prevent
* unnecessary imbalance messages.
*/
void ima_counts_put(struct path *path, int mask)
{
struct inode *inode = path->dentry->d_inode;
struct ima_iint_cache *iint;
/* The inode may already have been freed, freeing the iint
* with it. Verify the inode is not NULL before dereferencing
* it.
*/
if (!ima_initialized || !inode || !S_ISREG(inode->i_mode))
return;
iint = ima_iint_find_get(inode);
if (!iint)
return;
mutex_lock(&iint->mutex);
ima_dec_counts_flags(iint, inode, mask);
mutex_unlock(&iint->mutex);
kref_put(&iint->refcount, iint_free);
}
/* /*
* ima_counts_get - increment file counts * ima_counts_get - increment file counts
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment