[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