1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-11 17:51:04 +00:00

add comment for memcpy, but don't replace it (it's likely fine)

This commit is contained in:
Desour 2024-10-05 10:23:46 +02:00
parent 76b5d120e8
commit 47c6f94e87

View file

@ -269,15 +269,13 @@ bool IPCChannelEnd::sendLarge(const void *data, size_t size, int timeout_ms) noe
memcpy(m_out->data, data, IPC_CHANNEL_MSG_SIZE); memcpy(m_out->data, data, IPC_CHANNEL_MSG_SIZE);
#if defined(IPC_CHANNEL_IMPLEMENTATION_WIN32) #if defined(IPC_CHANNEL_IMPLEMENTATION_WIN32)
post(m_sem_out); post(m_sem_out);
if (!wait(m_sem_in, timeout))
return false;
#else #else
post(m_out); post(m_out);
#endif
#if defined(IPC_CHANNEL_IMPLEMENTATION_WIN32)
if (!wait(m_sem_in, timeout))
#else
if (!wait(m_in, timeoutp)) if (!wait(m_in, timeoutp))
#endif
return false; return false;
#endif
size -= IPC_CHANNEL_MSG_SIZE; size -= IPC_CHANNEL_MSG_SIZE;
data = (u8 *)data + IPC_CHANNEL_MSG_SIZE; data = (u8 *)data + IPC_CHANNEL_MSG_SIZE;
} while (size > IPC_CHANNEL_MSG_SIZE); } while (size > IPC_CHANNEL_MSG_SIZE);
@ -295,22 +293,25 @@ bool IPCChannelEnd::recvWithTimeout(int timeout_ms) noexcept
{ {
#if defined(IPC_CHANNEL_IMPLEMENTATION_WIN32) #if defined(IPC_CHANNEL_IMPLEMENTATION_WIN32)
DWORD timeout = get_timeout(timeout_ms); DWORD timeout = get_timeout(timeout_ms);
if (!wait(m_sem_in, timeout))
return false;
#else #else
struct timespec timeout; struct timespec timeout;
struct timespec *timeoutp = set_timespec(&timeout, timeout_ms); struct timespec *timeoutp = set_timespec(&timeout, timeout_ms);
#endif
#if defined(IPC_CHANNEL_IMPLEMENTATION_WIN32)
if (!wait(m_sem_in, timeout))
#else
if (!wait(m_in, timeoutp)) if (!wait(m_in, timeoutp))
#endif
return false; return false;
#endif
size_t size = read_once(&m_in->size); size_t size = read_once(&m_in->size);
m_recv_size = size; m_recv_size = size;
// Note about memcpy: If the other thread is evil, it might change the contents
// of the memory while it's memcopied. We're assuming here that memcpy doesn't
// cause vulnerabilities due to this.
if (size <= IPC_CHANNEL_MSG_SIZE) { if (size <= IPC_CHANNEL_MSG_SIZE) {
// m_large_recv.size() is always >= IPC_CHANNEL_MSG_SIZE // small msg
// (m_large_recv.size() is always >= IPC_CHANNEL_MSG_SIZE)
memcpy(m_large_recv.data(), m_in->data, size); memcpy(m_large_recv.data(), m_in->data, size);
} else { } else {
// large msg
try { try {
m_large_recv.resize(size); m_large_recv.resize(size);
} catch (...) { } catch (...) {
@ -326,17 +327,15 @@ bool IPCChannelEnd::recvWithTimeout(int timeout_ms) noexcept
recv_data += IPC_CHANNEL_MSG_SIZE; recv_data += IPC_CHANNEL_MSG_SIZE;
#if defined(IPC_CHANNEL_IMPLEMENTATION_WIN32) #if defined(IPC_CHANNEL_IMPLEMENTATION_WIN32)
post(m_sem_out); post(m_sem_out);
if (!wait(m_sem_in, timeout))
return false;
#else #else
post(m_out); post(m_out);
#endif
#if defined(IPC_CHANNEL_IMPLEMENTATION_WIN32)
if (!wait(m_sem_in, timeout))
#else
if (!wait(m_in, timeoutp)) if (!wait(m_in, timeoutp))
#endif
return false; return false;
#endif
} while (size > IPC_CHANNEL_MSG_SIZE); } while (size > IPC_CHANNEL_MSG_SIZE);
memcpy(recv_data, m_in->data, size); //TODO: memcpy volatile save? memcpy(recv_data, m_in->data, size);
} }
return true; return true;
} }