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 ------------------------------------------------------------------------------ Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San Francisco, CA to explore cutting-edge tech and listen to tech luminaries present their vision of the future. This family event has something for everyone, including kids. Get more information and register today. http://sdm.link/attshape _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel