check for invalid mailbox header length to avoid access violation #669
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When working with an Ethercat CoE slave that would occasionally send an invalid packet with mailbox size 0 during segmented transfer, SOEM causes a hard fault (access violation).
While the root cause is a bug in the slave, SOEM should handle it and signal an error instead of crashing due to an access violation.
The issue is caused in line 244 in the calculation of Framedatasize:
Framedatasize = etohs(aSDOp->MbxHeader.length) - 3
If
MbxHeader.length
is zero, the UINT16 value wraps to 65533 (0 - 3 = 65535 - 2). FaultyFramedatasize
of 65533 is then passed as size argument to memcpy, causing the access violationInvalid packet:
Framedatasize is 65533 when passed as size parameter to memcpy in line 257 of ethercatcoe.c:
My change simply checks if the
-3
calculation would cause a wrap of the UINT. If it would,ecx_packeterror()
is called.I tested this change with the pysoem wrapper on windows and it now throws a packet error exception which can be handled, instead of causing an access violation which crashed the Ethercat master entirely.