Browse Source

Remove OR'ing statuscodes

Mark Giraud 6 years ago
parent
commit
6d86887307

+ 1 - 1
plugins/ua_securitypolicy_basic128rsa15.c

@@ -520,7 +520,7 @@ sym_generateKey_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
         if(offset + hashLen > out->length) {
             outSegment.data = NULL;
             outSegment.length = 0;
-            retval |= UA_ByteString_allocBuffer(&outSegment, hashLen);
+            retval = UA_ByteString_allocBuffer(&outSegment, hashLen);
             if(retval != UA_STATUSCODE_GOOD) {
                 UA_ByteString_deleteMembers(&A_and_seed);
                 UA_ByteString_deleteMembers(&ANext_and_seed);

+ 23 - 15
src/client/ua_client_connect_async.c

@@ -204,22 +204,23 @@ processOPNResponse(void *application, UA_Connection *connection,
     UA_Client *client = (UA_Client*) application;
     UA_StatusCode retval = UA_SecureChannel_decryptAddChunk(&client->channel, chunk);
     client->connectStatus = retval;
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_disconnect(client);
-        return retval;
-    }
+    if(retval != UA_STATUSCODE_GOOD)
+        goto error;
     UA_SecureChannel_processCompleteMessages(&client->channel, client, processDecodedOPNResponseAsync);
     
-    if(client->state < UA_CLIENTSTATE_SECURECHANNEL)
-        return UA_STATUSCODE_BADSECURECHANNELCLOSED;
-
-    retval |= UA_SecureChannel_persistIncompleteMessages(&client->channel);
-    retval |= UA_SecureChannel_generateNewKeys(&client->channel);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_disconnect(client);
-        return retval;
+    if(client->state < UA_CLIENTSTATE_SECURECHANNEL) {
+        retval = UA_STATUSCODE_BADSECURECHANNELCLOSED;
+        goto error;
     }
 
+    retval = UA_SecureChannel_persistIncompleteMessages(&client->channel);
+    if(retval != UA_STATUSCODE_GOOD)
+        goto error;
+
+    retval = UA_SecureChannel_generateNewKeys(&client->channel);
+    if(retval != UA_STATUSCODE_GOOD)
+        goto error;
+
     /* Following requests and responses */
     UA_UInt32 reqId;
     if(client->endpointsHandshake)
@@ -228,7 +229,13 @@ processOPNResponse(void *application, UA_Connection *connection,
         retval = requestSession (client, &reqId);
 
     if(retval != UA_STATUSCODE_GOOD)
-        UA_Client_disconnect(client);
+        goto error;
+
+    return retval;
+
+error:
+    UA_Client_disconnect(client);
+
     return retval;
 }
 
@@ -579,10 +586,11 @@ UA_Client_connectInternalAsync(UA_Client *client, const char *endpointUrl,
         retval = UA_Client_addRepeatedCallback(
                      client, client->config.pollConnectionFunc, &client->connection, 100,
                      &client->connection.connectCallbackID);
+        if(retval != UA_STATUSCODE_GOOD)
+            return retval;
     }
 
-    retval |= UA_SecureChannel_generateLocalNonce(&client->channel);
-
+    retval = UA_SecureChannel_generateLocalNonce(&client->channel);
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
 

+ 23 - 7
src/server/ua_securechannel_manager.c

@@ -171,19 +171,29 @@ UA_SecureChannelManager_open(UA_SecureChannelManager *cm, UA_SecureChannel *chan
 
     /* Set the nonces and generate the keys */
     UA_StatusCode retval = UA_ByteString_copy(&request->clientNonce, &channel->remoteNonce);
-    retval |= UA_SecureChannel_generateLocalNonce(channel);
-    retval |= UA_SecureChannel_generateNewKeys(channel);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
+
+    retval = UA_SecureChannel_generateLocalNonce(channel);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
+
+    retval = UA_SecureChannel_generateNewKeys(channel);
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
 
     /* Set the response */
     retval = UA_ByteString_copy(&channel->localNonce, &response->serverNonce);
-    retval |= UA_ChannelSecurityToken_copy(&channel->securityToken, &response->securityToken);
-    response->responseHeader.timestamp = UA_DateTime_now();
-    response->responseHeader.requestHandle = request->requestHeader.requestHandle;
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
 
+    retval = UA_ChannelSecurityToken_copy(&channel->securityToken, &response->securityToken);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
+
+    response->responseHeader.timestamp = UA_DateTime_now();
+    response->responseHeader.requestHandle = request->requestHeader.requestHandle;
+
     /* The channel is open */
     channel->state = UA_SECURECHANNELSTATE_OPEN;
 
@@ -215,14 +225,20 @@ UA_SecureChannelManager_renew(UA_SecureChannelManager *cm, UA_SecureChannel *cha
     /* Replace the nonces */
     UA_ByteString_deleteMembers(&channel->remoteNonce);
     UA_StatusCode retval = UA_ByteString_copy(&request->clientNonce, &channel->remoteNonce);
-    retval |= UA_SecureChannel_generateLocalNonce(channel);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
+
+    retval = UA_SecureChannel_generateLocalNonce(channel);
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
 
     /* Set the response */
     response->responseHeader.requestHandle = request->requestHeader.requestHandle;
     retval = UA_ByteString_copy(&channel->localNonce, &response->serverNonce);
-    retval |= UA_ChannelSecurityToken_copy(&channel->nextSecurityToken, &response->securityToken);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
+
+    retval = UA_ChannelSecurityToken_copy(&channel->nextSecurityToken, &response->securityToken);
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
 

+ 11 - 3
src/server/ua_server_binary.c

@@ -341,10 +341,16 @@ processOPN(UA_Server *server, UA_SecureChannel *channel,
     /* Decode the request */
     size_t offset = 0;
     UA_NodeId requestType;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
     UA_OpenSecureChannelRequest openSecureChannelRequest;
-    retval |= UA_NodeId_decodeBinary(msg, &offset, &requestType);
-    retval |= UA_OpenSecureChannelRequest_decodeBinary(msg, &offset, &openSecureChannelRequest);
+    UA_StatusCode retval = UA_NodeId_decodeBinary(msg, &offset, &requestType);
+
+    if(retval != UA_STATUSCODE_GOOD) {
+        UA_NodeId_deleteMembers(&requestType);
+        UA_LOG_INFO_CHANNEL(server->config.logger, channel, "Could not decode the NodeId. Closing the connection");
+        UA_SecureChannelManager_close(&server->secureChannelManager, channel->securityToken.channelId);
+        return retval;
+    }
+    retval = UA_OpenSecureChannelRequest_decodeBinary(msg, &offset, &openSecureChannelRequest);
 
     /* Error occurred */
     if(retval != UA_STATUSCODE_GOOD ||
@@ -381,7 +387,9 @@ processOPN(UA_Server *server, UA_SecureChannel *channel,
                             UA_StatusCode_name(retval));
         UA_SecureChannelManager_close(&server->secureChannelManager,
                                       channel->securityToken.channelId);
+        return retval;
     }
+
     return retval;
 }
 

+ 47 - 28
src/server/ua_services_discovery.c

@@ -23,11 +23,14 @@ static UA_StatusCode
 setApplicationDescriptionFromRegisteredServer(const UA_FindServersRequest *request,
                                               UA_ApplicationDescription *target,
                                               const UA_RegisteredServer *registeredServer) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
     UA_ApplicationDescription_init(target);
-    retval |= UA_String_copy(&registeredServer->serverUri, &target->applicationUri);
-    retval |= UA_String_copy(&registeredServer->productUri, &target->productUri);
+    UA_StatusCode retval = UA_String_copy(&registeredServer->serverUri, &target->applicationUri);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
+
+    retval = UA_String_copy(&registeredServer->productUri, &target->productUri);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
 
     // if the client requests a specific locale, select the corresponding server name
     if(request->localeIdsSize) {
@@ -35,8 +38,10 @@ setApplicationDescriptionFromRegisteredServer(const UA_FindServersRequest *reque
         for(size_t i =0; i<request->localeIdsSize && !appNameFound; i++) {
             for(size_t j =0; j<registeredServer->serverNamesSize; j++) {
                 if(UA_String_equal(&request->localeIds[i], &registeredServer->serverNames[j].locale)) {
-                    retval |= UA_LocalizedText_copy(&registeredServer->serverNames[j],
-                                                    &target->applicationName);
+                    retval = UA_LocalizedText_copy(&registeredServer->serverNames[j],
+                                                   &target->applicationName);
+                    if(retval != UA_STATUSCODE_GOOD)
+                        return retval;
                     appNameFound = UA_TRUE;
                     break;
                 }
@@ -45,16 +50,23 @@ setApplicationDescriptionFromRegisteredServer(const UA_FindServersRequest *reque
 
         // server does not have the requested local, therefore we can select the
         // most suitable one
-        if(!appNameFound && registeredServer->serverNamesSize)
-            retval |= UA_LocalizedText_copy(&registeredServer->serverNames[0],
-                                            &target->applicationName);
+        if(!appNameFound && registeredServer->serverNamesSize) {
+            retval = UA_LocalizedText_copy(&registeredServer->serverNames[0],
+                                           &target->applicationName);
+            if(retval != UA_STATUSCODE_GOOD)
+                return retval;
+        }
     } else if(registeredServer->serverNamesSize) {
         // just take the first name
-        retval |= UA_LocalizedText_copy(&registeredServer->serverNames[0], &target->applicationName);
+        retval = UA_LocalizedText_copy(&registeredServer->serverNames[0], &target->applicationName);
+        if(retval != UA_STATUSCODE_GOOD)
+            return retval;
     }
 
     target->applicationType = registeredServer->serverType;
-    retval |= UA_String_copy(&registeredServer->gatewayServerUri, &target->gatewayServerUri);
+    retval = UA_String_copy(&registeredServer->gatewayServerUri, &target->gatewayServerUri);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
     // TODO where do we get the discoveryProfileUri for application data?
 
     target->discoveryUrlsSize = registeredServer->discoveryUrlsSize;
@@ -63,8 +75,11 @@ setApplicationDescriptionFromRegisteredServer(const UA_FindServersRequest *reque
         target->discoveryUrls = (UA_String *)UA_malloc(duSize);
         if(!target->discoveryUrls)
             return UA_STATUSCODE_BADOUTOFMEMORY;
-        for(size_t i = 0; i<registeredServer->discoveryUrlsSize; i++)
-            retval |= UA_String_copy(&registeredServer->discoveryUrls[i], &target->discoveryUrls[i]);
+        for(size_t i = 0; i < registeredServer->discoveryUrlsSize; i++) {
+            retval = UA_String_copy(&registeredServer->discoveryUrls[i], &target->discoveryUrls[i]);
+            if(retval != UA_STATUSCODE_GOOD)
+                return retval;
+        }
     }
 
     return retval;
@@ -195,9 +210,10 @@ void Service_FindServers(UA_Server *server, UA_Session *session,
 #endif
 }
 
-void Service_GetEndpoints(UA_Server *server, UA_Session *session,
-                          const UA_GetEndpointsRequest *request,
-                          UA_GetEndpointsResponse *response) {
+void
+Service_GetEndpoints(UA_Server *server, UA_Session *session,
+                     const UA_GetEndpointsRequest *request,
+                     UA_GetEndpointsResponse *response) {
     /* If the client expects to see a specific endpointurl, mirror it back. If
        not, clone the endpoints with the discovery url of all networklayers. */
     const UA_String *endpointUrl = &request->endpointUrl;
@@ -255,28 +271,31 @@ void Service_GetEndpoints(UA_Server *server, UA_Session *session,
     response->endpointsSize = relevant_count * clone_times;
 
     size_t k = 0;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    UA_StatusCode retval;
     for(size_t i = 0; i < clone_times; ++i) {
         if(nl_endpointurl)
             endpointUrl = &server->config.networkLayers[i].discoveryUrl;
         for(size_t j = 0; j < server->config.endpointsSize; ++j) {
             if(!relevant_endpoints[j])
                 continue;
-            retval |= UA_EndpointDescription_copy(&server->config.endpoints[j].endpointDescription,
-                                                  &response->endpoints[k]);
-            retval |= UA_String_copy(endpointUrl, &response->endpoints[k].endpointUrl);
+            retval = UA_EndpointDescription_copy(&server->config.endpoints[j].endpointDescription,
+                                                 &response->endpoints[k]);
+            if(retval != UA_STATUSCODE_GOOD)
+                goto error;
+            retval = UA_String_copy(endpointUrl, &response->endpoints[k].endpointUrl);
+            if(retval != UA_STATUSCODE_GOOD)
+                goto error;
             ++k;
         }
     }
 
-    if(retval != UA_STATUSCODE_GOOD) {
-        response->responseHeader.serviceResult = retval;
-        UA_Array_delete(response->endpoints, response->endpointsSize,
-                        &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-        response->endpoints = NULL;
-        response->endpointsSize = 0;
-        return;
-    }
+    return;
+error:
+    response->responseHeader.serviceResult = retval;
+    UA_Array_delete(response->endpoints, response->endpointsSize,
+                    &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
+    response->endpoints = NULL;
+    response->endpointsSize = 0;
 }
 
 #ifdef UA_ENABLE_DISCOVERY