Procházet zdrojové kódy

Replaced ByteString_compare/String_compare's builtin strncmp with memcmp to allow for NULL-Bytes encoded in binary transport encodings in comparisons not throwing of the result.

ichrispa před 9 roky
rodič
revize
5b919b5486
2 změnil soubory, kde provedl 3 přidání a 2 odebrání
  1. 2 1
      src/server/ua_subscription.c
  2. 1 1
      src/ua_types.c

+ 2 - 1
src/server/ua_subscription.c

@@ -533,10 +533,11 @@ void MonitoredItem_QueuePushDataValue(UA_Server *server, UA_MonitoredItem *monit
     UA_encodeBinary(&newvalue->value, &UA_TYPES[UA_TYPES_VARIANT], &newValueAsByteString, &encodingOffset);
   
     if(!monitoredItem->lastSampledValue.data) { 
-        monitoredItem->lastSampledValue = newValueAsByteString;
+        UA_ByteString_copy(&newValueAsByteString, &monitoredItem->lastSampledValue);
         TAILQ_INSERT_HEAD(&monitoredItem->queue, newvalue, listEntry);
         monitoredItem->queueSize.currentValue++;
         monitoredItem->lastSampled = UA_DateTime_now();
+        UA_free(newValueAsByteString.data);
     } else {
         if(UA_String_equal(&newValueAsByteString, &monitoredItem->lastSampledValue) == UA_TRUE) {
             UA_Variant_deleteMembers(&newvalue->value);

+ 1 - 1
src/ua_types.c

@@ -155,7 +155,7 @@ UA_Boolean UA_String_equal(const UA_String *string1, const UA_String *string2) {
         return UA_FALSE;
 
     // casts are needed to overcome signed warnings
-    UA_Int32 is = strncmp((char const *)string1->data, (char const *)string2->data, (size_t)string1->length);
+    UA_Int32 is = memcmp((char const *)string1->data, (char const *)string2->data, (size_t)string1->length);
     return (is == 0) ? UA_TRUE : UA_FALSE;
 }