aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorVitaly Lavrov <vel21ripn@gmail.com>2021-07-16 11:53:36 +0000
committerGitHub <noreply@github.com>2021-07-16 13:53:36 +0200
commit295cb3ee6a4029a86482dbc84ea4f49efa58405e (patch)
tree3858f61a9ede590f7095666a54b3bbe033b0a044 /src/lib
parent488166833eb233321ac3cb3b4f929ea5eeaf65ca (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.c61
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 {