-
Notifications
You must be signed in to change notification settings - Fork 2.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix 14540 #15498
fix 14540 #15498
Conversation
@@ -273,6 +273,27 @@ fn NewLexer_( | |||
// } | |||
} | |||
|
|||
pub fn restore(this: *LexerType, original: *const LexerType) void { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The length is not the main problem - the main problem is on array resize, the previous pointer is now invalid memory. This wouldn't fix it, as it reuses the memory.
I think we would instead need to lazily clone it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it copies the possibly new pointer from the new lexer, and sets the length from the original lexer. This way we can ensure the pointers are valid, new values aren't used, and memory isn't wasted.
doing this for temp_buffer_u16
is unnecessary though, it's length is set to 0 after each use so we can ignore it. Will update
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the pointer can become invalid memory though when its resized later. even if the ptr and length match up.
What does this PR do?
fixes #14540
Fixes crashes caused by invalid pointers copied from old lexer state.
How did you verify your code works?
Added a test that relies on
std.ArrayList
capacity growth