-
Notifications
You must be signed in to change notification settings - Fork 30
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
Return nil when openFifo returns nil #47
Conversation
The return statement in the OpenFifo wrapper function implicitly boxes the *fifo pointer into an io.ReadWriteCloser interface value, even when the value is (*fifo)(nil). It is the same gotcha described in https://go.dev/doc/faq#nil_error and causes the same sorts of confusing situations. Modify the OpenFifo wrapper function to return a nil interface value when openFifo returns a nil pointer value. Signed-off-by: Cory Snider <[email protected]>
@@ -42,15 +42,16 @@ func TestFifoCancel(t *testing.T) { | |||
leakCheckWg = nil | |||
}() | |||
|
|||
_, err = OpenFifo(context.Background(), filepath.Join(tmpdir, "f0"), syscall.O_RDONLY|syscall.O_NONBLOCK, 0600) | |||
f, err := OpenFifo(context.Background(), filepath.Join(tmpdir, "f0"), syscall.O_RDONLY|syscall.O_NONBLOCK, 0600) | |||
assert.Exactly(t, nil, f) |
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.
Annoyingly, assert.Nil
considers non-nil interface values which contain nil concrete values to be nil values despite those values being != nil
.
Oh! Saw the PR title and had to think of #32, but I see you linked that above, nice 👍 |
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.
LGTM, thanks!
assert.NotNil(t, err) | ||
|
||
assert.NoError(t, checkWgDone(leakCheckWg)) | ||
|
||
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) | ||
defer cancel() | ||
|
||
f, err := OpenFifo(ctx, filepath.Join(tmpdir, "f0"), syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0600) | ||
f, err = OpenFifo(ctx, filepath.Join(tmpdir, "f0"), syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0600) |
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.
Oh! Not a blocker (at all), but if you want to reduce code-churn, perhaps reformat the octal values to the new format (0o600
) while updating these lines
The return statement in the
OpenFifo
wrapper function implicitly boxes the*fifo
pointer into anio.ReadWriteCloser
interface value, even when the value is(*fifo)(nil)
. It is the same gotcha described in https://go.dev/doc/faq#nil_error and causes the same sorts of confusing situations. Modify theOpenFifo
wrapper function to return anil
interface value whenopenFifo
returns anil
pointer value.(*fifo)(nil)
value could escape the package, and therefore the root cause of SIGSEGV dockerd 20.10.2 docker/for-linux#1186 for which fifo.Close(): prevent possible panic if fifo is nil #32 was added as a workaround.