Fix fnamemodify()'s handling of :r after :e #5024
Closed
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.
Durin 8000 g
fnamemodify()
, for":r"
we will iterate up the filename. Ensuring that we don't go before the filename's first directory separator (the tail) is insufficient in cases where we've already handled a":e"
modifier, for example:This means for a
":r"
, we'll go before*fnamep
, and outside the bounds of the filename. This is both incorrect and causes vim to attempt to allocate a lot of memory, which will either fails and we'll continue with a null string, or we'll get a runtime allocation error.The large memory allocation comes from calculating
s - *fnamep
. Sinces
is before*fnamep
, we calculate a negative length, which ends up being interpreted as an amount to allocate, causing the above problem.We must instead ensure we don't go before
*fnamep
nortail
. The check fortail
is still relevant, for example, here we don't want to go before it:(This is cloned this PR to neovim)