Skip to content

Commit 0973b66

Browse files
committed
Merge pull request #8 from alan-wu/master
Fixed a bug causing FieldML to crash when binding invalid value type and...
2 parents 5565771 + 7066124 commit 0973b66

File tree

4 files changed

+28
-9
lines changed

4 files changed

+28
-9
lines changed

core/src/FieldmlDOM.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ static int validate( FieldmlErrorHandler *errorHandler, xmlParserInputBufferPtr
156156
errorHandler->logError( errorMessage );
157157
}
158158

159+
xmlResetLastError();
160+
159161
return result;
160162
}
161163

@@ -198,6 +200,7 @@ static int parseObjectNode( xmlNodePtr objectNode, ParseState &state );
198200
FmlObjectHandle getObjectAttribute( xmlNodePtr node, const xmlChar *attribute, ParseState &state )
199201
{
200202
const char *objectName = getStringAttribute( node, attribute );
203+
201204
if( objectName == NULL )
202205
{
203206
return FML_INVALID_HANDLE;
@@ -216,6 +219,9 @@ FmlObjectHandle getObjectAttribute( xmlNodePtr node, const xmlChar *attribute, P
216219
}
217220

218221
FmlObjectHandle objectHandle = Fieldml_GetObjectByName( state.session, objectName );
222+
if (objectHandle == FML_INVALID_HANDLE)
223+
state.errorHandler->logError( "FieldML Object attribute not found", objectName );
224+
219225
xmlFree(const_cast<char *>(objectName));
220226

221227
return objectHandle;
@@ -573,10 +579,24 @@ class BindParser :
573579
FmlObjectHandle argument = getObjectAttribute( objectNode, ARGUMENT_ATTRIB, state );
574580
FmlObjectHandle source = getObjectAttribute( objectNode, SOURCE_ATTRIB, state );
575581

576-
if( Fieldml_SetBind( state.session, object, argument, source ) != FML_ERR_NO_ERROR )
582+
if (FML_INVALID_HANDLE == argument)
577583
{
578-
const char* argsAttrib = getStringAttribute( objectNode, ARGUMENT_ATTRIB );
579-
const char* sourceAttrib = getStringAttribute( objectNode, SOURCE_ATTRIB );
584+
const char* argsAttrib = getStringAttribute( objectNode, ARGUMENT_ATTRIB );
585+
state.errorHandler->logError( "Incompatible bind", argsAttrib);
586+
xmlFree(const_cast<char *>(argsAttrib));
587+
return 1;
588+
}
589+
else if (FML_INVALID_HANDLE == source)
590+
{
591+
const char* sourceAttrib = getStringAttribute( objectNode, SOURCE_ATTRIB );
592+
state.errorHandler->logError( "Incompatible bind", sourceAttrib);
593+
xmlFree(const_cast<char *>(sourceAttrib));
594+
return 1;
595+
}
596+
else if( Fieldml_SetBind( state.session, object, argument, source ) != FML_ERR_NO_ERROR )
597+
{
598+
const char* argsAttrib = getStringAttribute( objectNode, ARGUMENT_ATTRIB );
599+
const char* sourceAttrib = getStringAttribute( objectNode, SOURCE_ATTRIB );
580600
state.errorHandler->logError( "Incompatible bind", argsAttrib, sourceAttrib );
581601
xmlFree(const_cast<char *>(argsAttrib));
582602
xmlFree(const_cast<char *>(sourceAttrib));

core/src/FieldmlSession.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,6 @@ void FieldmlSession::pushErrorContext( const char *file, const int line, const c
246246
contextStack.push_back( pair<string, int>( string( function ) + string( ":" ) + string( file ), line ) );
247247
}
248248

249-
250249
void FieldmlSession::popErrorContext()
251250
{
252251
contextStack.pop_back();

core/src/fieldml_write.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,8 +617,8 @@ static void writeDOKArrayData( xmlTextWriterPtr writer, FmlSessionHandle handle,
617617
xmlTextWriterWriteAttribute( writer,KEY_DATA_ATTRIB, (const xmlChar*)Fieldml_GetObjectName( handle, keyDataObject ) );
618618
xmlTextWriterWriteAttribute( writer, VALUE_DATA_ATTRIB, (const xmlChar*)Fieldml_GetObjectName( handle, dataObject ) );
619619

620-
writeParameterIndexes( writer, handle, object, 1 );
621620
writeParameterIndexes( writer, handle, object, 0 );
621+
writeParameterIndexes( writer, handle, object, 1 );
622622

623623
xmlTextWriterEndElement( writer );
624624
}

io/src/Hdf5ArrayDataReader.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ class Hdf5ArrayDataReader :
7777

7878
virtual FmlIoErrorNumber readBooleanSlab( const int *offsets, const int *sizes, FmlBoolean *valueBuffer );
7979

80-
virtual FmlIoErrorNumber setStreamRequestCallback( Fieldml_StreamRequestCallbackFunction function, void *user_data_in )
81-
{
82-
return 0;
83-
}
80+
// virtual FmlIoErrorNumber setStreamRequestCallback( Fieldml_StreamRequestCallbackFunction function, void *user_data_in )
81+
// {
82+
// return 0;
83+
//}
8484

8585
virtual FmlIoErrorNumber close();
8686

0 commit comments

Comments
 (0)