1
0
mirror of https://github.com/mfontanini/libtins synced 2026-01-27 04:11:35 +01:00

Fixed bug on TCPStream when duplicate packets are sniffed.

This commit is contained in:
Matias Fontanini
2012-09-11 00:02:58 -03:00
parent e945ced307
commit b977697367
2 changed files with 54 additions and 31 deletions

View File

@@ -43,7 +43,8 @@ TCPStream::StreamInfo::StreamInfo(IPv4Address client,
TCPStream::TCPStream(IP *ip, TCP *tcp, uint64_t identifier)
: client_seq(tcp->seq()), info(ip->src_addr(), ip->dst_addr(),
tcp->sport(), tcp->dport()), identifier(identifier), fin_sent(false)
tcp->sport(), tcp->dport()), identifier(identifier),
syn_ack_sent(false), fin_sent(false)
{
}
@@ -57,6 +58,7 @@ TCPStream& TCPStream::operator=(const TCPStream &rhs) {
server_seq = rhs.server_seq;
info = rhs.info;
identifier = rhs.identifier;
syn_ack_sent = rhs.syn_ack_sent;
fin_sent = rhs.fin_sent;
client_payload_ = rhs.client_payload_;
server_payload_ = rhs.server_payload_;
@@ -85,23 +87,20 @@ TCPStream::fragments_type TCPStream::clone_fragments(const fragments_type &frags
bool TCPStream::generic_process(uint32_t &my_seq, uint32_t &other_seq,
payload_type &pload, fragments_type &frags, TCP *tcp, RawPDU *raw)
{
//std::cout << "Entre, my seq: " << std::hex << my_seq << std::endl;
bool added_some(false);
if(tcp->get_flag(TCP::SYN))
other_seq++;
if(tcp->get_flag(TCP::FIN) || tcp->get_flag(TCP::RST))
fin_sent = true;
if(raw) {
if(raw && tcp->seq() >= my_seq) {
frags[tcp->seq()] = static_cast<RawPDU*>(tcp->release_inner_pdu());
fragments_type::iterator it = frags.begin();
while(it != frags.end() && it->first == my_seq) {
//std::cout << "Consumo: " << my_seq << std::endl;
pload.insert(
pload.end(),
it->second->payload().begin(),
it->second->payload().end()
);
//std::cout << "This size: " << it->second->payload_size() << std::endl;
my_seq += it->second->payload_size();
delete it->second;
frags.erase(it);
@@ -114,20 +113,32 @@ bool TCPStream::generic_process(uint32_t &my_seq, uint32_t &other_seq,
bool TCPStream::update(IP *ip, TCP *tcp) {
RawPDU *raw = tcp->find_pdu<RawPDU>();
if(tcp->get_flag(TCP::SYN) && tcp->get_flag(TCP::ACK)) {
if(!syn_ack_sent && tcp->get_flag(TCP::SYN) && tcp->get_flag(TCP::ACK)) {
server_seq = tcp->seq() + 1;
syn_ack_sent = true;
return false;
}
else {
if(ip->src_addr() == info.client_addr)
return generic_process(client_seq, server_seq, client_payload_, client_frags, tcp, raw);
else
return generic_process(server_seq, client_seq, server_payload_, server_frags, tcp, raw);
}
}
bool TCPStream::StreamInfo::operator<(const StreamInfo &rhs) const {
if(client_addr == rhs.client_addr) {
if(server_addr == rhs.server_addr) {
if(client_port == rhs.client_port) {
return server_port < rhs.server_port;
}
else
return client_port < rhs.client_port;
}
else
return server_addr < rhs.server_addr;
}
if(ip->src_addr() == info.client_addr)
return generic_process(client_seq, server_seq, client_payload_, client_frags, tcp, raw);
else
return generic_process(server_seq, client_seq, server_payload_, server_frags, tcp, raw);
}
void TCPStream::clear_client_payload() {
client_payload_.clear();
}
void TCPStream::clear_server_payload() {
server_payload_.clear();
return client_addr < rhs.client_addr;
}
}