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

Attachment: 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

Reply via email to