diff options
author | Eugene Syromyatnikov <evgsyr@gmail.com> | 2021-12-12 22:40:21 +0100 |
---|---|---|
committer | Eugene Syromyatnikov <evgsyr@gmail.com> | 2021-12-13 13:23:54 +0100 |
commit | 4e8c1a61ce656d294c65f6d927e042b67daea96b (patch) | |
tree | 4df6b6218ea2ebeaf10096ab275f8b8869f5fc33 | |
parent | 44fd312d428f741c93064dfe8572d86ca26ee326 (diff) | |
download | strace-4e8c1a61ce656d294c65f6d927e042b67daea96b.tar.gz |
net: update PACKET_{ADD,DROP}_MEMBERSHIP socket option decoder
-rw-r--r-- | src/net.c | 37 |
1 files changed, 22 insertions, 15 deletions
@@ -1509,23 +1509,30 @@ print_tpacket_req(struct tcb *const tcp, const kernel_ulong_t addr, const int le static void print_packet_mreq(struct tcb *const tcp, const kernel_ulong_t addr, const int len) { - struct packet_mreq mreq; - - if (len != sizeof(mreq) || - umove(tcp, addr, &mreq) < 0) { + struct packet_mreq_max { + int mr_ifindex; + unsigned short mr_type; + unsigned short mr_alen; + unsigned char mr_address[MAX_ADDR_LEN]; + } mreq; + + if (len < sizeof(struct packet_mreq) || + umoven(tcp, addr, MIN(len, sizeof(mreq)), &mreq) < 0) { printaddr(addr); - } else { - tprint_struct_begin(); - PRINT_FIELD_IFINDEX(mreq, mr_ifindex); - tprint_struct_next(); - PRINT_FIELD_XVAL(mreq, mr_type, packet_mreq_type, - "PACKET_MR_???"); - tprint_struct_next(); - PRINT_FIELD_U(mreq, mr_alen); - tprint_struct_next(); - PRINT_FIELD_MAC_SZ(mreq, mr_address, mreq.mr_alen); - tprint_struct_end(); + return; } + + MAYBE_PRINT_FIELD_LEN(tprint_struct_begin(), + mreq, mr_ifindex, PRINT_FIELD_IFINDEX); + MAYBE_PRINT_FIELD_LEN(tprint_struct_next(), + mreq, mr_type, PRINT_FIELD_XVAL, + packet_mreq_type, "PACKET_MR_???"); + MAYBE_PRINT_FIELD_LEN(tprint_struct_next(), + mreq, mr_alen, PRINT_FIELD_U); + MAYBE_PRINT_FIELD_LEN(tprint_struct_next(), + mreq, mr_address, PRINT_FIELD_MAC_SZ, + MIN(mreq.mr_alen, sizeof(mreq.mr_alen))); + tprint_struct_end(); } static void |