Repository navigation
Fix the gitx stdin check leaking the stream it opens - #593
Merged
Merged
Conversation
The command line tool decides whether to read a piped diff by opening a stream on stdin and throwing the result away, so every run that is not attached to a terminal leaks a FILE for the life of the process. - Test that stdin is open and readable through its descriptor flags instead, which answers the same question without allocating anything - Keep the guard in place, since handleSTDINDiff reads stdin through NSFileHandle and raises when the descriptor is closed
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.
The command line tool decides whether to read a piped diff by opening a stream
on
stdinand throwing the result away, so every run that is not attached to a terminalleaks a
FILEfor the life of the process.This is the
unix.Streamanalyzer finding ingitx.m.stdinis open and readable through its descriptor flagsinstead, which answers the same question without allocating anything
handleSTDINDiffreadsstdinthroughNSFileHandleand raises when the descriptor is closedThe stream cannot simply be closed:
fclosewould takestdinwith it,and
handleSTDINDiffneeds that same descriptor. The guard cannot bedropped either, because
isattyreturns 0 for a closedstdin, so it isthe guard that keeps
readDataToEndOfFileoff a bad descriptor.The new check matches
fdopen(fd, "r")exactly, which fails both on an invaliddescriptor and on a write-only one.
Test plan
xcodebuild analyzeno longer reports theunix.Streamwarning atgitx.m:370,with
gitx.mconfirmed re-analyzed in that rungitxgets past the guard andprints its usual message under an empty pipe, a closed
stdin,a
/dev/nullstdinand a write-only descriptorhandleSTDINDifffor the full three, while a closed
stdinreturns at once, so thereadable path is still entered rather than skipped