Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'trace-v6.7-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace

Pull tracing fixes from Steven Rostedt:

- Fix a NULL kernel dereference in set_gid() on tracefs mounting.

When tracefs is mounted with "gid=1000", it will update the existing
dentries to have the new gid. The tracefs_inode which is retrieved by
a container_of(dentry->d_inode) has flags to see if the inode belongs
to the eventfs system.

The issue that was fixed was if getdents() was called on tracefs that
was previously mounted, and was not closed. It will leave a "cursor
dentry" in the subdirs list of the current dentries that set_gid()
walks. On a remount of tracefs, the container_of(dentry->d_inode)
will dereference a NULL pointer and cause a crash when referenced.

Simply have a check for dentry->d_inode to see if it is NULL and if
so, skip that entry.

- Fix the bits of the eventfs_inode structure.

The "is_events" bit was taken from the nr_entries field, but the
nr_entries field wasn't updated to be 30 bits and was still 31.
Including the "is_freed" bit this would use 33 bits which would make
the structure use another integer for just one bit.

* tag 'trace-v6.7-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
eventfs: Fix bitwise fields for "is_events"
tracefs: Check for dentry->d_inode exists in set_gid()

+5 -1
+4
fs/tracefs/inode.c
··· 215 215 struct dentry *dentry = list_entry(tmp, struct dentry, d_child); 216 216 next = tmp->next; 217 217 218 + /* Note, getdents() can add a cursor dentry with no inode */ 219 + if (!dentry->d_inode) 220 + continue; 221 + 218 222 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); 219 223 220 224 change_gid(dentry, gid);
+1 -1
fs/tracefs/internal.h
··· 63 63 }; 64 64 unsigned int is_freed:1; 65 65 unsigned int is_events:1; 66 - unsigned int nr_entries:31; 66 + unsigned int nr_entries:30; 67 67 }; 68 68 69 69 static inline struct tracefs_inode *get_tracefs(const struct inode *inode)