Browse Source

fixing cleanup memory errors, relates to #270

Stasik0 9 years ago
parent
commit
f4425ef48c
2 changed files with 8 additions and 1 deletions
  1. 3 0
      examples/networklayer_tcp.c
  2. 5 1
      src/client/ua_client.c

+ 3 - 0
examples/networklayer_tcp.c

@@ -519,6 +519,9 @@ static void ClientNetworkLayerReleaseBuffer(UA_Connection *connection, UA_ByteSt
 }
 
 static void ClientNetworkLayerClose(UA_Connection *connection) {
+    if(connection->state == UA_CONNECTION_CLOSED)
+        return;
+    connection->state = UA_CONNECTION_CLOSED;
     socket_close(connection);
 #ifndef UA_MULTITHREADING
     UA_ByteString_delete(connection->handle);

+ 5 - 1
src/client/ua_client.c

@@ -253,6 +253,7 @@ static void synchronousRequest(UA_Client *client, void *request, const UA_DataTy
     do {
         retval = client->connection.recv(&client->connection, &reply, client->config.timeout);
         if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) {
+            client->connection.state = UA_CONNECTION_CLOSED;
             respHeader->serviceResult = retval;
             return;
         }
@@ -479,12 +480,15 @@ UA_StatusCode UA_Client_connect(UA_Client *client, UA_ConnectClientConnection co
         retval = SessionHandshake(client);
     if(retval == UA_STATUSCODE_GOOD)
         retval = ActivateSession(client);
-        
+    if(retval == UA_STATUSCODE_GOOD)
+        client->connection.state = UA_CONNECTION_ESTABLISHED;
     return retval;
 }
 
 UA_StatusCode UA_Client_disconnect(UA_Client *client) {
     UA_StatusCode retval;
+    if(client->channel.connection->state != UA_CONNECTION_ESTABLISHED)
+        return UA_STATUSCODE_GOOD;
     retval = CloseSession(client);
     if(retval == UA_STATUSCODE_GOOD)
         retval = CloseSecureChannel(client);