On Tue, Jun 13, 2017 at 10:13:22PM +0800, JingPiao Chen wrote:
> * defs.h (inet_protocols): New xlat prototype.
> * linux/inet_diag.h (inet_diag_req): New structure.
> (INET_DIAG_*): New enum.
> * netlink_sock_diag.c: Include <arpa/inet.h>, <linux/inet_diag.h>
> and "xlat/inet_diag_extended_flags.h".
> (print_inet_diag_sockid, decode_inet_diag_req_compat)
> (decode_inet_diag_req_v2, decode_inet_diag_req)
> (decode_inet_diag_msg): New functions.
> (diag_decoders): Add AF_INET.
> * xlat/inet_diag_extended_flags.in: New file.
> 
> Co-authored-by: Fabien Siron <fabien.si...@epita.fr>
> ---
>  defs.h                           |   1 +
>  linux/inet_diag.h                |  36 +++++++++++-
>  netlink_sock_diag.c              | 122 
> +++++++++++++++++++++++++++++++++++++++
>  xlat/inet_diag_extended_flags.in |  16 +++++
>  4 files changed, 174 insertions(+), 1 deletion(-)
>  create mode 100644 xlat/inet_diag_extended_flags.in
> 
> diff --git a/defs.h b/defs.h
> index f7d25f0..0b32b24 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -293,6 +293,7 @@ extern const struct xlat clocknames[];
>  extern const struct xlat dirent_types[];
>  extern const struct xlat ethernet_protocols[];
>  extern const struct xlat evdev_abs[];
> +extern const struct xlat inet_protocols[];
>  extern const struct xlat msg_flags[];
>  extern const struct xlat netlink_protocols[];
>  extern const struct xlat open_access_modes[];
> diff --git a/linux/inet_diag.h b/linux/inet_diag.h
> index 69012af..7302c87 100644
> --- a/linux/inet_diag.h
> +++ b/linux/inet_diag.h
> @@ -14,7 +14,17 @@ struct inet_diag_sockid {
>       uint32_t idiag_cookie[2];
>  };
>  
> -/* Request structure */
> +/* Request structures */
> +struct inet_diag_req {
> +     uint8_t idiag_family;
> +     uint8_t idiag_src_len;
> +     uint8_t idiag_dst_len;
> +     uint8_t idiag_ext;
> +     struct inet_diag_sockid id;
> +     uint32_t idiag_states;
> +     uint32_t idiag_dbs;
> +};
> +
>  struct inet_diag_req_v2 {
>       uint8_t sdiag_family;
>       uint8_t sdiag_protocol;
> @@ -40,4 +50,28 @@ struct inet_diag_msg {
>       uint32_t idiag_inode;
>  };
>  
> +/* Extensions */
> +enum {
> +     INET_DIAG_NONE,
> +     INET_DIAG_MEMINFO,
> +     INET_DIAG_INFO,
> +     INET_DIAG_VEGASINFO,
> +     INET_DIAG_CONG,
> +     INET_DIAG_TOS,
> +     INET_DIAG_TCLASS,
> +     INET_DIAG_SKMEMINFO,
> +     INET_DIAG_SHUTDOWN,
> +     INET_DIAG_DCTCPINFO,
> +     INET_DIAG_PROTOCOL,  /* response attribute only */
> +     INET_DIAG_SKV6ONLY,
> +     INET_DIAG_LOCALS,
> +     INET_DIAG_PEERS,
> +     INET_DIAG_PAD,
> +     INET_DIAG_MARK,
> +     INET_DIAG_BBRINFO,
> +     __INET_DIAG_MAX,
> +};
> +
> +#define INET_DIAG_MAX (__INET_DIAG_MAX - 1)

I don't think we need __INET_DIAG_MAX or INET_DIAG_MAX.

> +
>  #endif /* !STRACE_LINUX_INET_DIAG_H */
> diff --git a/netlink_sock_diag.c b/netlink_sock_diag.c
> index 3f153a8..7467d1a 100644
> --- a/netlink_sock_diag.c
> +++ b/netlink_sock_diag.c
> @@ -30,11 +30,15 @@
>  #include "defs.h"
>  
>  #include <sys/socket.h>
> +#include <arpa/inet.h>
> +#include <linux/inet_diag.h>
>  #include <linux/netlink.h>
>  #include <linux/netlink_diag.h>
>  #include <linux/packet_diag.h>
>  #include <linux/unix_diag.h>
>  
> +#include "xlat/inet_diag_extended_flags.h"
> +
>  #include "xlat/tcp_states.h"
>  #include "xlat/tcp_state_flags.h"
>  
> @@ -210,9 +214,127 @@ decode_packet_diag_msg(struct tcb *const tcp,
>       return true;
>  }
>  
> +static void
> +print_inet_diag_sockid(const struct inet_diag_sockid *id, const uint8_t 
> family)
> +{
> +     tprintf("{idiag_sport=htons(%u), idiag_dport=htons(%u)",
> +             ntohs(id->idiag_sport), ntohs(id->idiag_dport));
> +     int text_size = family == AF_INET ?
> +             INET_ADDRSTRLEN : INET6_ADDRSTRLEN;
> +     char buf[text_size];
> +
> +     inet_ntop(family, id->idiag_src, buf, text_size);
> +     tprintf(", inet_pton(%s, \"%s\", idiag_src)",
> +             family == AF_INET ? "AF_INET" : "AF_INET6", buf);
> +
> +     inet_ntop(family, id->idiag_dst, buf, text_size);
> +     tprintf(", inet_pton(%s, \"%s\", idiag_dst)",
> +             family == AF_INET ? "AF_INET" : "AF_INET6", buf);

As "family" is untrusted input, we cannot assume it's either AF_INET or
AF_INET6.  In fact, inet_ntop currently supports AF_INET and AF_INET6
only, so I wouldn't bother invoking inet_ntop with any other address
family argument.


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