[PATCH v7 4/4] Netlink: handle multi netlink messages
Fabien Siron
fabien.siron at epita.fr
Thu Jun 23 10:49:53 UTC 2016
Quoting Dmitry V. Levin (2016-06-22 17:40:39)
> On Wed, Jun 22, 2016 at 01:27:06PM +0000, Fabien Siron wrote:
[...]
> > +static int
> > +nlmsg_fetch(struct tcb *tcp, struct nlmsghdr *nlmsghdr, unsigned long addr,
> > + unsigned long len) {
> > + if (len < sizeof(struct nlmsghdr)) {
> > + if (len != 0)
> > + printstr(tcp, addr, len);
> > + return 0;
> > + }
> > +
> > + if (umove_or_printaddr(tcp, addr, nlmsghdr) == -1)
> > + return 0;
> > +
> > + if (len < nlmsghdr->nlmsg_len) {
> > + printstr(tcp, addr, len);
> > + return 0;
> > + }
>
> I think that if struct nlmsghdr has been successfully fetched,
> the header should be printed regardless of its nlmsg_len.
So you actually want to remove the last test?
>
> > + return 1;
> > +}
> >
> > +static unsigned long
> > +nlmsg_next(struct nlmsghdr *nlmsghdr, unsigned long addr, unsigned long *len) {
> > + if (NLMSG_ALIGN(nlmsghdr->nlmsg_len) == 0 ||
> > + NLMSG_ALIGN(nlmsghdr->nlmsg_len) > *len)
> > + return 0;
>
> This is not going to happen with current implementation of nlmsg_fetch,
> but if nlmsg_fetch changes and if this condition is true, then
> *len remains unchanged and the subsequent nlmsg_fetch prints NULL.
A way to fix that is to put *len to 0 in this test. But the problem is that
nothing will be printed if sizeof(struct nlmsghdr) < *len < nlmsghdr->nlmsg_len.
Another idea is to put nlmsghdr->nlmsg_len to *len in this test.
Regards,
--
Fabien Siron
More information about the Strace-devel
mailing list