From 8933ec1ae608fe002a82f67c64571566f619d4b4 Mon Sep 17 00:00:00 2001 From: Charl Wentzel Date: Wed, 12 Jul 2017 06:19:06 +0200 Subject: [PATCH] Important Update: - FunctionCore: - Fix Memory Leaks: - Recreate Name in LoadConfig() - Setting FirstChannel to NULL in LoadConfig() - Fix fault on empty Log/Output in LoadConfig() - Check if Log/Level exists in LoadConfig() - Do not auto-create all config parameters - SelectableCore: - Fix Memory Leaks: - Setting FirstHandle to NULL in LoadConfig() - Do not auto-create all config parameters - Update logs to specifically refer to "TCP" server/client --- FunctionCore.cpp | 49 +++++++++++++++++++++--------------------- SelectableCore.cpp | 53 +++++++++++++++++++++++----------------------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/FunctionCore.cpp b/FunctionCore.cpp index c485cbe..cab76f5 100644 --- a/FunctionCore.cpp +++ b/FunctionCore.cpp @@ -127,37 +127,39 @@ bool CFunctionCore::LoadConfigData() TDataMember * TempMember; char * TempStr; - // Set Name - Name = (char*)malloc( strlen(BaseMember->Name)+1 ); - strcpy( Name, BaseMember->Name ); - // Get debug level LogLevel = dlNone; TempStr = (char*)DataTree->GetStr( BaseMember, "Log/Level", "Medium", true ); - if (!strcasecmp( TempStr, "Low" )) - LogLevel = dlLow; - else if (!strcasecmp( TempStr, "Medium" )) - LogLevel = dlMedium; - else if (!strcasecmp( TempStr, "High" )) - LogLevel = dlHigh; + if (TempStr) + { + if (!strcasecmp( TempStr, "Low" )) + LogLevel = dlLow; + else if (!strcasecmp( TempStr, "Medium" )) + LogLevel = dlMedium; + else if (!strcasecmp( TempStr, "High" )) + LogLevel = dlHigh; + } // Set debug output LogOutput = 0; TempMember = DataTree->GetMember( BaseMember, "Log/Output[0]", true ); while (TempMember) { - if (!strcasecmp( TempMember->Value, "Normal")) - LogOutput |= OUT_NORMAL; - else if (!strcasecmp( TempMember->Value, "Bin")) - LogOutput |= OUT_BIN; - else if (!strcasecmp( TempMember->Value, "Hex")) - LogOutput |= OUT_HEX; - else if (!strcasecmp( TempMember->Value, "Count")) - LogOutput |= OUT_COUNT; - else if (!strcasecmp( TempMember->Value, "AsIs")) - LogOutput |= OUT_ASIS; - else if (!strcasecmp( TempMember->Value, "CRLF")) - LogOutput |= OUT_CRLF; + if (TempMember->Value) + { + if (!strcasecmp( TempMember->Value, "Normal")) + LogOutput |= OUT_NORMAL; + else if (!strcasecmp( TempMember->Value, "Bin")) + LogOutput |= OUT_BIN; + else if (!strcasecmp( TempMember->Value, "Hex")) + LogOutput |= OUT_HEX; + else if (!strcasecmp( TempMember->Value, "Count")) + LogOutput |= OUT_COUNT; + else if (!strcasecmp( TempMember->Value, "AsIs")) + LogOutput |= OUT_ASIS; + else if (!strcasecmp( TempMember->Value, "CRLF")) + LogOutput |= OUT_CRLF; + } // Next TempMember = DataTree->GetNextChild( TempMember ); @@ -167,8 +169,7 @@ bool CFunctionCore::LoadConfigData() InitLogging( LogLevel, LogOutput ); // Set debug output - FirstChannel = NULL; - TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Channels", true ) ); + TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Channels" ) ); while (TempMember) { AddChannel( DataTree->GetStr( TempMember, "Name" ), diff --git a/SelectableCore.cpp b/SelectableCore.cpp index 455c9a0..3dc9c95 100644 --- a/SelectableCore.cpp +++ b/SelectableCore.cpp @@ -74,7 +74,6 @@ bool CSelectableCore::LoadConfigData() CFunctionCore::LoadConfigData(); // Set debug output - FirstHandle = NULL; TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Handles", true ) ); while (TempMember) { @@ -85,8 +84,8 @@ bool CSelectableCore::LoadConfigData() Type = (char*)DataTree->GetStr( TempMember, "Type", "TCPclient", true ); if (!strcasecmp( Type, "Port" )) { - Address = (char*)DataTree->GetStr( TempMember, "Port/Address", NULL, true ); // Get default value - if ((Name = (char*)DataTree->GetStr( TempMember, "Port/Name", NULL, true ))) { + Address = (char*)DataTree->GetStr( TempMember, "Port/Address", NULL ); // Get default value + if ((Name = (char*)DataTree->GetStr( TempMember, "Port/Name", NULL ))) { sprintf( Path, "Address/%s/Address", Name ); Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get address list value } @@ -94,9 +93,9 @@ bool CSelectableCore::LoadConfigData() } else if (!strcasecmp( Type, "TCPserver" )) { - Address = (char*)DataTree->GetStr( TempMember, "Socket/Address", NULL, true ); // Get default Address value + Address = (char*)DataTree->GetStr( TempMember, "Socket/Address", NULL ); // Get default Address value Port = DataTree->GetInt( TempMember, "Socket/Port", 0, true ); // Get default Port value - if ((Name = (char*)DataTree->GetStr( TempMember, "Socket/Name", NULL, true ))) { + if ((Name = (char*)DataTree->GetStr( TempMember, "Socket/Name", NULL ))) { sprintf( Path, "Address/%s/Address", Name ); Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get AddressList Address value sprintf( Path, "Address/%s/Port", Name ); @@ -106,9 +105,9 @@ bool CSelectableCore::LoadConfigData() } else if (!strcasecmp( Type, "TCPclient" )) { - Address = (char*)DataTree->GetStr( TempMember, "Socket/Address", NULL, true ); // Get default Address value + Address = (char*)DataTree->GetStr( TempMember, "Socket/Address", NULL ); // Get default Address value Port = DataTree->GetInt( TempMember, "Socket/Port", 0, true ); // Get default Port value - if ((Name = (char*)DataTree->GetStr( TempMember, "Socket/Name", NULL, true ))) { + if ((Name = (char*)DataTree->GetStr( TempMember, "Socket/Name", NULL ))) { sprintf( Path, "Address/%s/Address", Name ); Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get AddressList Address value sprintf( Path, "Address/%s/Port", Name ); @@ -126,11 +125,11 @@ bool CSelectableCore::LoadConfigData() DataTree->GetInt( TempMember, "AutoManage/ReopenDelay", 2000, true ) ); // Input buffer - SetBuffers( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 100, true ), - DataTree->GetInt( TempMember, "OutputBuffer/Size", 0, true ), - DataTree->GetInt( TempMember, "InputBuffer/Timeout", 200, true ), - DataTree->GetStr( TempMember, "InputBuffer/Marker", "\n", true ), - DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 1, true ) ); + SetBuffers( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 0 ), + DataTree->GetInt( TempMember, "OutputBuffer/Size", 0 ), + DataTree->GetInt( TempMember, "InputBuffer/Timeout", 250 ), + DataTree->GetStr( TempMember, "InputBuffer/Marker", "" ), + DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 0 ) ); // Next TempMember = DataTree->GetNextChild( TempMember ); @@ -570,7 +569,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) if ((Handle->FD = socket(AF_INET, SOCK_STREAM, 0)) < 0) { // Log Event - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to create Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to create TCP Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set state ChangeState( Handle, csFailed ); @@ -612,7 +611,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) if (bind( Handle->FD, (struct sockaddr *)&address, addr_len ) < 0) { // Log Event - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to bind Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to bind TCP Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set state close( Handle->FD ); @@ -625,7 +624,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) if (listen( Handle->FD, 5 ) < 0) { // Log Event - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to listen on Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to listen on TCP Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set state close( Handle->FD ); @@ -635,7 +634,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) }; // Log Event - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server binded and listening [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Server binded and listening [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo ); // Add to Select Lists if (Select) { @@ -672,10 +671,10 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) { // Log Event if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server failed to accept blocking connection (%s)", Name, Handle->Name, strerror(errno) ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Server failed to accept blocking connection (%s)", Name, Handle->Name, strerror(errno) ); } else { - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server failed to accept connection (%s)", Name, Handle->Name, strerror(errno) ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Server failed to accept connection (%s)", Name, Handle->Name, strerror(errno) ); } return -1; } @@ -709,7 +708,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) (*RemoteClient)->State = csWaitingtoOpen; // Log Event - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server accepted Remote Client connection [%s]", Name, Handle->Name, ClientAddress ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Server accepted Remote TCP Client connection [%s]", Name, Handle->Name, ClientAddress ); // Add to Select Lists if (Select) { @@ -729,7 +728,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) else if (Handle->State == csWaitingtoOpen) { // Log Event - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Remote Client connection open [%s]", Name, Handle->Name, Handle->Address ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Remote TCP Client connection open [%s]", Name, Handle->Name, Handle->Address ); // Update state ChangeState( Handle, csOpen ); @@ -763,7 +762,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) if ((Handle->FD = socket( AF_INET, SOCK_STREAM, 0 )) < 0) { // Log Event - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to create Client socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to create TCP Client socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set Status ChangeState( Handle, csFailed ); @@ -800,7 +799,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) if (!connect( Handle->FD, (struct sockaddr *)&address, addr_len )) { - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client connected [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Client connected [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo ); // Add to Select Lists if (Select) { @@ -814,7 +813,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY)) { // Log Event - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client waiting to connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Client waiting to connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Add to Select Lists if (Select) { @@ -828,7 +827,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) else { // Log Event - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client could not connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Client could not connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Remove from Select List if (Select) { @@ -933,15 +932,15 @@ bool CSelectableCore::Close( THandle * Handle, bool CloseChildren ) break; case ctServer: - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Server %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo ); break; case ctRemoteClient: - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Remote Client connection %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Remote TCP Client connection %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address ); break; case ctClient: - if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client connection %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo ); + if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Client connection %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo ); break; case ctNone: