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

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
...@@ -373,15 +373,17 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree) ...@@ -373,15 +373,17 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
for (n = 0; n < old->count; n++) { for (n = 0; n < old->count; n++) {
if (old->owners[n].owner == tree) { if (old->owners[n].owner == tree) {
spin_unlock(&hash_lock); spin_unlock(&hash_lock);
put_inotify_watch(watch); put_inotify_watch(&old->watch);
return 0; return 0;
} }
} }
spin_unlock(&hash_lock); spin_unlock(&hash_lock);
chunk = alloc_chunk(old->count + 1); chunk = alloc_chunk(old->count + 1);
if (!chunk) if (!chunk) {
put_inotify_watch(&old->watch);
return -ENOMEM; return -ENOMEM;
}
mutex_lock(&inode->inotify_mutex); mutex_lock(&inode->inotify_mutex);
if (inotify_clone_watch(&old->watch, &chunk->watch) < 0) { if (inotify_clone_watch(&old->watch, &chunk->watch) < 0) {
...@@ -425,7 +427,8 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree) ...@@ -425,7 +427,8 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
spin_unlock(&hash_lock); spin_unlock(&hash_lock);
inotify_evict_watch(&old->watch); inotify_evict_watch(&old->watch);
mutex_unlock(&inode->inotify_mutex); 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; return 0;
} }
......
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