浏览代码

Client: Cleanup async connection HEL handshake; Fix #2295 memleak

Squashed fix-commit by @StalderT: rename status to retval fix #2297 build
Julius Pfrommer 6 年之前
父节点
当前提交
e68ff10a42
共有 1 个文件被更改,包括 31 次插入28 次删除
  1. 31 28
      src/client/ua_client_connect_async.c

+ 31 - 28
src/client/ua_client_connect_async.c

@@ -88,11 +88,9 @@ sendHELMessage(UA_Client *client) {
     /* Get a buffer */
     UA_ByteString message;
     UA_Connection *conn = &client->connection;
-    client->connectStatus = conn->getSendBuffer(conn, UA_MINMESSAGESIZE,
-                                                &message);
-
-    if (client->connectStatus != UA_STATUSCODE_GOOD)
-        return client->connectStatus;
+    UA_StatusCode retval = conn->getSendBuffer(conn, UA_MINMESSAGESIZE, &message);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
 
     /* Prepare the HEL message and encode at offset 8 */
     UA_TcpHelloMessage hello;
@@ -101,38 +99,30 @@ sendHELMessage(UA_Client *client) {
 
     UA_Byte *bufPos = &message.data[8]; /* skip the header */
     const UA_Byte *bufEnd = &message.data[message.length];
-    client->connectStatus = UA_TcpHelloMessage_encodeBinary(&hello, &bufPos,
-                                                            bufEnd);
+    client->connectStatus = UA_TcpHelloMessage_encodeBinary(&hello, &bufPos, bufEnd);
     UA_TcpHelloMessage_deleteMembers (&hello);
 
     /* Encode the message header at offset 0 */
     UA_TcpMessageHeader messageHeader;
-    messageHeader.messageTypeAndChunkType = UA_CHUNKTYPE_FINAL
-            + UA_MESSAGETYPE_HEL;
-    messageHeader.messageSize = (UA_UInt32) ((uintptr_t)bufPos
-            - (uintptr_t)message.data);
+    messageHeader.messageTypeAndChunkType = UA_CHUNKTYPE_FINAL + UA_MESSAGETYPE_HEL;
+    messageHeader.messageSize = (UA_UInt32) ((uintptr_t)bufPos - (uintptr_t)message.data);
     bufPos = message.data;
-    client->connectStatus |= UA_TcpMessageHeader_encodeBinary(&messageHeader,
-                                                              &bufPos,
-                                                              bufEnd);
-    if (client->connectStatus != UA_STATUSCODE_GOOD) {
+    retval = UA_TcpMessageHeader_encodeBinary(&messageHeader, &bufPos, bufEnd);
+    if(retval != UA_STATUSCODE_GOOD) {
         conn->releaseSendBuffer(conn, &message);
-        return client->connectStatus;
+        return retval;
     }
 
     /* Send the HEL message */
     message.length = messageHeader.messageSize;
-    client->connectStatus = conn->send (conn, &message);
+    retval = conn->send (conn, &message);
 
-    if (client->connectStatus != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                    "Sending HEL failed");
-        return client->connectStatus;
+    if(retval == UA_STATUSCODE_GOOD) {
+        UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_NETWORK, "Sent HEL message");
+    } else {
+        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_NETWORK, "Sending HEL failed");
     }
-    UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                 "Sent HEL message");
-    setClientState(client, UA_CLIENTSTATE_WAITING_FOR_ACK);
-    return client->connectStatus;
+    return retval;
 }
 
 static void
@@ -536,17 +526,30 @@ UA_Client_connect_iterate(UA_Client *client) {
     UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT,
                  "Client connect iterate");
     if (client->connection.state == UA_CONNECTION_ESTABLISHED){
-        if (client->state < UA_CLIENTSTATE_WAITING_FOR_ACK)
-            return sendHELMessage(client);
+        if(client->state < UA_CLIENTSTATE_WAITING_FOR_ACK) {
+            client->connectStatus = sendHELMessage(client);
+            if(client->connectStatus == UA_STATUSCODE_GOOD) {
+                setClientState(client, UA_CLIENTSTATE_WAITING_FOR_ACK);
+            } else {
+                client->connection.close(&client->connection);
+                client->connection.free(&client->connection);
+            }
+            return client->connectStatus;
+        }
     }
 
     /* If server is not connected */
-    if (client->connection.state == UA_CONNECTION_CLOSED) {
+    if(client->connection.state == UA_CONNECTION_CLOSED) {
         client->connectStatus = UA_STATUSCODE_BADCONNECTIONCLOSED;
         UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK,
                      "No connection to server.");
     }
 
+    if(client->connectStatus != UA_STATUSCODE_GOOD) {
+        client->connection.close(&client->connection);
+        client->connection.free(&client->connection);
+    }
+
     return client->connectStatus;
 }