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 [email protected] https://lists.sourceforge.net/lists/listinfo/strace-devel
