-
Notifications
You must be signed in to change notification settings - Fork 30
Return nil when openFifo returns nil #47
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
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 <csnider@mirantis.com>
|
|
||
| _, 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 👍 |
thaJeztah
left a comment
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!
| 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
OpenFifowrapper function implicitly boxes the*fifopointer into anio.ReadWriteCloserinterface 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 theOpenFifowrapper function to return anilinterface value whenopenFiforeturns anilpointer 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.