tracing/user_events: Prevent same address and bit per process
User processes register an address and bit pair for events. If the same address and bit pair are registered multiple times in the same process, it can cause undefined behavior when events are enabled/disabled. When more than one are used, the bit could be turned off by another event being disabled, while the original event is still enabled. Prevent undefined behavior by checking the current mm to see if any event has already been registered for the address and bit pair. Return EADDRINUSE back to the user process if it's already being used. Update ftrace self-test to ensure this occurs properly. Link: https://lkml.kernel.org/r/20230425225107.8525-4-beaub@linux.microsoft.com Suggested-by: Doug Cook <dcook@linux.microsoft.com> Signed-off-by: Beau Belgrave <beaub@linux.microsoft.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
committed by
Steven Rostedt (Google)
parent
17b439db21
commit
97bbce89bf
@@ -219,7 +219,12 @@ TEST_F(user, register_events) {
|
||||
ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSREG, ®));
|
||||
ASSERT_EQ(0, reg.write_index);
|
||||
|
||||
/* Multiple registers should result in same index */
|
||||
/* Multiple registers to the same addr + bit should fail */
|
||||
ASSERT_EQ(-1, ioctl(self->data_fd, DIAG_IOCSREG, ®));
|
||||
ASSERT_EQ(EADDRINUSE, errno);
|
||||
|
||||
/* Multiple registers to same name should result in same index */
|
||||
reg.enable_bit = 30;
|
||||
ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSREG, ®));
|
||||
ASSERT_EQ(0, reg.write_index);
|
||||
|
||||
@@ -242,6 +247,8 @@ TEST_F(user, register_events) {
|
||||
|
||||
/* Unregister */
|
||||
ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSUNREG, &unreg));
|
||||
unreg.disable_bit = 30;
|
||||
ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSUNREG, &unreg));
|
||||
|
||||
/* Delete should work only after close and unregister */
|
||||
close(self->data_fd);
|
||||
|
||||
Reference in New Issue
Block a user