mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 16:13:19 +09:00
connector/cn_proc: Add filtering to fix some bugs
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. Signed-off-by: Anjali Kulkarni <anjali.k.kulkarni@oracle.com> Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
a4c9a56e6a
commit
2aa1f7a1f4
@@ -90,13 +90,19 @@ void cn_del_callback(const struct cb_id *id);
|
||||
* If @group is not zero, then message will be delivered
|
||||
* to the specified group.
|
||||
* @gfp_mask: GFP mask.
|
||||
* @filter: Filter function to be used at netlink layer.
|
||||
* @filter_data:Filter data to be supplied to the filter function
|
||||
*
|
||||
* It can be safely called from softirq context, but may silently
|
||||
* fail under strong memory pressure.
|
||||
*
|
||||
* If there are no listeners for given group %-ESRCH can be returned.
|
||||
*/
|
||||
int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, u32 group, gfp_t gfp_mask);
|
||||
int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid,
|
||||
u32 group, gfp_t gfp_mask,
|
||||
int (*filter)(struct sock *dsk, struct sk_buff *skb,
|
||||
void *data),
|
||||
void *filter_data);
|
||||
|
||||
/**
|
||||
* cn_netlink_send - Sends message to the specified groups.
|
||||
|
||||
Reference in New Issue
Block a user