Repository navigation
Guard the substring calls in StateMachine parser to avoid bounds issues - #4202
1 commit merged into
Conversation
8548d55 to
4fd3de5
Compare
|
Michael Niksa (@miniksa) After resolving a conflict, #4105 was merged in. Then I faced the trouble with the x86 tests. |
|
/azp run |
|
Azure Pipelines successfully started running 1 pipeline(s). |
|
Dustin L. Howett (MSFT) (@DHowett-MSFT), seems fine (TM) |
f0e6a38 to
7c4570f
Compare
|
k, push forced back to just the change on master. |
|
@msftbot merge this in 5 minutes |
|
Hello Dustin L. Howett (MSFT) (@DHowett-MSFT)! Because you've given me some instructions on how to help merge this pull request, I'll be modifying my merge approach. Here's how I understand your requirements for merging this pull request:
If this doesn't seem right to you, you can tell me to cancel these instructions and use the auto-merge policy that has been configured for this repository. Try telling me "forget everything I just told you". |
## Summary of the Pull Request Perform checking on `std::basic_string_view<T>.substr()` calls to prevent running out of bounds and sporadic Privileged Instruction throws during x86 tests. ## PR Checklist * [x] Closes the x86 tests failing all over the place since #4125 for no apparent reason * [x] I work here * [x] Tests pass ## Detailed Description of the Pull Request / Additional comments It appears that not all `std::basic_string_view<T>.substr()` calls are created equally. I rooted around for other versions of the code in our source tree and found several versions that were less careful about checking the start position and the size than the one that appears when building locally on dev machines. My theory is that one of these older versions is deployed somewhere in the CI. Instead of clamping down the size parameter appropriately or throwing correctly when the position is out of bounds, I believe that it's just creating a substring with a bad range over an invalid/uninitialized memory region. Then when the test operates on that, sometimes it turns out to trigger the privileged instruction NTSTATUS error we are seeing in CI. ## Test Procedure 1. Fixed the thing 2. Ran the CI and it worked 3. Reverted everything and turned off all of the CI build except just the parser tests (and supporting libraries) 4. Ran CI and it failed 5. Put the fix back on top (cherry-pick) 6. It worked. 7. Ran it again. 8. It worked. 9. Turn all the rest of the CI build back on (cherry picked from commit 4129ceb)
Summary of the Pull Request
Perform checking on
std::basic_string_view<T>.substr()calls toprevent running out of bounds and sporadic Privileged Instruction throws
during x86 tests.
PR Checklist
apparent reason
Detailed Description of the Pull Request / Additional comments
It appears that not all
std::basic_string_view<T>.substr()calls arecreated equally. I rooted around for other versions of the code in our
source tree and found several versions that were less careful about
checking the start position and the size than the one that appears when
building locally on dev machines.
My theory is that one of these older versions is deployed somewhere in
the CI. Instead of clamping down the size parameter appropriately or
throwing correctly when the position is out of bounds, I believe that
it's just creating a substring with a bad range over an
invalid/uninitialized memory region. Then when the test operates on
that, sometimes it turns out to trigger the privileged instruction
NTSTATUS error we are seeing in CI.
Test Procedure
the parser tests (and supporting libraries)