Hello Steven Rostedt (Google),
The patch 5790b1fb3d67: "eventfs: Remove eventfs_file and just use
eventfs_inode" from Oct 4, 2023 (linux-next), leads to the following
Smatch static checker warning:
fs/tracefs/event_inode.c:782 eventfs_create_events_dir()
error: potential null dereference 'ei'. (kzalloc returns null)
fs/tracefs/event_inode.c
721 struct eventfs_inode *eventfs_create_events_dir(const char *name,
struct dentry *parent,
722 const struct
eventfs_entry *entries,
723 int size, void *data)
724 {
725 struct dentry *dentry = tracefs_start_creating(name, parent);
726 struct eventfs_inode *ei;
727 struct tracefs_inode *ti;
728 struct inode *inode;
729
730 if (security_locked_down(LOCKDOWN_TRACEFS))
731 return NULL;
I think these error paths should undo the tracefs_start_creating()
instead of returning directly.
732
733 if (IS_ERR(dentry))
734 return (struct eventfs_inode *)dentry;
Same.
735
736 ei = kzalloc(sizeof(*ei), GFP_KERNEL);
737 if (!ei)
738 goto fail;
"ei" is NULL
739
740 inode = tracefs_get_inode(dentry->d_sb);
741 if (unlikely(!inode))
742 goto fail;
743
744 if (size) {
745 ei->d_children = kzalloc(sizeof(*ei->d_children) *
size, GFP_KERNEL);
746 if (!ei->d_children)
747 goto fail;
748 }
749
750 ei->dentry = dentry;
751 ei->entries = entries;
752 ei->nr_entries = size;
753 ei->data = data;
754 ei->name = kstrdup_const(name, GFP_KERNEL);
755 if (!ei->name)
756 goto fail;
757
758 INIT_LIST_HEAD(&ei->children);
759 INIT_LIST_HEAD(&ei->list);
760
761 ti = get_tracefs(inode);
762 ti->flags |= TRACEFS_EVENT_INODE | TRACEFS_EVENT_TOP_INODE;
763 ti->private = ei;
764
765 inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
766 inode->i_op = &eventfs_root_dir_inode_operations;
767 inode->i_fop = &eventfs_file_operations;
768
769 /* directory inodes start off with i_nlink == 2 (for "." entry)
*/
770 inc_nlink(inode);
771 d_instantiate(dentry, inode);
772 inc_nlink(dentry->d_parent->d_inode);
773 fsnotify_mkdir(dentry->d_parent->d_inode, dentry);
774 tracefs_end_creating(dentry);
775
776 /* Will call dput when the directory is removed */
777 dget(dentry);
778
779 return ei;
780
781 fail:
--> 782 kfree(ei->d_children);
^^^^^^^^^^^^^^
Crash
783 kfree(ei);
784 tracefs_failed_creating(dentry);
785 return ERR_PTR(-ENOMEM);
786 }
regards,
dan carpenter