diff options
author | Vitaly Lavrov <vel21ripn@gmail.com> | 2021-07-16 11:53:36 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-16 13:53:36 +0200 |
commit | 295cb3ee6a4029a86482dbc84ea4f49efa58405e (patch) | |
tree | 3858f61a9ede590f7095666a54b3bbe033b0a044 /src/lib | |
parent | 488166833eb233321ac3cb3b4f929ea5eeaf65ca (diff) |
Bug fix. (#1250)
Restore part of the fields flow->packet after cleaning flow structure.
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/ndpi_main.c | 61 |
1 files changed, 49 insertions, 12 deletions
diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c index 09af06680..fbade2547 100644 --- a/src/lib/ndpi_main.c +++ b/src/lib/ndpi_main.c @@ -4245,27 +4245,64 @@ static int ndpi_init_packet_header(struct ndpi_detection_module_struct *ndpi_str if(flow->packet.tcp->syn != 0 && flow->packet.tcp->ack == 0 && flow->init_finished != 0 && flow->detected_protocol_stack[0] == NDPI_PROTOCOL_UNKNOWN) { - u_int8_t backup; - u_int16_t backup1, backup2; + u_int16_t guessed_protocol_id, guessed_host_protocol_id; u_int16_t packet_direction_counter[2]; + u_int8_t num_processed_pkts; + struct packet_save { + const struct ndpi_iphdr *iph; + const struct ndpi_ipv6hdr *iphv6; + const u_int8_t *payload; + u_int64_t current_time_ms; + u_int16_t l3_packet_len; + u_int16_t l4_packet_len; + u_int16_t payload_packet_len; + u_int16_t actual_payload_len; + u_int8_t l4_protocol; + } packet; + +#define flow_save(a) a = flow->a +#define flow_restore(a) flow->a = a + + flow_save(packet_direction_counter[0]); + flow_save(packet_direction_counter[1]); + flow_save(num_processed_pkts); + flow_save(guessed_protocol_id); + flow_save(guessed_host_protocol_id); + flow_save(packet.iph); + flow_save(packet.iphv6); + flow_save(packet.payload); + flow_save(packet.current_time_ms); + flow_save(packet.l3_packet_len); + flow_save(packet.l4_packet_len); + flow_save(packet.payload_packet_len); + flow_save(packet.actual_payload_len); + flow_save(packet.l4_protocol); - packet_direction_counter[0] = flow->packet_direction_counter[0]; - packet_direction_counter[1] = flow->packet_direction_counter[1]; - backup = flow->num_processed_pkts; - backup1 = flow->guessed_protocol_id; - backup2 = flow->guessed_host_protocol_id; ndpi_free_flow_data(flow); memset(flow, 0, sizeof(*(flow))); /* Restore pointers */ - flow->packet_direction_counter[0] = packet_direction_counter[0]; - flow->packet_direction_counter[1] = packet_direction_counter[1]; - flow->num_processed_pkts = backup; - flow->guessed_protocol_id = backup1; - flow->guessed_host_protocol_id = backup2; flow->packet.tcp = (struct ndpi_tcphdr *) l4ptr; flow->l4_proto = IPPROTO_TCP; + flow_restore(packet_direction_counter[0]); + flow_restore(packet_direction_counter[1]); + flow_restore(num_processed_pkts); + flow_restore(guessed_protocol_id); + flow_restore(guessed_host_protocol_id); + flow_restore(packet.iph); + flow_restore(packet.iphv6); + flow_restore(packet.payload); + flow_restore(packet.current_time_ms); + flow_restore(packet.l3_packet_len); + flow_restore(packet.l4_packet_len); + flow_restore(packet.payload_packet_len); + flow_restore(packet.actual_payload_len); + flow_restore(packet.l4_protocol); + +#undef flow_save +#undef flow_restore + NDPI_LOG_DBG(ndpi_str, "tcp syn packet for unknown protocol, reset detection state\n"); } } else { |