diff options
author | Jan Kara <jack@suse.cz> | 2016-12-22 04:15:20 -0500 |
---|---|---|
committer | Paul Moore <paul@paul-moore.com> | 2016-12-23 16:40:32 -0500 |
commit | e3ba730702af370563f66cb610b71aa0ca67955e (patch) | |
tree | 6a7dd8a17c9fde8851366f785faa4d9ce6462fe2 | |
parent | 533c7b69c764ad5febb3e716899f43a75564fcab (diff) |
fsnotify: Remove fsnotify_duplicate_mark()
There are only two calls sites of fsnotify_duplicate_mark(). Those are
in kernel/audit_tree.c and both are bogus. Vfsmount pointer is unused
for audit tree, inode pointer and group gets set in
fsnotify_add_mark_locked() later anyway, mask and free_mark are already
set in alloc_chunk(). In fact, calling fsnotify_duplicate_mark() is
actively harmful because following fsnotify_add_mark_locked() will leak
group reference by overwriting the group pointer. So just remove the two
calls to fsnotify_duplicate_mark() and the function.
Signed-off-by: Jan Kara <jack@suse.cz>
[PM: line wrapping to fit in 80 chars]
Signed-off-by: Paul Moore <paul@paul-moore.com>
-rw-r--r-- | fs/notify/mark.c | 12 | ||||
-rw-r--r-- | include/linux/fsnotify_backend.h | 2 | ||||
-rw-r--r-- | kernel/audit_tree.c | 8 |
3 files changed, 4 insertions, 18 deletions
diff --git a/fs/notify/mark.c b/fs/notify/mark.c index d3fea0bd89e2..6043306e8e21 100644 --- a/fs/notify/mark.c +++ b/fs/notify/mark.c | |||
@@ -510,18 +510,6 @@ void fsnotify_detach_group_marks(struct fsnotify_group *group) | |||
510 | } | 510 | } |
511 | } | 511 | } |
512 | 512 | ||
513 | void fsnotify_duplicate_mark(struct fsnotify_mark *new, struct fsnotify_mark *old) | ||
514 | { | ||
515 | assert_spin_locked(&old->lock); | ||
516 | new->inode = old->inode; | ||
517 | new->mnt = old->mnt; | ||
518 | if (old->group) | ||
519 | fsnotify_get_group(old->group); | ||
520 | new->group = old->group; | ||
521 | new->mask = old->mask; | ||
522 | new->free_mark = old->free_mark; | ||
523 | } | ||
524 | |||
525 | /* | 513 | /* |
526 | * Nothing fancy, just initialize lists and locks and counters. | 514 | * Nothing fancy, just initialize lists and locks and counters. |
527 | */ | 515 | */ |
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 7268ed076be8..ce77caa2bb10 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h | |||
@@ -324,8 +324,6 @@ extern void fsnotify_init_mark(struct fsnotify_mark *mark, void (*free_mark)(str | |||
324 | extern struct fsnotify_mark *fsnotify_find_inode_mark(struct fsnotify_group *group, struct inode *inode); | 324 | extern struct fsnotify_mark *fsnotify_find_inode_mark(struct fsnotify_group *group, struct inode *inode); |
325 | /* find (and take a reference) to a mark associated with group and vfsmount */ | 325 | /* find (and take a reference) to a mark associated with group and vfsmount */ |
326 | extern struct fsnotify_mark *fsnotify_find_vfsmount_mark(struct fsnotify_group *group, struct vfsmount *mnt); | 326 | extern struct fsnotify_mark *fsnotify_find_vfsmount_mark(struct fsnotify_group *group, struct vfsmount *mnt); |
327 | /* copy the values from old into new */ | ||
328 | extern void fsnotify_duplicate_mark(struct fsnotify_mark *new, struct fsnotify_mark *old); | ||
329 | /* set the ignored_mask of a mark */ | 327 | /* set the ignored_mask of a mark */ |
330 | extern void fsnotify_set_mark_ignored_mask_locked(struct fsnotify_mark *mark, __u32 mask); | 328 | extern void fsnotify_set_mark_ignored_mask_locked(struct fsnotify_mark *mark, __u32 mask); |
331 | /* set the mask of a mark (might pin the object into memory */ | 329 | /* set the mask of a mark (might pin the object into memory */ |
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index 055f11b0a50f..b4b58400531f 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
@@ -258,8 +258,8 @@ static void untag_chunk(struct node *p) | |||
258 | if (!new) | 258 | if (!new) |
259 | goto Fallback; | 259 | goto Fallback; |
260 | 260 | ||
261 | fsnotify_duplicate_mark(&new->mark, entry); | 261 | if (fsnotify_add_mark(&new->mark, |
262 | if (fsnotify_add_mark(&new->mark, new->mark.group, new->mark.inode, NULL, 1)) { | 262 | entry->group, entry->inode, NULL, 1)) { |
263 | fsnotify_put_mark(&new->mark); | 263 | fsnotify_put_mark(&new->mark); |
264 | goto Fallback; | 264 | goto Fallback; |
265 | } | 265 | } |
@@ -395,8 +395,8 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree) | |||
395 | return -ENOENT; | 395 | return -ENOENT; |
396 | } | 396 | } |
397 | 397 | ||
398 | fsnotify_duplicate_mark(chunk_entry, old_entry); | 398 | if (fsnotify_add_mark(chunk_entry, |
399 | if (fsnotify_add_mark(chunk_entry, chunk_entry->group, chunk_entry->inode, NULL, 1)) { | 399 | old_entry->group, old_entry->inode, NULL, 1)) { |
400 | spin_unlock(&old_entry->lock); | 400 | spin_unlock(&old_entry->lock); |
401 | fsnotify_put_mark(chunk_entry); | 401 | fsnotify_put_mark(chunk_entry); |
402 | fsnotify_put_mark(old_entry); | 402 | fsnotify_put_mark(old_entry); |