Skip to content

Commit

Permalink
AppArmor: Drop hack to remove appended " (deleted)" string
Browse files Browse the repository at this point in the history
The 2.6.36 kernel has refactored __d_path() so that it no longer appends
" (deleted)" to unlinked paths.  So drop the hack that was used to detect
and remove the appended string.

Signed-off-by: John Johansen <john.johansen@canonical.com>
Signed-off-by: James Morris <jmorris@namei.org>
  • Loading branch information
John Johansen authored and James Morris committed Sep 7, 2010
1 parent 98e52c3 commit e819ff5
Showing 1 changed file with 11 additions and 27 deletions.
38 changes: 11 additions & 27 deletions security/apparmor/path.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,7 @@ static int d_namespace_path(struct path *path, char *buf, int buflen,
{
struct path root, tmp;
char *res;
int deleted, connected;
int error = 0;
int connected, error = 0;

/* Get the root we want to resolve too, released below */
if (flags & PATH_CHROOT_REL) {
Expand All @@ -74,19 +73,8 @@ static int d_namespace_path(struct path *path, char *buf, int buflen,
}

spin_lock(&dcache_lock);
/* There is a race window between path lookup here and the
* need to strip the " (deleted) string that __d_path applies
* Detect the race and relookup the path
*
* The stripping of (deleted) is a hack that could be removed
* with an updated __d_path
*/
do {
tmp = root;
deleted = d_unlinked(path->dentry);
res = __d_path(path, &tmp, buf, buflen);

} while (deleted != d_unlinked(path->dentry));
tmp = root;
res = __d_path(path, &tmp, buf, buflen);
spin_unlock(&dcache_lock);

*name = res;
Expand All @@ -98,21 +86,17 @@ static int d_namespace_path(struct path *path, char *buf, int buflen,
*name = buf;
goto out;
}
if (deleted) {
/* On some filesystems, newly allocated dentries appear to the
* security_path hooks as a deleted dentry except without an
* inode allocated.
*
* Remove the appended deleted text and return as string for
* normal mediation, or auditing. The (deleted) string is
* guaranteed to be added in this case, so just strip it.
*/
buf[buflen - 11] = 0; /* - (len(" (deleted)") +\0) */

if (path->dentry->d_inode && !(flags & PATH_MEDIATE_DELETED)) {
/* Handle two cases:
* 1. A deleted dentry && profile is not allowing mediation of deleted
* 2. On some filesystems, newly allocated dentries appear to the
* security_path hooks as a deleted dentry except without an inode
* allocated.
*/
if (d_unlinked(path->dentry) && path->dentry->d_inode &&
!(flags & PATH_MEDIATE_DELETED)) {
error = -ENOENT;
goto out;
}
}

/* Determine if the path is connected to the expected root */
Expand Down

0 comments on commit e819ff5

Please sign in to comment.