lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 10 Jan 2018 03:00:23 +0000
From:   Chris Mi <chrism@...lanox.com>
To:     Phil Sutter <phil@....cc>
CC:     "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
        "gerlitz.or@...il.com" <gerlitz.or@...il.com>,
        "stephen@...workplumber.org" <stephen@...workplumber.org>,
        "dsahern@...il.com" <dsahern@...il.com>,
        "marcelo.leitner@...il.com" <marcelo.leitner@...il.com>
Subject: RE: [patch iproute2 v7 1/2] lib/libnetlink: Add functions
 rtnl_talk_msg and rtnl_talk_iov

> -----Original Message-----
> From: n0-1@...yte.nwl.cc [mailto:n0-1@...yte.nwl.cc] On Behalf Of Phil
> Sutter
> Sent: Wednesday, January 10, 2018 3:24 AM
> To: Chris Mi <chrism@...lanox.com>
> Cc: netdev@...r.kernel.org; gerlitz.or@...il.com;
> stephen@...workplumber.org; dsahern@...il.com;
> marcelo.leitner@...il.com
> Subject: Re: [patch iproute2 v7 1/2] lib/libnetlink: Add functions
> rtnl_talk_msg and rtnl_talk_iov
> 
> Hi,
> 
> On Tue, Jan 09, 2018 at 03:59:07PM +0900, Chris Mi wrote:
> [...]
> > diff --git a/lib/libnetlink.c b/lib/libnetlink.c index
> > 00e6ce0c..ae0059f9 100644
> > --- a/lib/libnetlink.c
> > +++ b/lib/libnetlink.c
> > @@ -581,39 +581,43 @@ static void rtnl_talk_error(struct nlmsghdr *h,
> struct nlmsgerr *err,
> >  		strerror(-err->error));
> >  }
> >
> > -static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
> > -		       struct nlmsghdr **answer,
> > -		       bool show_rtnl_err, nl_ext_ack_fn_t errfn)
> > +static int __rtnl_talk_msg(struct rtnl_handle *rtnl, struct msghdr *m,
> > +			   struct nlmsghdr **answer,
> > +			   bool show_rtnl_err, nl_ext_ack_fn_t errfn)
> >  {
> > -	int status;
> > -	unsigned int seq;
> > -	struct nlmsghdr *h;
> >  	struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK };
> > -	struct iovec iov = {
> > -		.iov_base = n,
> > -		.iov_len = n->nlmsg_len
> > -	};
> > +	int i, status, iovlen = m->msg_iovlen;
> > +	struct iovec iov;
> >  	struct msghdr msg = {
> >  		.msg_name = &nladdr,
> >  		.msg_namelen = sizeof(nladdr),
> >  		.msg_iov = &iov,
> >  		.msg_iovlen = 1,
> >  	};
> > -	char *buf;
> > -
> > -	n->nlmsg_seq = seq = ++rtnl->seq;
> > +	unsigned int seq = 0;
> > +	struct nlmsghdr *h;
> >
> > -	if (answer == NULL)
> > -		n->nlmsg_flags |= NLM_F_ACK;
> > +	for (i = 0; i < iovlen; i++) {
> > +		struct iovec *v;
> > +		v = &m->msg_iov[i];
> > +		h = v->iov_base;
> > +		h->nlmsg_seq = seq = ++rtnl->seq;
> > +		if (answer == NULL)
> > +			h->nlmsg_flags |= NLM_F_ACK;
> > +	}
> >
> > -	status = sendmsg(rtnl->fd, &msg, 0);
> > +	status = sendmsg(rtnl->fd, m, 0);
> >  	if (status < 0) {
> >  		perror("Cannot talk to rtnetlink");
> >  		return -1;
> >  	}
> >
> > +	i = 0;
> >  	while (1) {
> 
> for (i = 1; ; i++) ?
> 
> > +		char *buf;
> 
> Why did you move this declaration?
> 
> > +next:
> 
> Drop this and use 'continue' instead of 'goto next' below?
Actually there are two loops, I need go to the outer while loop instead of the inner for loop.
> 
> >  		status = rtnl_recvmsg(rtnl->fd, &msg, &buf);
> > +		++i;
> >
> >  		if (status < 0)
> >  			return status;
> > @@ -642,7 +646,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl,
> > struct nlmsghdr *n,
> >
> >  			if (nladdr.nl_pid != 0 ||
> >  			    h->nlmsg_pid != rtnl->local.nl_pid ||
> > -			    h->nlmsg_seq != seq) {
> > +			    h->nlmsg_seq > seq || h->nlmsg_seq < seq - iovlen)
> {
> >  				/* Don't forget to skip that message. */
> >  				status -= NLMSG_ALIGN(len);
> >  				h = (struct nlmsghdr *)((char *)h +
> NLMSG_ALIGN(len)); @@ -662,7
> > +666,10 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr
> *n,
> >  						*answer = (struct nlmsghdr
> *)buf;
> >  					else
> >  						free(buf);
> > -					return 0;
> > +					if (h->nlmsg_seq == seq)
> > +						return 0;
> > +					else
> > +						goto next;
> >  				}
> >
> >  				if (rtnl->proto != NETLINK_SOCK_DIAG &&
> 
> Cheers, Phil

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ