The current proc connector code has the foll. bugs - if there are more than one listeners for the proc connector messages, and one of them deregisters for listening using PROC_CN_MCAST_IGNORE, they will still get all proc connector messages, as long as there is another listener. Another issue is if one client calls PROC_CN_MCAST_LISTEN, and another one calls PROC_CN_MCAST_IGNORE, then both will end up not getting any messages. This patch adds filtering and drops packet if client has sent PROC_CN_MCAST_IGNORE. This data is stored in the client socket's sk_user_data. In addition, we only increment or decrement proc_event_num_listeners once per client. This fixes the above issues. cn_release is the release function added for NETLINK_CONNECTOR. It uses the newly added netlink_release function added to netlink_sock. It will free sk_user_data.
Showing the changes to include/uapi (1 of 5 files). Show all
Unified · Split
| @@ -30,6 +30,30 @@ enum proc_cn_mcast_op { · 29 unmodified lines | ||
| 30 | 30 | PROC_CN_MCAST_IGNORE = 2 |
| 31 | 31 | }; |
| 32 | 32 | |
| 33 | +enum proc_cn_event { | |
| 34 | + /* Use successive bits so the enums can be used to record | |
| 35 | + * sets of events as well | |
| 36 | + */ | |
| 37 | + PROC_EVENT_NONE = 0x00000000, | |
| 38 | + PROC_EVENT_FORK = 0x00000001, | |
| 39 | + PROC_EVENT_EXEC = 0x00000002, | |
| 40 | + PROC_EVENT_UID = 0x00000004, | |
| 41 | + PROC_EVENT_GID = 0x00000040, | |
| 42 | + PROC_EVENT_SID = 0x00000080, | |
| 43 | + PROC_EVENT_PTRACE = 0x00000100, | |
| 44 | + PROC_EVENT_COMM = 0x00000200, | |
| 45 | + /* "next" should be 0x00000400 */ | |
| 46 | + /* "last" is the last process event: exit, | |
| 47 | + * while "next to last" is coredumping event | |
| 48 | + */ | |
| 49 | + PROC_EVENT_COREDUMP = 0x40000000, | |
| 50 | + PROC_EVENT_EXIT = 0x80000000 | |
| 51 | +}; | |
| 52 | + | |
| 53 | +struct proc_input { | |
| 54 | + enum proc_cn_mcast_op mcast_op; | |
| 55 | +}; | |
| 56 | + | |
| 33 | 57 | /* |
| 34 | 58 | * From the user's point of view, the process |
| 35 | 59 | * ID is the thread group ID and thread ID is the internal |
| @@ -44,24 +68,7 @@ enum proc_cn_mcast_op { · 8 unmodified lines | ||
| 44 | 68 | */ |
| 45 | 69 | |
| 46 | 70 | struct proc_event { |
| 47 | − enum what { | |
| 48 | − /* Use successive bits so the enums can be used to record | |
| 49 | − * sets of events as well | |
| 50 | − */ | |
| 51 | − PROC_EVENT_NONE = 0x00000000, | |
| 52 | − PROC_EVENT_FORK = 0x00000001, | |
| 53 | − PROC_EVENT_EXEC = 0x00000002, | |
| 54 | − PROC_EVENT_UID = 0x00000004, | |
| 55 | − PROC_EVENT_GID = 0x00000040, | |
| 56 | − PROC_EVENT_SID = 0x00000080, | |
| 57 | − PROC_EVENT_PTRACE = 0x00000100, | |
| 58 | − PROC_EVENT_COMM = 0x00000200, | |
| 59 | − /* "next" should be 0x00000400 */ | |
| 60 | − /* "last" is the last process event: exit, | |
| 61 | − * while "next to last" is coredumping event */ | |
| 62 | − PROC_EVENT_COREDUMP = 0x40000000, | |
| 63 | − PROC_EVENT_EXIT = 0x80000000 | |
| 64 | − } what; | |
| 71 | + enum proc_cn_event what; | |
| 65 | 72 | __u32 cpu; |
| 66 | 73 | __u64 __attribute__((aligned(8))) timestamp_ns; |
| 67 | 74 | /* Number of nano seconds since system boot */ |