Refactor Analyzer::AddChildAnalyzer and usages.

Make feedback available regarding whether adding a child analyzer fails
because one of the same type already exists (so one can avoid invalid
pointer access of a delete'd analyzer).
This commit is contained in:
Jon Siwek 2013-09-16 16:14:01 -05:00
parent bb8f102b2c
commit a3b963ad4e
4 changed files with 19 additions and 15 deletions

View file

@ -378,13 +378,13 @@ void Analyzer::ForwardEndOfData(bool orig)
AppendNewChildren();
}
void Analyzer::AddChildAnalyzer(Analyzer* analyzer, bool init)
bool Analyzer::AddChildAnalyzer(Analyzer* analyzer, bool init)
{
if ( HasChildAnalyzer(analyzer->GetAnalyzerTag()) )
{
analyzer->Done();
delete analyzer;
return;
return false;
}
// We add new children to new_children first. They are then
@ -401,6 +401,7 @@ void Analyzer::AddChildAnalyzer(Analyzer* analyzer, bool init)
DBG_LOG(DBG_ANALYZER, "%s added child %s",
fmt_analyzer(this).c_str(), fmt_analyzer(analyzer).c_str());
return true;
}
Analyzer* Analyzer::AddChildAnalyzer(Tag analyzer)
@ -409,9 +410,7 @@ Analyzer* Analyzer::AddChildAnalyzer(Tag analyzer)
{
Analyzer* a = analyzer_mgr->InstantiateAnalyzer(analyzer, conn);
if ( a )
AddChildAnalyzer(a);
if ( a && AddChildAnalyzer(a) )
return a;
}

View file

@ -353,9 +353,10 @@ public:
* discarded.
*
* @param analyzer The ananlyzer to add. Takes ownership.
* @return false if analyzer type was already a child, else true.
*/
void AddChildAnalyzer(Analyzer* analyzer)
{ AddChildAnalyzer(analyzer, true); }
bool AddChildAnalyzer(Analyzer* analyzer)
{ return AddChildAnalyzer(analyzer, true); }
/**
* Adds a new child analyzer to the analyzer tree. If an analyzer of
@ -363,6 +364,7 @@ public:
* discarded.
*
* @param tag The type of analyzer to add.
* @return the new analyzer instance that was added.
*/
Analyzer* AddChildAnalyzer(Tag tag);
@ -600,8 +602,9 @@ protected:
* @param analyzer The analyzer to add. Takes ownership.
*
* @param init If true, Init() will be calle.d
* @return false if analyzer type was already a child, else true.
*/
void AddChildAnalyzer(Analyzer* analyzer, bool init);
bool AddChildAnalyzer(Analyzer* analyzer, bool init);
/**
* Inits all child analyzers. This is an internal method.

View file

@ -137,10 +137,8 @@ int Gnutella_Analyzer::IsHTTP(string header)
analyzer::Analyzer* a = analyzer_mgr->InstantiateAnalyzer("HTTP", Conn());
if ( a )
if ( a && Parent()->AddChildAnalyzer(a) )
{
Parent()->AddChildAnalyzer(a);
if ( Parent()->IsAnalyzer("TCP") )
{
// Replay buffered data.

View file

@ -62,10 +62,14 @@ void SOCKS_Analyzer::DeliverStream(int len, const u_char* data, bool orig)
if ( ! pia )
{
pia = new pia::PIA_TCP(Conn());
AddChildAnalyzer(pia);
if ( AddChildAnalyzer(pia) )
{
pia->FirstPacket(true, 0);
pia->FirstPacket(false, 0);
}
else
pia = 0;
}
ForwardStream(len, data, orig);
}