On Fri, May 05, 2017 at 06:21:17PM +0800, JingPiao Chen wrote:
> * netlink.c (decode_payload): Decode NLMSG_DONE messages.
> * tests/netlink_protocol.c (test_nlmsg_done): New function
> for checking decoding of NLMSG_DONE messages.
> (main): Use it.
> ---
>  netlink.c                |  6 ++++++
>  tests/netlink_protocol.c | 37 +++++++++++++++++++++++++++++++++++++
>  2 files changed, 43 insertions(+)
> 
> diff --git a/netlink.c b/netlink.c
> index 678343c..daaa745 100644
> --- a/netlink.c
> +++ b/netlink.c
> @@ -120,6 +120,12 @@ decode_payload(struct tcb *const tcp,
>       if (nlmsghdr->nlmsg_type == NLMSG_ERROR) {
>               decode_nlmsgerr(tcp, addr, len);
>               return;
> +     } else if (nlmsghdr->nlmsg_type == NLMSG_DONE && len == sizeof(int)) {
> +             int num;
> +
> +             if (!umove_or_printaddr(tcp, addr, &num))
> +                     tprintf("%d", num);
> +             return;
>       }

The "else" part of "else if" in conjunction with "return" statements
is redundant, but it causes no harm either, so I left it intact.

>       printstrn(tcp, addr, len);
> diff --git a/tests/netlink_protocol.c b/tests/netlink_protocol.c
> index 35f954f..121c83d 100644
> --- a/tests/netlink_protocol.c
> +++ b/tests/netlink_protocol.c
> @@ -314,6 +314,42 @@ test_nlmsgerr(const int fd)
>              nlh->nlmsg_len, sprintrc(rc));
>  }
>  
> +static void
> +test_nlmsg_done(const int fd)
> +{
> +     struct nlmsghdr *nlh;
> +     int total_len;
> +     void *const nlh0 = tail_alloc(NLMSG_HDRLEN);
> +     long rc;
> +
> +     nlh = nlh0;
> +     nlh->nlmsg_len = NLMSG_HDRLEN + sizeof(int);
> +     nlh->nlmsg_type = NLMSG_DONE;
> +     nlh->nlmsg_flags = NLM_F_MULTI;
> +     nlh->nlmsg_seq = 0;
> +     nlh->nlmsg_pid = 0;
> +
> +     rc = sendto(fd, nlh, nlh->nlmsg_len, MSG_DONTWAIT, NULL, 0);
> +     printf("sendto(%d, {{len=%u, type=NLMSG_DONE, flags=NLM_F_MULTI"
> +            ", seq=0, pid=0}, %p}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
> +            fd, nlh->nlmsg_len, nlh0 + NLMSG_HDRLEN,
> +            nlh->nlmsg_len, sprintrc(rc));
> +
> +     nlh = nlh0 - sizeof(int);
> +     nlh->nlmsg_len = NLMSG_HDRLEN + sizeof(int);
> +     nlh->nlmsg_type = NLMSG_DONE;
> +     nlh->nlmsg_flags = NLM_F_MULTI;
> +     nlh->nlmsg_seq = 0;
> +     nlh->nlmsg_pid = 0;
> +     total_len = nlh->nlmsg_len;
> +     memcpy(NLMSG_DATA(nlh), &total_len, sizeof(total_len));
> +
> +     rc = sendto(fd, nlh, nlh->nlmsg_len, MSG_DONTWAIT, NULL, 0);
> +     printf("sendto(%d, {{len=%u, type=NLMSG_DONE, flags=NLM_F_MULTI"
> +            ", seq=0, pid=0}, %d}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
> +            fd, nlh->nlmsg_len, nlh->nlmsg_len, total_len, sprintrc(rc));
> +}
> +
>  int main(void)
>  {
>       struct sockaddr_nl addr;

According to the coverage, one NLMSG_DONE case is missing, so I added it
in a follow-up comment.  While at it, I also changed nlh initialization
to use designated initializers, e.g.

-       nlh->nlmsg_len = NLMSG_HDRLEN + sizeof(int);
-       nlh->nlmsg_type = NLMSG_DONE;
-       nlh->nlmsg_flags = NLM_F_MULTI;
-       nlh->nlmsg_seq = 0;
-       nlh->nlmsg_pid = 0;
+       *nlh = (struct nlmsghdr) {
+               .nlmsg_len = NLMSG_HDRLEN + sizeof(num),
+               .nlmsg_type = NLMSG_DONE,
+               .nlmsg_flags = NLM_F_MULTI
+       };

As you are going to add more tests of this kind soon,
consider using this C99 syntax.


-- 
ldv

Attachment: signature.asc
Description: PGP signature

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to