-
Notifications
You must be signed in to change notification settings - Fork 13.7k
std: make address resolution weirdness local to SGX #145327
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
base: master
Are you sure you want to change the base?
Conversation
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.
I've moved the whole platform-matching into this new file so there's a place to put each_addr
.
} | ||
} | ||
|
||
mod connection; |
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.
If you were wondering why this is its own module, it's to facilitate #135141, which has a different platform distribution.
This comment has been minimized.
This comment has been minimized.
936d414
to
842d4de
Compare
I've just started taking a look here, but cc @jethrogb in case there is anything you'd like to review from the SGX side |
☔ The latest upstream changes (presumably #145489) made this pull request unmergeable. Please resolve the merge conflicts. |
Could you please ping all target maintainers? @raoulstrackx @aditijannu |
The SGX part looks good to me! |
Currently, the implementations of
TcpStream::connect
and its cousins take anio::Result<&SocketAddr>
as argument, which is very weird, as most of them then?
-try the result immediately to access the actual address. This weirdness is however necessitated by a peculiarity of the SGX networking implementation:SGX doesn't support DNS resolution but rather accepts hostnames in the same place as socket addresses. So, to make e.g.
work, the DNS lookup returns a special error (
NonIpSockAddr
) instead, which contains the hostname being looked up. When.to_socket_addrs()
fails, theeach_addr
function used to select an address will pass the error to the innerTcpStream::connect
implementation, which in SGX's case will inspect the error and try recover the hostname from it. Ifthat succeeds, it continues with the found hostname.
This is pretty obviously a terrible hack and leads to buggy code (for instance, when users use the result of
.to_socket_addrs()
in their ownToSocketAddrs
implementation to select from a list of possible URLs, the only URL used will be that of the last item tried). Still, without changes to the SGX usercall ABI, it cannot be avoided.Therefore, this PR aims to minimise the impact of that weirdness and remove it from all non-SGX platforms. The inner
TcpStream::connect
, et al. functions now receive theToSocketAddrs
type directly and calleach_addr
(which is moved tosys::net::connection
) themselves. On SGX, the implementation uses a specialeach_addr
which contains the whole pass-hostname-through-error hack.As well as making the code cleaner, this also opens up the possibility of reusing newly created sockets even if a connection request fails – but I've left that for another PR.
CC @raoulstrackx