[PATCH v5] tests: extend for decoding of udev_monitor_netlink_header
Dmitry V. Levin
ldv at altlinux.org
Wed Apr 4 13:45:12 UTC 2018
On Fri, Mar 30, 2018 at 12:17:51AM +0530, Harsha Sharma wrote:
> * tests/netlink_kobject_uevent.c: Add test_nlmsg_type_udev.
> ---
> Changes in v5:
> * invoke sprintrc before first printf call
>
> Changes in v4:
> * invoke sprintrc before first printf call
I found out that the test already contained some code that used errno
after potential clobbering by printf, and fixed it. You may reuse
the result.
> * minor fix
>
> Changes in v3:
> * change format type
>
> Changes in v2:
> * Add decoding of kernel messages
> * initialize udev_monitor_netlink_header with non-zero values
> * cover case for length exceeding size of structure
>
> tests/netlink_kobject_uevent.c | 70 ++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 70 insertions(+)
>
> diff --git a/tests/netlink_kobject_uevent.c b/tests/netlink_kobject_uevent.c
> index cacab5fd..3ee27488 100644
> --- a/tests/netlink_kobject_uevent.c
> +++ b/tests/netlink_kobject_uevent.c
> @@ -27,9 +27,77 @@
> */
>
> #include "tests.h"
> +#include <string.h>
> #include <stdio.h>
> #include <sys/socket.h>
> +#include <arpa/inet.h>
> #include "netlink.h"
> +#include "netlink_kobject_uevent.h"
> +
> +static void
> +test_nlmsg_type_udev(const int fd)
> +{
> + long ret;
> + const char *err_rc;
> + unsigned int offset = 8;
> + struct udev_monitor_netlink_header uh = {
> + .prefix = "libudev",
> + .magic = htonl(0xfeedcafe),
> + .header_size = sizeof(uh),
> + .properties_off = 40,
> + .properties_len = 299,
> + .filter_subsystem_hash = htonl(0xc370b302),
> + .filter_devtype_hash = htonl(0x10800000),
> + .filter_tag_bloom_hi = htonl(0x2000400),
> + .filter_tag_bloom_lo = htonl(0x10800000),
> + };
> + unsigned int len = sizeof(uh);
> + char buf[len + offset];
> + memcpy(buf, &uh, len);
> + memcpy(buf + len, "12345678", offset);
> +
> + ret = sendto(fd, &buf, len + offset, MSG_DONTWAIT, NULL, 0);
> + err_rc = sprintrc(ret);
> + printf("sendto(%d, {{prefix=\"%s\", magic=htonl(%#x)"
> + ", header_size=%u, properties_off=%u, properties_len=%u"
> + ", filter_subsystem_hash=htonl(%#x)"
> + ", filter_devtype_hash=htonl(%#x)"
> + ", filter_tag_bloom_hi=htonl(%#x)"
> + ", filter_tag_bloom_lo=htonl(%#x)}, "
> + , fd, uh.prefix,
> + ntohl(uh.magic), uh.header_size, uh.properties_off,
> + uh.properties_len, ntohl(uh.filter_subsystem_hash),
> + ntohl(uh.filter_devtype_hash), ntohl(uh.filter_tag_bloom_hi),
> + ntohl(uh.filter_tag_bloom_lo));
> + print_quoted_memory(buf + len, offset);
> + printf("}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
> + len + offset, err_rc);
> +
> +}
> +
> +static void
> +test_nlmsg_type_kernel(const int fd)
> +{
> + long ret;
> + const char *err_rc;
> + struct udev_monitor_netlink_header uh = {
> + .prefix = "change@",
> + .magic = htonl(0xfeedcafe),
> + .header_size = sizeof(uh),
> + .properties_off = 10,
> + .properties_len = 299,
> + .filter_subsystem_hash = htonl(0xfffffff),
> + .filter_devtype_hash = htonl(0x10000000),
> + .filter_tag_bloom_hi = htonl(0x2000400),
> + };
> +
> + ret = sendto(fd, &uh, sizeof(uh), MSG_DONTWAIT, NULL, 0);
> + err_rc = sprintrc(ret);
> + printf("sendto(%d, ", fd);
> + print_quoted_memory(&uh, sizeof(uh) - 8);
Why sizeof(uh) - 8? When the prefix doesn't match, your parser does not
look at sizeof(udev_monitor_netlink_header), it calls printstrn instead.
I suppose the argument of print_quoted_memory should be DEFAULT_STRLEN.
> + printf("..., %u, MSG_DONTWAIT, NULL, 0) = %s\n",
> + (unsigned) sizeof(uh), err_rc);
> +}
>
> int
> main(void)
> @@ -39,6 +107,8 @@ main(void)
> long rc;
> int fd = create_nl_socket(NETLINK_KOBJECT_UEVENT);
>
> + test_nlmsg_type_udev(fd);
> + test_nlmsg_type_kernel(fd);
> /* test using data that looks like a zero-length C string */
> char *const buf = tail_alloc(DEFAULT_STRLEN + 1);
> buf[0] = '=';
OK, it works, but the following cases of the decoder are not covered,
as you can see in the coverage statistics:
1. umove_or_printaddr(tcp, addr, &uh) != 0
2. len == offset
Could you add checks for these two remaining cases, please?
--
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20180404/ae6421e7/attachment.bin>
More information about the Strace-devel
mailing list