Skip to content

Commit 72d9170

Browse files
committed
return error on DataTypeDefinition empty
1 parent defa1ff commit 72d9170

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

asyncua/server/address_space.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
from concurrent.futures import ThreadPoolExecutor
1010
from datetime import datetime
1111
from functools import partial
12-
from typing import TYPE_CHECKING
12+
from typing import TYPE_CHECKING, Optional
1313

1414
if TYPE_CHECKING:
1515
from typing import Callable, Dict, List, Union, Tuple, Generator
1616
from asyncua.ua.uaprotocol_auto import (
1717
ObjectAttributes, DataTypeAttributes, ReferenceTypeAttributes,
1818
VariableTypeAttributes, VariableAttributes, ObjectTypeAttributes
1919
)
20-
__TYPE_ATTRIBUTES = Union[
20+
__TYPE_ATTRIBUTES = Union[
2121
DataTypeAttributes,
2222
ReferenceTypeAttributes,
2323
VariableTypeAttributes,
@@ -759,6 +759,10 @@ def read_attribute_value(self, nodeid: ua.NodeId, attr: ua.AttributeIds) -> ua.D
759759
dv = ua.DataValue(StatusCode_=ua.StatusCode(ua.StatusCodes.BadAttributeIdInvalid))
760760
return dv
761761
attval = node.attributes[attr]
762+
if attr == ua.AttributeIds.DataTypeDefinition and not _datatypedefinition_is_valid(attval.value):
763+
# DataTypeDefinition should be a subtype of DataTypeDefinition
764+
dv = ua.DataValue(StatusCode_=ua.StatusCode(ua.StatusCodes.BadAttributeIdInvalid))
765+
return dv
762766
if attval.value_callback:
763767
return attval.value_callback()
764768
return attval.value
@@ -834,3 +838,15 @@ def delete_datachange_callback(self, handle: int):
834838
def add_method_callback(self, methodid: ua.NodeId, callback: Callable):
835839
node = self._nodes[methodid]
836840
node.call = callback
841+
842+
843+
def _datatypedefinition_is_valid(val: Optional[ua.DataValue]) -> bool:
844+
# Check if DataValue contains SubType of DataTypeDefinition
845+
if val.Value is None:
846+
# Retain statuscode if set
847+
return val.StatusCode is not None
848+
if val.Value.VariantType != ua.VariantType.ExtensionObject:
849+
return False
850+
if issubclass(type(val.Value.Value), ua.DataTypeDefinition):
851+
return True
852+
return False

0 commit comments

Comments
 (0)