2017-06-09 23:06:42 +00:00
/*
* Copyright ( c ) 2016 Fabien Siron < fabien . siron @ epita . fr >
* Copyright ( c ) 2017 JingPiao Chen < chenjingpiao @ gmail . com >
2018-10-30 08:09:10 +00:00
* Copyright ( c ) 2017 - 2018 The strace developers .
2017-06-09 23:06:42 +00:00
* All rights reserved .
*
2018-12-10 00:00:00 +00:00
* SPDX - License - Identifier : LGPL - 2.1 - or - later
2017-06-09 23:06:42 +00:00
*/
# include "defs.h"
2017-06-22 00:24:22 +08:00
# include "netlink.h"
2017-07-19 10:07:34 +00:00
# include "netlink_sock_diag.h"
2017-06-10 22:07:54 +00:00
2018-08-19 10:43:47 +02:00
# define XLAT_MACROS_ONLY
# include "xlat/addrfams.h"
# undef XLAT_MACROS_ONLY
2017-06-09 23:06:42 +00:00
static void
decode_family ( struct tcb * const tcp , const uint8_t family ,
Adjust prototypes of netlink parsing functions
Change the type of "len" argument that is based
on struct nlmsghdr.nlmsg_len from kernel_ulong_t to unsigned int.
* defs.h (netlink_decoder_t, DECL_NETLINK): Change "len" argument type
from kernel_ulong_t to unsigned int.
* netlink.c (decode_nlmsgerr_attr_cookie, decode_nlmsgerr,
decode_payload): Likewise.
* netlink_selinux.c (decode_netlink_selinux): Likewise.
* netlink_sock_diag.c (decode_family, decode_unix_diag_req,
decode_meminfo, decode_unix_diag_vfs, decode_unix_diag_inode,
decode_unix_diag_rqlen, decode_unix_diag_msg, decode_netlink_diag_req,
print_group, decode_netlink_diag_ring, decode_netlink_diag_flags,
decode_netlink_diag_msg, decode_packet_diag_req,
decode_packet_diag_info, decode_packet_diag_mclist,
decode_packet_diag_ring, decode_packet_diag_filter,
decode_packet_diag_msg, decode_inet_addr, decode_inet_diag_hostcond,
decode_inet_diag_markcond, decode_bytecode_data, decode_inet_diag_bc_op,
decode_inet_diag_req_compat, decode_inet_diag_req_v2,
decode_inet_diag_req, decode_inet_diag_meminfo, decode_tcpvegas_info,
decode_tcp_dctcp_info, decode_tcp_bbr_info, decode_inet_diag_msg,
decode_smc_diag_req, decode_smc_diag_conninfo, decode_smc_diag_lgrinfo,
decode_smc_diag_msg, netlink_diag_decoder_t, decode_netlink_sock_diag):
Likewise.
* nlattr.c (fetch_nlattr, decode_nlattr_with_data, decode_nlattr,
decode_nla_str, decode_nla_strn, DECODE_NLA_INTEGER): Likewise.
* nlattr.h (nla_decoder_t, DECL_NLA, decode_nlattr): Likewise.
2017-07-19 10:07:34 +00:00
const kernel_ulong_t addr , const unsigned int len )
2017-06-09 23:06:42 +00:00
{
tprints ( " {family= " ) ;
printxval ( addrfams , family , " AF_??? " ) ;
if ( len > sizeof ( family ) ) {
tprints ( " , " ) ;
2017-07-07 09:52:06 +08:00
printstr_ex ( tcp , addr + sizeof ( family ) ,
len - sizeof ( family ) , QUOTE_FORCE_HEX ) ;
2017-06-09 23:06:42 +00:00
}
tprints ( " } " ) ;
}
2017-07-19 10:07:34 +00:00
typedef DECL_NETLINK_DIAG_DECODER ( ( * netlink_diag_decoder_t ) ) ;
2017-06-10 22:07:54 +00:00
static const struct {
const netlink_diag_decoder_t request , response ;
} diag_decoders [ ] = {
2018-08-19 10:43:47 +02:00
[ AF_UNIX ] = { decode_unix_diag_req , decode_unix_diag_msg } ,
2017-06-13 12:43:31 +08:00
[ AF_INET ] = { decode_inet_diag_req , decode_inet_diag_msg } ,
[ AF_INET6 ] = { decode_inet_diag_req , decode_inet_diag_msg } ,
2017-06-13 10:32:55 +08:00
[ AF_NETLINK ] = { decode_netlink_diag_req , decode_netlink_diag_msg } ,
2017-06-13 11:50:15 +08:00
[ AF_PACKET ] = { decode_packet_diag_req , decode_packet_diag_msg } ,
2017-06-13 13:38:27 +08:00
[ AF_SMC ] = { decode_smc_diag_req , decode_smc_diag_msg } ,
2017-06-10 22:07:54 +00:00
} ;
2017-06-09 23:06:42 +00:00
bool
decode_netlink_sock_diag ( struct tcb * const tcp ,
const struct nlmsghdr * const nlmsghdr ,
const kernel_ulong_t addr ,
Adjust prototypes of netlink parsing functions
Change the type of "len" argument that is based
on struct nlmsghdr.nlmsg_len from kernel_ulong_t to unsigned int.
* defs.h (netlink_decoder_t, DECL_NETLINK): Change "len" argument type
from kernel_ulong_t to unsigned int.
* netlink.c (decode_nlmsgerr_attr_cookie, decode_nlmsgerr,
decode_payload): Likewise.
* netlink_selinux.c (decode_netlink_selinux): Likewise.
* netlink_sock_diag.c (decode_family, decode_unix_diag_req,
decode_meminfo, decode_unix_diag_vfs, decode_unix_diag_inode,
decode_unix_diag_rqlen, decode_unix_diag_msg, decode_netlink_diag_req,
print_group, decode_netlink_diag_ring, decode_netlink_diag_flags,
decode_netlink_diag_msg, decode_packet_diag_req,
decode_packet_diag_info, decode_packet_diag_mclist,
decode_packet_diag_ring, decode_packet_diag_filter,
decode_packet_diag_msg, decode_inet_addr, decode_inet_diag_hostcond,
decode_inet_diag_markcond, decode_bytecode_data, decode_inet_diag_bc_op,
decode_inet_diag_req_compat, decode_inet_diag_req_v2,
decode_inet_diag_req, decode_inet_diag_meminfo, decode_tcpvegas_info,
decode_tcp_dctcp_info, decode_tcp_bbr_info, decode_inet_diag_msg,
decode_smc_diag_req, decode_smc_diag_conninfo, decode_smc_diag_lgrinfo,
decode_smc_diag_msg, netlink_diag_decoder_t, decode_netlink_sock_diag):
Likewise.
* nlattr.c (fetch_nlattr, decode_nlattr_with_data, decode_nlattr,
decode_nla_str, decode_nla_strn, DECODE_NLA_INTEGER): Likewise.
* nlattr.h (nla_decoder_t, DECL_NLA, decode_nlattr): Likewise.
2017-07-19 10:07:34 +00:00
const unsigned int len )
2017-06-09 23:06:42 +00:00
{
uint8_t family ;
2017-06-27 16:16:56 +08:00
if ( nlmsghdr - > nlmsg_type = = NLMSG_DONE )
return false ;
2017-06-10 22:07:54 +00:00
if ( ! umove_or_printaddr ( tcp , addr , & family ) ) {
if ( family < ARRAY_SIZE ( diag_decoders )
& & len > sizeof ( family ) ) {
const netlink_diag_decoder_t decoder =
( nlmsghdr - > nlmsg_flags & NLM_F_REQUEST )
? diag_decoders [ family ] . request
: diag_decoders [ family ] . response ;
if ( decoder ) {
decoder ( tcp , nlmsghdr , family , addr , len ) ;
return true ;
}
}
2017-06-09 23:06:42 +00:00
decode_family ( tcp , family , addr , len ) ;
2017-06-10 22:07:54 +00:00
}
2017-06-09 23:06:42 +00:00
return true ;
}