Skip to content

Return nil when openFifo returns nil#47

Merged
tonistiigi merged 1 commit intocontainerd:mainfrom
corhere:no-interior-nil
Dec 22, 2022
Merged

Return nil when openFifo returns nil#47
tonistiigi merged 1 commit intocontainerd:mainfrom
corhere:no-interior-nil

Conversation

@corhere
Copy link
Copy Markdown
Member

@corhere corhere commented Nov 8, 2022

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.

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)
Copy link
Copy Markdown
Member Author

@corhere corhere Nov 8, 2022

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.

@corhere
Copy link
Copy Markdown
Member Author

corhere commented Nov 8, 2022

@thaJeztah
Copy link
Copy Markdown
Member

Oh! Saw the PR title and had to think of #32, but I see you linked that above, nice 👍

Copy link
Copy Markdown
Member

@thaJeztah thaJeztah left a 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)
Copy link
Copy Markdown
Member

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

5 participants