Skip to content

Don't use syscall.Close() on inherited fd #29

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

Closed
wants to merge 1 commit into from

Conversation

vincentbernat
Copy link

Inherited file descriptor is encapsulated into a File using os.NewFile(). There is no dup() done by Go in this case and a finalizer will close the File (and the file descriptor if the file wasn't already closed) when it becomes out of reach. Using syscall.Close() will close the file descriptor but not the File. At some point, the finalizer will kick in, notice the file hasn't been closed and close again the file descriptor. If the file descriptor was reassigned to something else, we close an unrelated file descriptor.

Tested with Go 1.7. Source code shows there is no dup() done when using NewFile():

Inherited file descriptor is encapsulated into a `File` using `os.NewFile()`. There is no `dup()` done by Go in this case and a finalizer will close the `File` (and the file descriptor if the file wasn't already closed) when it becomes out of reach. Using `syscall.Close()` will close the file descriptor but not the `File`. At some point, the finalizer will kick in, notice the file hasn't been closed and close again the file descriptor. If the file descriptor was reassigned to something else, we close an unrelated file descriptor.

Tested with Go 1.7. Source code shows there is no `dup()` done when using `NewFile()`:
 - Go 1.7: https://github.com/golang/go/blob/release-branch.go1.7/src/os/file_unix.go#L50
 - Go 1.6: https://github.com/golang/go/blob/release-branch.go1.6/src/os/file_unix.go#L50
 - Go 1.5: https://github.com/golang/go/blob/release-branch.go1.5/src/os/file_unix.go#L48
 - Go 1.4: https://github.com/golang/go/blob/release-branch.go1.4/src/os/file_unix.go#L40
@vincentbernat
Copy link
Author

In fact, this is a duplicate of #28...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant