netlink: NLMSG_DONE never enter specific family decoder

Dmitry V. Levin ldv at altlinux.org
Mon Jun 26 00:30:16 UTC 2017


On Sat, Jun 24, 2017 at 01:43:14PM +0800, JingPiao Chen wrote:
> On Sat, Jun 24, 2017 at 04:36:34AM +0300, Dmitry V. Levin wrote:
> > On Sat, Jun 24, 2017 at 09:06:06AM +0800, JingPiao Chen wrote:
> > > static int
> > > print_nlmsghdr(struct tcb *tcp,
> > >       const int fd,
> > >       int family,
> > >       const struct nlmsghdr *const nlmsghdr)
> > > {
> > > ...
> > > const int hdr_family = (nlmsghdr->nlmsg_type < NLMSG_MIN_TYPE)
> > >       ? NL_FAMILY_DEFAULT
> > >       : (family != NL_FAMILY_DEFAULT
> > >  ? family : get_fd_nl_family(tcp, fd));
> > 
> > Feel free to change this if NLMSG_DONE needs a family specific decoding.
> 
> I have send a patch. I've also thought about rewriting NLMSG_DONE,
> because only three family send useful data: drivers/connector/connector.c,
> drivers/infiniband/core/iwpm_util.c and net/netfilter/nfnetlink_log.c.
> In the end, I think it's good enough, but I want to ask your opinion.
> 
> $ git grep "NLMSG_DONE"
> 
> drivers/connector/connector.c:	nlh = nlmsg_put(skb, 0, msg->seq, NLMSG_DONE, size, 0);
> drivers/infiniband/core/iwpm_util.c:	nlh->nlmsg_type = NLMSG_DONE;
> 
> These two family I do not understand what they send.

drivers/connector/connector.c:cn_netlink_send_mult() sends struct cn_msg
followed by optional data.

drivers/infiniband/core/iwpm_util.c:send_nlmsg_done() sends no data.

> net/netfilter/nfnetlink_log.c:
> static void
> __nfulnl_send(struct nfulnl_instance *inst)
> {
> 	if (inst->qlen > 1) {
> 		struct nlmsghdr *nlh = nlmsg_put(inst->skb, 0, 0,
> 						 NLMSG_DONE,
> 						 sizeof(struct nfgenmsg),
> 						 0);
> 		if (WARN_ONCE(!nlh, "bad nlskb size: %u, tailroom %d\n",
> 			      inst->skb->len, skb_tailroom(inst->skb))) {
> 			kfree_skb(inst->skb);
> 			goto out;
> 		}
> 	}
> 	nfnetlink_unicast(inst->skb, inst->net, inst->peer_portid,
> 			  MSG_DONTWAIT);
> out:
> 	inst->qlen = 0;
> 	inst->skb = NULL;
> }
> 
> It allocate struct nfgenmsg, but do not initialize it.

Yes, that looks odd.

> Following family data length is zero. Default decoder can handle them.
> 
> drivers/net/team/team.c: nlh = nlmsg_put(skb, portid, seq, NLMSG_DONE, 0, flags | NLM_F_MULTI);
> 
> drivers/scsi/scsi_transport_iscsi.c:	int t = done ? NLMSG_DONE : type;
> static void
> iscsi_if_rx(struct sk_buff *skb)
> {
> 	...
> 			err = iscsi_if_send_reply(group, nlh->nlmsg_seq,
> 				nlh->nlmsg_type, 0, 0, ev, sizeof(*ev));
> 	...
> }
> 
> kernel/audit.c:	int		t     = done  ? NLMSG_DONE  : type;
> kernel/auditfilter.c:
> static void audit_list_rules(int seq, struct sk_buff_head *q)
> {
> 	...
> 	skb = audit_make_reply(seq, AUDIT_LIST_RULES, 1, 1, NULL, 0);
> 	...
> }
> 
> net/core/devlink.c:			NLMSG_DONE, 0, flags | NLM_F_MULTI);
> net/core/devlink.c:			NLMSG_DONE, 0, flags | NLM_F_MULTI);
> net/core/devlink.c:			NLMSG_DONE, 0, flags | NLM_F_MULTI);

Yes, besides drivers/connector/connector.c, looks like the current parser
handles NLMSG_DONE well.


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20170626/994d034e/attachment.bin>


More information about the Strace-devel mailing list