From: Deepanshu Kartikey <[email protected]>

eventfs_create_dir() allocates the eventfs_inode and initializes it with
init_ei(). But this does not initialize the eventfs_inode list_heads. If
the eventfs_create_dir() fails due to memory pressure, it will call
free_ei() before it initialized the lists, and that checks to make sure
the eventfs_inode has no children. But because the list wasn't
initialized, it will give a false warning.

Fix it by moving the list initialization into init_ei().

Cc: [email protected]
Fixes: 5790b1fb3d67 ("eventfs: Remove eventfs_file and just use eventfs_inode")
Reported-by: [email protected]
Closes: https://syzkaller.appspot.com/bug?extid=3ef80b4ed02226d04a06
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Deepanshu Kartikey <[email protected]>
[ Rewrote change log ]
Signed-off-by: Steven Rostedt <[email protected]>
(cherry picked from commit 1704aaaf5d22bc765c168402350d191e24e245bc)

https://virtuozzo.atlassian.net/browse/VSTOR-154529
Feature: fix ms/tracefs

Signed-off-by: Eva Kurchatova <[email protected]>
---
 fs/tracefs/event_inode.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/fs/tracefs/event_inode.c b/fs/tracefs/event_inode.c
index fbaa64e482e0..ca6e0a653efa 100644
--- a/fs/tracefs/event_inode.c
+++ b/fs/tracefs/event_inode.c
@@ -446,6 +446,8 @@ static inline struct eventfs_inode *init_ei(struct 
eventfs_inode *ei, const char
        if (!ei->name)
                return NULL;
        kref_init(&ei->kref);
+       INIT_LIST_HEAD(&ei->children);
+       INIT_LIST_HEAD(&ei->list);
        return ei;
 }
 
@@ -753,8 +755,6 @@ struct eventfs_inode *eventfs_create_dir(const char *name, 
struct eventfs_inode
        ei->entries = entries;
        ei->nr_entries = size;
        ei->data = data;
-       INIT_LIST_HEAD(&ei->children);
-       INIT_LIST_HEAD(&ei->list);
 
        mutex_lock(&eventfs_mutex);
        if (!parent->is_freed)
@@ -826,9 +826,6 @@ struct eventfs_inode *eventfs_create_events_dir(const char 
*name, struct dentry
        ei->attr.uid = uid;
        ei->attr.gid = gid;
 
-       INIT_LIST_HEAD(&ei->children);
-       INIT_LIST_HEAD(&ei->list);
-
        ti = get_tracefs(inode);
        ti->flags |= TRACEFS_EVENT_INODE;
        ti->private = ei;
-- 
2.56.0

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to