check for invalid mailbox header length to avoid access violation#669
Open
andre-comet wants to merge 2 commits intoOpenEtherCATsociety:masterfrom
Open
check for invalid mailbox header length to avoid access violation#669andre-comet wants to merge 2 commits intoOpenEtherCATsociety:masterfrom
andre-comet wants to merge 2 commits intoOpenEtherCATsociety:masterfrom
Conversation
bdf57ad to
164bc12
Compare
164bc12 to
6a5babf
Compare
01021dd to
2ef4d15
Compare
…h-access-violation
Author
|
@ArthurKetels: this needs approval again after bringing it up to date with OpenEtherCATsociety:master |
ArthurKetels
requested changes
Jan 17, 2023
Contributor
ArthurKetels
left a comment
There was a problem hiding this comment.
Thanks for catching this bug. The solution is however not enough to fix all cases.
Example 1: MbxHeader.Length - 3 > buffer size
Example 2: More segmented transfers than buffer size. Each segment being perfectly valid.
The solution should be that each memcpy in the segmented transfer is checked for bounds before executing.
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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) - 3If
MbxHeader.lengthis zero, the UINT16 value wraps to 65533 (0 - 3 = 65535 - 2). FaultyFramedatasizeof 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
-3calculation 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.