fix(gx): fix buffer overruns in TEXTLINETEXTURE::WriteGeometry

This commit is contained in:
fallenoak 2025-12-21 21:24:32 -06:00
parent 1352f0ba50
commit 84b16f2aeb
No known key found for this signature in database
GPG Key ID: 7628F8E61AEA070D

View File

@ -37,17 +37,13 @@ void TEXTLINETEXTURE::WriteGeometry(CGxVertexPCT* buffer, const CImVector& fontC
? this->m_colors.Count() ? this->m_colors.Count()
: 0; : 0;
if (vertexOffset >= this->m_vert.Count()) { // Drop shadows
return;
}
uint32_t v24 = this->m_vert.Count() - vertexOffset;
if (vertexCount >= v24) {
vertexCount = v24;
}
if (hasShadow) { if (hasShadow) {
if (vertexOffset < this->m_vert.Count()) {
int32_t availableVertexCount = this->m_vert.Count() - vertexOffset;
int32_t shadowVertexCount = vertexCount >= availableVertexCount ? availableVertexCount : vertexCount;
C3Vector shadowTranslation = { C3Vector shadowTranslation = {
viewTranslation.x + floor(ScreenToPixelWidth(0, shadowOffset.x)), viewTranslation.x + floor(ScreenToPixelWidth(0, shadowOffset.x)),
viewTranslation.y + floor(ScreenToPixelHeight(0, shadowOffset.y)), viewTranslation.y + floor(ScreenToPixelHeight(0, shadowOffset.y)),
@ -56,7 +52,7 @@ void TEXTLINETEXTURE::WriteGeometry(CGxVertexPCT* buffer, const CImVector& fontC
auto color = colorCount ? this->m_colors[vertexOffset] : fontColor; auto color = colorCount ? this->m_colors[vertexOffset] : fontColor;
for (int32_t i = 0; i < vertexCount; i++) { for (int32_t i = 0; i < shadowVertexCount; i++) {
auto& vertex = this->m_vert[vertexOffset + i]; auto& vertex = this->m_vert[vertexOffset + i];
C3Vector p = { C3Vector p = {
@ -79,13 +75,27 @@ void TEXTLINETEXTURE::WriteGeometry(CGxVertexPCT* buffer, const CImVector& fontC
buffer++; buffer++;
} }
vertexCount -= shadowVertexCount;
if (vertexOffset + shadowVertexCount >= this->m_vert.Count()) {
vertexOffset = 0;
} }
} else {
vertexOffset -= this->m_vert.Count();
}
}
// Characters
if (vertexCount && vertexOffset < this->m_vert.Count()) {
int32_t availableVertexCount = this->m_vert.Count() - vertexOffset;
int32_t characterVertexCount = vertexCount >= availableVertexCount ? availableVertexCount : vertexCount;
// if (BATCHEDRENDERFONTDESC::s_billboarded) { // if (BATCHEDRENDERFONTDESC::s_billboarded) {
// // TODO // // TODO
// } // }
for (int32_t i = 0; i < vertexCount; i++) { for (int32_t i = 0; i < characterVertexCount; i++) {
auto& vertex = this->m_vert[vertexOffset + i]; auto& vertex = this->m_vert[vertexOffset + i];
auto color = colorCount ? this->m_colors[vertexOffset + i] : fontColor; auto color = colorCount ? this->m_colors[vertexOffset + i] : fontColor;
@ -110,6 +120,7 @@ void TEXTLINETEXTURE::WriteGeometry(CGxVertexPCT* buffer, const CImVector& fontC
buffer++; buffer++;
} }
} }
}
CGxString* CGxString::GetNewString(int32_t linkOnList) { CGxString* CGxString::GetNewString(int32_t linkOnList) {
CGxString* string = g_freeStrings.Head(); CGxString* string = g_freeStrings.Head();