mirror of https://github.com/PCSX2/pcsx2.git
DEV9: Add general notes regarding sockaddr casting
This commit is contained in:
parent
8f1b804f98
commit
344cf6fffb
|
@ -33,6 +33,27 @@
|
||||||
using namespace PacketReader;
|
using namespace PacketReader;
|
||||||
using namespace PacketReader::IP;
|
using namespace PacketReader::IP;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The socket api and its sockaddr_* types are somewhat tricky to work with while trying to avoid UB.
|
||||||
|
* The various sockaddr_* types may be larger or smaller than the base sockaddr type, preventing the use of std::bit_cast().
|
||||||
|
* std::memcpy casting can also be non-trivial if we are casting a large sockaddr_* type to a smaller sockaddr.
|
||||||
|
* Using a reinterpret_cast would violate strict aliasing/object lifetime rules.
|
||||||
|
* However, what if we consider that any sockaddr pointer is pre-aliased to an object already in the required type,
|
||||||
|
* we can then just reinterpret_cast to the assumed original type (and hope the C++ object model agrees with us).
|
||||||
|
*
|
||||||
|
* This, still violates strict aliasing rules when passing a sockaddr ptr to be read from/written to,
|
||||||
|
* as these will be library functions, we will consider that not my problem(TM).
|
||||||
|
* One could even argue that an implementation would need to reinterpret_cast back the pointer anyway.
|
||||||
|
*
|
||||||
|
* Another problem this assumption raises, is when we have to determine which sockaddr_* type an object is based on sa_family.
|
||||||
|
* Doing this via the provided sockaddr pointer would violate strict aliasing rules with our assumption.
|
||||||
|
* We have to std::memcpy to the base sockaddr to read this safely.
|
||||||
|
*
|
||||||
|
* https://man7.org/linux/man-pages/man3/sockaddr.3type.html has a note stating the following;
|
||||||
|
* "POSIX Issue 8 will fix this by requiring that implementations make sure that these structures can be safely used as they were designed."
|
||||||
|
* Where they plan to sweep the issue under the rug.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
bool AdapterUtils::GetAdapter(const std::string& name, Adapter* adapter, AdapterBuffer* buffer)
|
bool AdapterUtils::GetAdapter(const std::string& name, Adapter* adapter, AdapterBuffer* buffer)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue