Comm::TcpAcceptor::acceptInto(Comm::ConnectionPointer &details)
{
++statCounter.syscalls.sock.accepts;
- struct addrinfo *gai = nullptr;
- Ip::Address::InitAddr(gai);
errcode = 0; // reset local errno copy.
- const auto rawSock = accept(conn->fd, gai->ai_addr, &gai->ai_addrlen);
+ struct sockaddr_storage remoteAddress = {};
+ socklen_t remoteAddressSize = sizeof(remoteAddress);
+ const auto rawSock = accept(conn->fd, reinterpret_cast<struct sockaddr *>(&remoteAddress), &remoteAddressSize);
if (rawSock < 0) {
errcode = errno; // store last accept errno locally.
-
- Ip::Address::FreeAddr(gai);
-
if (ignoreErrno(errcode) || errcode == ECONNABORTED) {
debugs(50, 5, status() << ": " << xstrerr(errcode));
return false;
details->fd = sock;
details->enterOrphanage();
- details->remote = *gai;
+ Assure(remoteAddressSize <= socklen_t(sizeof(remoteAddress)));
+ details->remote = remoteAddress;
// lookup the local-end details of this new connection
- Ip::Address::InitAddr(gai);
- details->local.setEmpty();
- if (getsockname(sock, gai->ai_addr, &gai->ai_addrlen) != 0) {
+ struct sockaddr_storage localAddress = {};
+ socklen_t localAddressSize = sizeof(localAddress);
+ if (getsockname(sock, reinterpret_cast<struct sockaddr *>(&localAddress), &localAddressSize) != 0) {
int xerrno = errno;
- Ip::Address::FreeAddr(gai);
debugs(50, DBG_IMPORTANT, "ERROR: Closing accepted TCP connection after failing to obtain its local IP address" <<
Debug::Extra << "accepted connection: " << details <<
Debug::Extra << "getsockname(2) error: " << xstrerr(xerrno));
return false;
}
- details->local = *gai;
- Ip::Address::FreeAddr(gai);
+ Assure(localAddressSize <= socklen_t(sizeof(localAddress)));
+ details->local = localAddress;
if (conn->flags & COMM_TRANSPARENT) { // the real client/dest IP address must be already available via getsockname()
details->flags |= COMM_TRANSPARENT;