correct potential heap corruption issue within Socket, which could cause strange failure behavior;

pull/121/merge
Bryan Biedenkapp 1 week ago
parent 608a7a5b48
commit 48d3a07a1c

@ -548,9 +548,9 @@ bool Socket::write(BufferQueue* buffers, ssize_t* lenWritten) noexcept
} }
int sent = 0, msgs = 0; int sent = 0, msgs = 0;
struct sockaddr_storage* addresses[MAX_BUFFER_COUNT]; struct sockaddr_storage* addresses[MAX_BUFFER_COUNT] = { nullptr };
struct mmsghdr headers[MAX_BUFFER_COUNT]; struct mmsghdr headers[MAX_BUFFER_COUNT] = { 0 };
struct iovec chunks[MAX_BUFFER_COUNT]; struct iovec chunks[MAX_BUFFER_COUNT] = { 0 };
// create mmsghdrs from input buffers and send them at once // create mmsghdrs from input buffers and send them at once
for (size_t i = 0U; i < currentQueueSize; ++i) { for (size_t i = 0U; i < currentQueueSize; ++i) {
@ -644,23 +644,32 @@ bool Socket::write(BufferQueue* buffers, ssize_t* lenWritten) noexcept
continue; continue;
} }
addresses[i] = new sockaddr_storage; int msgIdx = msgs;
::memcpy(addresses[i], &address, sizeof(sockaddr_storage));
chunks[i].iov_len = iov_length; addresses[msgIdx] = new sockaddr_storage;
chunks[i].iov_base = iov_buffer; ::memcpy(addresses[msgIdx], &address, sizeof(sockaddr_storage));
chunks[msgIdx].iov_len = iov_length;
chunks[msgIdx].iov_base = iov_buffer;
sent += iov_length; sent += iov_length;
headers[i].msg_hdr.msg_name = (void*)addresses[i]; headers[msgIdx].msg_hdr.msg_name = (void*)addresses[msgIdx];
headers[i].msg_hdr.msg_namelen = addrLen; headers[msgIdx].msg_hdr.msg_namelen = addrLen;
headers[i].msg_hdr.msg_iov = &chunks[i]; headers[msgIdx].msg_hdr.msg_iov = &chunks[msgIdx];
headers[i].msg_hdr.msg_iovlen = 1; headers[msgIdx].msg_hdr.msg_iovlen = 1;
headers[i].msg_hdr.msg_control = 0; headers[msgIdx].msg_hdr.msg_control = 0;
headers[i].msg_hdr.msg_controllen = 0; headers[msgIdx].msg_hdr.msg_controllen = 0;
++msgs; ++msgs;
} }
if (msgs == 0) {
if (lenWritten != nullptr) {
*lenWritten = -1;
}
return false;
}
if (sendmmsg(m_fd, headers, msgs, 0) < 0) { if (sendmmsg(m_fd, headers, msgs, 0) < 0) {
#if defined(_WIN32) #if defined(_WIN32)
LogError(LOG_NET, "Error returned from sendmmsg, err: %lu", ::GetLastError()); LogError(LOG_NET, "Error returned from sendmmsg, err: %lu", ::GetLastError());
@ -690,7 +699,7 @@ bool Socket::write(BufferQueue* buffers, ssize_t* lenWritten) noexcept
} }
// cleanup buffers // cleanup buffers
for (size_t i = 0U; i < currentQueueSize; i++) { for (int i = 0; i < msgs; i++) {
if (addresses[i] != nullptr) { if (addresses[i] != nullptr) {
delete addresses[i]; delete addresses[i];
addresses[i] = nullptr; addresses[i] = nullptr;

Loading…
Cancel
Save

Powered by TurnKey Linux.