fixed GH #2042: Android abstract namespace local socket address

This commit is contained in:
Günter Obiltschnig
2017-12-18 10:14:09 +01:00
parent 3f8c637610
commit 98feaa7bb9
3 changed files with 26 additions and 11 deletions

View File

@@ -268,7 +268,7 @@ inline void SocketAddress::newLocal(const sockaddr_un* sockAddr)
inline void SocketAddress::newLocal(const std::string& path) inline void SocketAddress::newLocal(const std::string& path)
{ {
_pImpl = new Poco::Net::Impl::LocalSocketAddressImpl(path.c_str()); _pImpl = new Poco::Net::Impl::LocalSocketAddressImpl(path.c_str(), path.size());
} }
#endif // POCO_OS_FAMILY_UNIX #endif // POCO_OS_FAMILY_UNIX

View File

@@ -185,6 +185,7 @@ class Net_API LocalSocketAddressImpl: public SocketAddressImpl
public: public:
LocalSocketAddressImpl(const struct sockaddr_un* addr); LocalSocketAddressImpl(const struct sockaddr_un* addr);
LocalSocketAddressImpl(const char* path); LocalSocketAddressImpl(const char* path);
LocalSocketAddressImpl(const char* path, std::size_t length);
~LocalSocketAddressImpl(); ~LocalSocketAddressImpl();
IPAddress host() const; IPAddress host() const;
UInt16 port() const; UInt16 port() const;

View File

@@ -144,6 +144,8 @@ LocalSocketAddressImpl::LocalSocketAddressImpl(const struct sockaddr_un* addr)
LocalSocketAddressImpl::LocalSocketAddressImpl(const char* path) LocalSocketAddressImpl::LocalSocketAddressImpl(const char* path)
{ {
poco_assert (std::strlen(path) < sizeof(_pAddr->sun_path));
_pAddr = new sockaddr_un; _pAddr = new sockaddr_un;
poco_set_sun_len(_pAddr, std::strlen(path) + sizeof(struct sockaddr_un) - sizeof(_pAddr->sun_path) + 1); poco_set_sun_len(_pAddr, std::strlen(path) + sizeof(struct sockaddr_un) - sizeof(_pAddr->sun_path) + 1);
_pAddr->sun_family = AF_UNIX; _pAddr->sun_family = AF_UNIX;
@@ -151,6 +153,18 @@ LocalSocketAddressImpl::LocalSocketAddressImpl(const char* path)
} }
LocalSocketAddressImpl::LocalSocketAddressImpl(const char* path, std::size_t length)
{
poco_assert (length < sizeof(_pAddr->sun_path));
_pAddr = new sockaddr_un;
poco_set_sun_len(_pAddr, length + sizeof(struct sockaddr_un) - sizeof(_pAddr->sun_path) + 1);
_pAddr->sun_family = AF_UNIX;
std::memcpy(_pAddr->sun_path, path, length);
_pAddr->sun_path[length] = 0;
}
LocalSocketAddressImpl::~LocalSocketAddressImpl() LocalSocketAddressImpl::~LocalSocketAddressImpl()
{ {
delete _pAddr; delete _pAddr;