On Wed, Jun 22, 2016 at 01:27:06PM +0000, Fabien Siron wrote: > Handle the case where there are several messages in the buffer. > This is very useful to some protocols like SOCK_DIAG. > > * netlink.c (nlmsg_fetch, nlmsg_next): New functions. > (decode_netlink_msg): New function. > (decode_netlink): Call decode_netlink_msg(). > * tests/netlink_parsing.c (send_query): Adapt test. > --- > netlink.c | 85 > +++++++++++++++++++++++++++++++++++++++++-------- > tests/netlink_parsing.c | 19 ++++++++++- > 2 files changed, 90 insertions(+), 14 deletions(-) > > diff --git a/netlink.c b/netlink.c > index c43f6e7..e05e50c 100644 > --- a/netlink.c > +++ b/netlink.c > @@ -31,34 +31,93 @@ > #include "xlat/netlink_flags.h" > #include "xlat/netlink_types.h" > > -void > -decode_netlink(struct tcb *tcp, unsigned long addr, unsigned long size) > -{ > - struct nlmsghdr nlmsghdr; > +/* since our target is not in the same process, here are some utils for > nlmsg */ > +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. > + 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. -- ldv
pgpB7TPWw1TXN.pgp
Description: PGP signature
------------------------------------------------------------------------------ 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