diff --git a/BufferCore.cpp b/BufferCore.cpp index e1bfb4f..86c1967 100644 --- a/BufferCore.cpp +++ b/BufferCore.cpp @@ -26,8 +26,10 @@ CRollingBuffer::CRollingBuffer( int BufferSize ) : BufSize( BufferSize ) { // Create Buffer Buffer = (char *)malloc( BufSize+1 ); + memset( Buffer, 0, BufSize+1 ); + + // Create temp output buffer big enough to handle all data OutBuffer = (char *)malloc( BufSize+1 ); - OutBuffer[0] = 0; } else { // No buffers created @@ -77,7 +79,7 @@ char CRollingBuffer::PeekChar( int Pos ) char CharValue = 0; // Validate buffer and Pos - if (!BufLen || (Pos < 0) || (Pos > BufLen)) { + if (!BufSize || (Pos < 0) || (Pos > BufLen)) { return 0; } @@ -103,7 +105,7 @@ int CRollingBuffer::PeekDirect( char ** Data, int PeekPos ) int StartPos = 0; // Validate - if (!BufLen || !Data || (PeekPos >= BufLen)) { + if (!BufSize || !Data || (PeekPos > BufLen)) { *Data = NULL; return 0; } @@ -133,7 +135,7 @@ int CRollingBuffer::Peek( char ** Data, int PeekPos, int MaxLen ) int StartPos = 0; // Validate - if (!BufLen || !*Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) { + if (!BufSize || !Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) { *Data = NULL; return 0; } @@ -178,7 +180,7 @@ int CRollingBuffer::PeekCopy( char ** Data, int PeekPos, int MaxLen ) int StartPos = 0; // Check if any data - if (!BufLen || !*Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) { + if (!BufSize || !Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) { if (*Data) (*Data)[0] = 0; return 0; } @@ -224,7 +226,7 @@ bool CRollingBuffer::FindStr( const char * SearchStr, int SearchLen, int &FoundP char * MatchLimit = NULL; // Check if buffer exists - if (!BufLen || !SearchStr || !SearchLen) { + if (!BufSize || !SearchStr || !SearchLen) { FoundPos = -1; return false; } @@ -251,7 +253,7 @@ bool CRollingBuffer::FindStr( const char * SearchStr, int SearchLen, int &FoundP if (*CheckPos == *MatchPos) { if (MatchPos == MatchLimit) { // Full match found - FoundPos -= SearchLen; + FoundPos -= SearchLen-1; return true; } else { @@ -326,7 +328,7 @@ int CRollingBuffer::Push( bool Overwrite, const char * Data, int Len ) DataRemain = (!Overwrite && (Len > BufSize-BufLen))? BufSize-BufLen : Len; // Read Data into buffer - while (TotalPushed < Len) + while (DataRemain) { // Read from file descriptor BufRemain = BufSize - BufEnd; @@ -362,7 +364,7 @@ int CRollingBuffer::Pop( char ** Data, int MaxLen ) int BytesWritten = 0; // Read & clear data - BytesWritten = Peek( Data, MaxLen ); + BytesWritten = Peek( Data, 0, MaxLen ); Clear( BytesWritten ); // Return temp buffer @@ -377,7 +379,7 @@ int CRollingBuffer::PopCopy( char ** Data, int MaxLen ) int BytesWritten = 0; // Copy & clear data - BytesWritten = PeekCopy( Data, MaxLen ); + BytesWritten = PeekCopy( Data, 0, MaxLen ); Clear( BytesWritten ); // Return temp buffer @@ -486,6 +488,7 @@ CShiftBuffer::CShiftBuffer( int BufferSize ) : BufSize( BufferSize ) Buffer = (char *)malloc( BufSize+1 ); Buffer[0] = 0; + // Create temp output buffer big enough to handle all data OutBuffer = (char *)malloc( BufSize+1 ); } else { @@ -529,7 +532,7 @@ int CShiftBuffer::Reset() char CShiftBuffer::PeekChar( int Pos ) { // Validate buffer and Pos - if (!BufLen || (Pos < 0) || (Pos > BufLen)) { + if (!BufSize || (Pos < 0) || (Pos > BufLen)) { return 0; } @@ -543,7 +546,7 @@ char CShiftBuffer::PeekChar( int Pos ) int CShiftBuffer::PeekDirect( char ** Data, int PeekPos ) { // Validate - if (!BufLen || !Data || (PeekPos >= BufLen)) { + if (!BufSize || !Data || (PeekPos > BufLen)) { *Data = NULL; return 0; } @@ -560,7 +563,7 @@ int CShiftBuffer::Peek( char ** Data, int PeekPos, int MaxLen ) int BytesReturned = 0; // Validate - if (!BufLen || !Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) { + if (!BufSize || !Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) { *Data = NULL; return 0; } @@ -572,7 +575,7 @@ int CShiftBuffer::Peek( char ** Data, int PeekPos, int MaxLen ) BytesReturned = (MaxLen > BufLen - PeekPos)? (BufLen - PeekPos) : MaxLen; // Copy Data from Buffer - memcpy( OutBuffer, Buffer, BytesReturned ); + memcpy( OutBuffer, &Buffer[PeekPos], BytesReturned ); OutBuffer[BytesReturned] = 0; // Return Temp buffer @@ -589,7 +592,7 @@ int CShiftBuffer::PeekCopy( char ** Data, int PeekPos, int MaxLen ) int StartPos = 0; // Check if any data - if (!BufLen || !Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) { + if (!BufSize || !Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) { if (*Data) (*Data)[0] = 0; return 0; } @@ -621,7 +624,7 @@ bool CShiftBuffer::FindStr( const char * SearchStr, int SearchLen, int &FoundPos char * MatchLimit = NULL; // Check if buffer exists - if (!BufLen || !SearchStr || !SearchLen) { + if (!BufSize || !SearchStr || !SearchLen) { FoundPos = -1; return false; } @@ -648,7 +651,7 @@ bool CShiftBuffer::FindStr( const char * SearchStr, int SearchLen, int &FoundPos if (*CheckPos == *MatchPos) { if (MatchPos == MatchLimit) { // Full match found - FoundPos -= SearchLen; + FoundPos -= SearchLen-1; return true; } else { @@ -692,7 +695,7 @@ int CShiftBuffer::Clear( int ClearLen ) else { // Shift remaining data BytesCleared = ClearLen; - memcpy( Buffer, &Buffer[ClearLen], BufLen-ClearLen ); // Shift remaining old data left + memmove( Buffer, &Buffer[ClearLen], BufLen-ClearLen ); // Shift remaining old data left BufLen -= ClearLen; Buffer[BufLen] = 0; } @@ -756,7 +759,7 @@ int CShiftBuffer::Pop( char ** Data, int MaxLen ) int BytesWritten = 0; // Read and clear bytes - BytesWritten = Peek( Data, MaxLen ); + BytesWritten = Peek( Data, 0, MaxLen ); Clear( BytesWritten ); return BytesWritten; @@ -770,7 +773,7 @@ int CShiftBuffer::PopCopy( char ** Data, int MaxLen ) int BytesWritten = 0; // Copy and clear bytes - BytesWritten = PeekCopy( Data, MaxLen ); + BytesWritten = PeekCopy( Data, 0, MaxLen ); Clear( BytesWritten ); // Return temp buffer diff --git a/BufferCore.h b/BufferCore.h index c8415a5..b38b25e 100644 --- a/BufferCore.h +++ b/BufferCore.h @@ -53,7 +53,7 @@ private: public: // Life Cycle CRollingBuffer( int BufferSize ); - virtual ~CRollingBuffer(); + ~CRollingBuffer(); // Direct Operations int Reset(); // Clear buffer and reset all pointers to start of buffer @@ -67,15 +67,15 @@ public: bool FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos = 0 ); // Search buffer directly // Change data on buffer - virtual int Push( bool Overwrite, const char * Data, int Len = -1 ); - virtual int Clear( int ClearLen = -1 ); + int Push( bool Overwrite, const char * Data, int Len = -1 ); + int Clear( int ClearLen = -1 ); - virtual int Pop( char ** Data, int MaxLen = -1 ); - virtual int PopCopy( char ** Data, int MaxLen = -1 ); + int Pop( char ** Data, int MaxLen = -1 ); + int PopCopy( char ** Data, int MaxLen = -1 ); // File operations - virtual int ReadFromFD( int Handle, int MaxRead = -1, bool Overwrite = false ); - virtual int WriteToFD( int Handle, int MaxWrite = -1 ); + int ReadFromFD( int Handle, int MaxRead = -1, bool Overwrite = false ); + int WriteToFD( int Handle, int MaxWrite = -1 ); // Miscellaneous int Size() { return BufSize; }; @@ -97,7 +97,7 @@ private: public: // Life Cycle CShiftBuffer( int BufferSize ); - virtual ~CShiftBuffer(); + ~CShiftBuffer(); // Direct Operations int Reset(); // Clear buffer and reset all pointers to start of buffer @@ -110,16 +110,16 @@ public: bool FindStr( const char * SearchStr, int SearchLen, int &FoundPos, int StartPos = 0 ); // Search buffer directly - // Chagne data on buffer - virtual int Push( bool Overwrite, const char * Data, int Len = -1 ); - virtual int Clear( int ClearLen = -1 ); + // Change data on buffer + int Push( bool Overwrite, const char * Data, int Len = -1 ); + int Clear( int ClearLen = -1 ); - virtual int Pop( char ** Data, int MaxLen = -1 ); - virtual int PopCopy( char ** Data, int MaxLen = -1 ); + int Pop( char ** Data, int MaxLen = -1 ); + int PopCopy( char ** Data, int MaxLen = -1 ); // File operations - virtual int ReadFromFD( int Handle, int MaxRead = -1 ); - virtual int WriteToFD( int Handle, int MaxWrite = -1 ); + int ReadFromFD( int Handle, int MaxRead = -1 ); + int WriteToFD( int Handle, int MaxWrite = -1 ); // Miscellaneous int Size() { return BufSize; }; diff --git a/SelectableCore.cpp b/SelectableCore.cpp index 55a6462..f723b58 100644 --- a/SelectableCore.cpp +++ b/SelectableCore.cpp @@ -1060,7 +1060,7 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force ) while (Handle->InBuffer->FindStr( Handle->InMarker, Handle->InMarkerLen, Pos )) { // Show Packet - Len = Handle->InBuffer->Peek( &Data, 0, Pos+Handle->InMarkerLen+1 ); + Len = Handle->InBuffer->Peek( &Data, 0, Pos+Handle->InMarkerLen ); if (Log) Log->Output( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Handle '%s' - IN-M:", Name, Handle->Name ); // Write buffer to Outputs