Bläddra i källkod

check datasource callback before invoking

wuyangtang 9 år sedan
förälder
incheckning
1d26891d35
2 ändrade filer med 5 tillägg och 1 borttagningar
  1. 4 0
      src/server/ua_services_attribute.c
  2. 1 1
      src/server/ua_subscription.c

+ 4 - 0
src/server/ua_services_attribute.c

@@ -157,6 +157,8 @@ static UA_StatusCode getVariableNodeDataType(const UA_VariableNode *vn, UA_DataV
         forceVariantSetScalar(&v->value, &vn->value.variant.value.type->typeId,
                               &UA_TYPES[UA_TYPES_NODEID]);
     } else {
+        if(vn->value.dataSource.read == NULL)
+            return UA_STATUSCODE_BADINTERNALERROR;
         /* Read from the datasource to see the data type */
         UA_DataValue val;
         UA_DataValue_init(&val);
@@ -176,6 +178,8 @@ static UA_StatusCode getVariableNodeArrayDimensions(const UA_VariableNode *vn, U
                             vn->value.variant.value.arrayDimensionsSize, &UA_TYPES[UA_TYPES_INT32]);
         v->value.storageType = UA_VARIANT_DATA_NODELETE;
     } else {
+        if(vn->value.dataSource.read == NULL)
+            return UA_STATUSCODE_BADINTERNALERROR;
         /* Read the datasource to see the array dimensions */
         UA_DataValue val;
         UA_DataValue_init(&val);

+ 1 - 1
src/server/ua_subscription.c

@@ -375,7 +375,7 @@ UA_Boolean MonitoredItem_CopyMonitoredValueToVariant(UA_UInt32 attributeID, cons
                 dst->hasValue = UA_TRUE;
                 samplingError = UA_FALSE;
             } else {
-                if(vsrc->valueSource != UA_VALUESOURCE_DATASOURCE)
+                if(vsrc->valueSource != UA_VALUESOURCE_DATASOURCE || vsrc->value.dataSource.read == NULL)
                     break;
                 if(vsrc->value.dataSource.read(vsrc->value.dataSource.handle, vsrc->nodeId, UA_TRUE,
                                                NULL, &sourceDataValue) != UA_STATUSCODE_GOOD)