Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b4c30aad authored by Al Viro's avatar Al Viro Committed by Linus Torvalds
Browse files

fix more leaks in audit_tree.c tag_chunk()



Several leaks in audit_tree didn't get caught by commit
318b6d3d, including the leak on normal
exit in case of multiple rules refering to the same chunk.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6f5d5114
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -373,15 +373,17 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
	for (n = 0; n < old->count; n++) {
		if (old->owners[n].owner == tree) {
			spin_unlock(&hash_lock);
			put_inotify_watch(watch);
			put_inotify_watch(&old->watch);
			return 0;
		}
	}
	spin_unlock(&hash_lock);

	chunk = alloc_chunk(old->count + 1);
	if (!chunk)
	if (!chunk) {
		put_inotify_watch(&old->watch);
		return -ENOMEM;
	}

	mutex_lock(&inode->inotify_mutex);
	if (inotify_clone_watch(&old->watch, &chunk->watch) < 0) {
@@ -425,7 +427,8 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
	spin_unlock(&hash_lock);
	inotify_evict_watch(&old->watch);
	mutex_unlock(&inode->inotify_mutex);
	put_inotify_watch(&old->watch);
	put_inotify_watch(&old->watch); /* pair to inotify_find_watch */
	put_inotify_watch(&old->watch); /* and kill it */
	return 0;
}