Skip to content

Commit

Permalink
refs #26: Avoid calling XmlNode_getParent
Browse files Browse the repository at this point in the history
Workaround for upstream issue bsapundzhiev/bsxml-json#25: Do not call XmlNode_getParent, which may return invalid pointer
  • Loading branch information
tbeu committed Apr 16, 2018
1 parent 6ea6341 commit 3e63f65
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 8 deletions.
20 changes: 12 additions & 8 deletions ExternData/Resources/C-Sources/ED_XMLFile.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ void ED_destroyXML(void* _xml)
}
}

static char* findValue(XmlNodeRef* root, const char* varName, const char* fileName)
static char* findValue(XmlNodeRef* root, XmlNodeRef* parent, const char* varName, const char* fileName)
{
char* token = NULL;
char* varNameCopy = strdup(varName);
Expand All @@ -129,6 +129,7 @@ static char* findValue(XmlNodeRef* root, const char* varName, const char* fileNa
while (token != NULL && elementError == 0) {
XmlNodeRef iter = XmlNode_findChild(*root, token);
if (NULL != iter) {
*parent = *root;
*root = iter;
token = strtok_r(NULL, ".", &nextToken);
}
Expand Down Expand Up @@ -160,7 +161,8 @@ double ED_getDoubleFromXML(void* _xml, const char* varName, int* exist)
ED_PTR_CHECK(xml);
if (xml != NULL) {
XmlNodeRef root = xml->root;
char* token = findValue(&root, varName, xml->fileName);
XmlNodeRef parent = NULL;
char* token = findValue(&root, &parent, varName, xml->fileName);
*exist = 1;
if (token != NULL) {
if (ED_strtod(token, xml->loc, &ret, ED_STRICT)) {
Expand Down Expand Up @@ -189,7 +191,8 @@ const char* ED_getStringFromXML(void* _xml, const char* varName, int* exist)
ED_PTR_CHECK(xml);
if (xml != NULL) {
XmlNodeRef root = xml->root;
char* token = findValue(&root, varName, xml->fileName);
XmlNodeRef parent = NULL;
char* token = findValue(&root, &parent, varName, xml->fileName);
*exist = 1;
if (token != NULL) {
char* ret = ModelicaAllocateString(strlen(token));
Expand Down Expand Up @@ -218,7 +221,8 @@ int ED_getIntFromXML(void* _xml, const char* varName, int* exist)
ED_PTR_CHECK(xml);
if (xml != NULL) {
XmlNodeRef root = xml->root;
char* token = findValue(&root, varName, xml->fileName);
XmlNodeRef parent = NULL;
char* token = findValue(&root, &parent, varName, xml->fileName);
*exist = 1;
if (token != NULL) {
if (ED_strtol(token, xml->loc, &ret, ED_STRICT)) {
Expand Down Expand Up @@ -247,8 +251,9 @@ void ED_getDoubleArray1DFromXML(void* _xml, const char* varName, double* a, size
ED_PTR_CHECK(xml);
if (xml != NULL) {
XmlNodeRef root = xml->root;
XmlNodeRef parent = NULL;
int iLevel = 0;
char* token = findValue(&root, varName, xml->fileName);
char* token = findValue(&root, &parent, varName, xml->fileName);
while (NULL == token && NULL != root && XmlNode_getChildCount(root) > 0) {
/* Try children if root is empty */
root = XmlNode_getChild(root, 0);
Expand All @@ -260,7 +265,6 @@ void ED_getDoubleArray1DFromXML(void* _xml, const char* varName, double* a, size
if (tokenCopy != NULL) {
size_t i = 0;
size_t iSibling = 0;
XmlNodeRef parent = XmlNode_getParent(root);
size_t nSiblings = XmlNode_getChildCount(parent);
int line = XmlNode_getLine(root);
int foundSibling = 0;
Expand Down Expand Up @@ -359,8 +363,9 @@ void ED_getArray2DDimensionsFromXML(void* _xml, const char* varName, int* m, int
ED_PTR_CHECK(xml);
if (xml != NULL) {
XmlNodeRef root = xml->root;
XmlNodeRef parent = NULL;
int iLevel = 0;
char* token = findValue(&root, varName, xml->fileName);
char* token = findValue(&root, &parent, varName, xml->fileName);
while (NULL == token && NULL != root && XmlNode_getChildCount(root) > 0) {
/* Try children if root is empty */
root = XmlNode_getChild(root, 0);
Expand All @@ -370,7 +375,6 @@ void ED_getArray2DDimensionsFromXML(void* _xml, const char* varName, int* m, int
if (NULL != token) {
char* tokenCopy = strdup(token);
if (NULL != tokenCopy) {
XmlNodeRef parent = XmlNode_getParent(root);
size_t nSiblings = XmlNode_getChildCount(parent);
char* nextToken = NULL;
if (0 == iLevel) {
Expand Down
1 change: 1 addition & 0 deletions ExternData/Resources/C-Sources/bsxml-json/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ static int cpo_array_preallocate(cpo_array_t *a, asize_t elements)
return ENOMEM;

a->v = newv;
memset((unsigned char*) a->v + a->elem_size * a->max, 0, (newmax - a->max) * a->elem_size);
a->max = newmax;
return 0;
}
Expand Down

0 comments on commit 3e63f65

Please sign in to comment.