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 >
* Copyright ( c ) 2017 The strace developers .
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# 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
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 [ ] = {
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
# ifdef AF_SMC
[ AF_SMC ] = { decode_smc_diag_req , decode_smc_diag_msg } ,
# endif
2017-06-10 22:07:54 +00:00
[ AF_UNIX ] = { decode_unix_diag_req , decode_unix_diag_msg }
} ;
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 ;
}