Commit 3a4265b3 authored by Julius Pfrommer's avatar Julius Pfrommer Committed by Julius Pfrommer
Browse files

fix(core): Thread-safe parsing of human-readable builtin types

No related merge requests found
Showing with 18 additions and 0 deletions
+18 -0
......@@ -27,6 +27,11 @@
const char *yyt1;const char *yyt2;const char *yyt3;const char *yyt4;
/* The generated lexer defines global variables. Protect with a mutex. */
#if UA_MULTITHREADING >= 100
UA_LOCK_TYPE(parserMutex)
#endif
static UA_StatusCode
parse_guid(UA_Guid *guid, const UA_Byte *s, const UA_Byte *e) {
size_t len = (size_t)(e - s);
......@@ -232,10 +237,12 @@ yy14:
UA_StatusCode
UA_NodeId_parse(UA_NodeId *id, const UA_String str) {
UA_LOCK(parserMutex);
UA_StatusCode res =
parse_nodeid(id, (const char*)str.data, (const char*)str.data+str.length);
if(res != UA_STATUSCODE_GOOD)
UA_NodeId_clear(id);
UA_UNLOCK(parserMutex);
return res;
}
......@@ -490,9 +497,11 @@ yy42:
UA_StatusCode
UA_ExpandedNodeId_parse(UA_ExpandedNodeId *id, const UA_String str) {
UA_LOCK(parserMutex);
UA_StatusCode res =
parse_expandednodeid(id, (const char*)str.data, (const char*)str.data+str.length);
if(res != UA_STATUSCODE_GOOD)
UA_ExpandedNodeId_clear(id);
UA_UNLOCK(parserMutex);
return res;
}
......@@ -37,6 +37,11 @@
nodeid_body = ("i=" | "s=" | "g=" | "b=");
*/
/* The generated lexer defines global variables. Protect with a mutex. */
#if UA_MULTITHREADING >= 100
UA_LOCK_TYPE(parserMutex)
#endif
static UA_StatusCode
parse_guid(UA_Guid *guid, const UA_Byte *s, const UA_Byte *e) {
size_t len = (size_t)(e - s);
......@@ -147,10 +152,12 @@ parse_nodeid(UA_NodeId *id, const char *input, const char *end) {
UA_StatusCode
UA_NodeId_parse(UA_NodeId *id, const UA_String str) {
UA_LOCK(parserMutex);
UA_StatusCode res =
parse_nodeid(id, (const char*)str.data, (const char*)str.data+str.length);
if(res != UA_STATUSCODE_GOOD)
UA_NodeId_clear(id);
UA_UNLOCK(parserMutex);
return res;
}
......@@ -193,9 +200,11 @@ parse_expandednodeid(UA_ExpandedNodeId *id, const char *input, const char *end)
UA_StatusCode
UA_ExpandedNodeId_parse(UA_ExpandedNodeId *id, const UA_String str) {
UA_LOCK(parserMutex);
UA_StatusCode res =
parse_expandednodeid(id, (const char*)str.data, (const char*)str.data+str.length);
if(res != UA_STATUSCODE_GOOD)
UA_ExpandedNodeId_clear(id);
UA_UNLOCK(parserMutex);
return res;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment