Skip to content
This repository has been archived by the owner. It is now read-only.

Raise RuntimeError when transport's FD is used with add_reader etc #420

Closed
wants to merge 3 commits into from

Conversation

@1st1
Copy link
Member

1st1 commented Sep 16, 2016

This PR fixes #372.

The idea is that low-level socket APIs should refuse to work with FDs that belong to some Transport.

This PR adds private implementations for add_writer, add_reader, remove_writer, and remove_reader. Transports only call private implementation.

Public implementations of those methods do an extra check on the FD, raising a RuntimeError when the FD belongs to some Transport. loop.sock_sendall, loop.sock_connect, loop.sock_accept and loop.sock_recv only call public methods.

FWIW uvloop has a lot of functional network unittests, all of them pass on asyncio with this patch.

Copy link

asvetlov left a comment

Looks good

@asvetlov
Copy link

asvetlov commented Sep 16, 2016

After failed tests fixing, of course.

@1st1
Copy link
Member Author

1st1 commented Sep 16, 2016

Thank you Andrew! @gvanrossum would be cool if you can take a quick look over this PR, I want to merge it before beta2.

@gvanrossum
Copy link
Member

gvanrossum commented Sep 16, 2016

I'm confused. Where is self._transports ever updated? It seems it's always empty, so the check will never fail. What am I missing?

@1st1
Copy link
Member Author

1st1 commented Sep 16, 2016

@gvanrossum
Copy link
Member

gvanrossum commented Sep 16, 2016

I see. What about transports that don't inherit from _SelectorTransport? I guess those don't get this error when misused in debug mode but otherwise no harm is done right?

If that's so I think this is fine for b2.

@asvetlov
Copy link

asvetlov commented Sep 16, 2016

Random thought.
Let's assume I want to make my own transport for some reason.
Honestly I did it only in aiozmq (ZMQ sockets are very different from regular ones, you know) only but maybe somebody will need it for TCP sockets for some reason.
Who knows, in aiohttp we have own StreamReader for working with HTTP chunks etc.

It would be cool to have loop methods for fd protecting by protect/unprotect calls.
Not in 3.6, sure -- but maybe in 3.7?

@1st1
Copy link
Member Author

1st1 commented Sep 16, 2016

@gvanrossum I think we cover all transports except SubprocessTransport, but those don't expose the socket via get_extra_info. BTW, the check is always enabled, even in production mode (keeping a WeakValueDict for transports is cheap).

Honestly I did it only in aiozmq (ZMQ sockets are very different from regular ones, you know) only but maybe somebody will need it for TCP sockets for some reason.

@asvetlov Let's think about that after 3.6 :)

@asvetlov
Copy link

asvetlov commented Sep 16, 2016

@asvetlov Let's think about that after 3.6 :)

Agree

1st1 added a commit that referenced this pull request Oct 5, 2016
@1st1
Copy link
Member Author

1st1 commented Oct 5, 2016

Committed by hand, closing this PR now.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Linked issues

Successfully merging this pull request may close these issues.

None yet

3 participants
You can’t perform that action at this time.