Use more WideStringViews in cfxjse_formcalc_context utility functions
Instead of NUL-terminating string buffers and then reading the length
when constructing WideStringViews, explicitly create WideStringViews of
the correct fixed lengths.
Change-Id: If38233741a6db004afc335e50887dfb402d297c3
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/112550
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index a99c135..82a5097 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -667,18 +667,17 @@
WideString wsURL = WideString::FromUTF8(bsURL.AsStringView());
WideTextBuffer wsResultBuf;
- wchar_t szEncode[4];
- szEncode[0] = '%';
- szEncode[3] = 0;
+ wchar_t encode_buffer[3];
+ encode_buffer[0] = '%';
for (char32_t ch : pdfium::CodePointView(wsURL.AsStringView())) {
size_t i = 0;
size_t iCount = std::size(kStrUnsafe);
while (i < iCount) {
if (ch == kStrUnsafe[i]) {
int32_t iIndex = ch / 16;
- szEncode[1] = kStrCode[iIndex];
- szEncode[2] = kStrCode[ch - iIndex * 16];
- wsResultBuf << szEncode;
+ encode_buffer[1] = kStrCode[iIndex];
+ encode_buffer[2] = kStrCode[ch - iIndex * 16];
+ wsResultBuf << WideStringView(encode_buffer, 3);
break;
}
++i;
@@ -691,9 +690,9 @@
while (i < iCount) {
if (ch == kStrReserved[i]) {
int32_t iIndex = ch / 16;
- szEncode[1] = kStrCode[iIndex];
- szEncode[2] = kStrCode[ch - iIndex * 16];
- wsResultBuf << szEncode;
+ encode_buffer[1] = kStrCode[iIndex];
+ encode_buffer[2] = kStrCode[ch - iIndex * 16];
+ wsResultBuf << WideStringView(encode_buffer, 3);
break;
}
++i;
@@ -715,9 +714,9 @@
if ((ch >= 0x80 && ch <= 0xff) || ch <= 0x1f || ch == 0x7f) {
int32_t iIndex = ch / 16;
- szEncode[1] = kStrCode[iIndex];
- szEncode[2] = kStrCode[ch - iIndex * 16];
- wsResultBuf << szEncode;
+ encode_buffer[1] = kStrCode[iIndex];
+ encode_buffer[2] = kStrCode[ch - iIndex * 16];
+ wsResultBuf << WideStringView(encode_buffer, 3);
} else if (ch >= 0x20 && ch <= 0x7e) {
wsResultBuf.AppendChar(ch);
} else {
@@ -735,20 +734,20 @@
int32_t iIndex = 0;
if (iLen % 2 != 0) {
- szEncode[1] = '0';
- szEncode[2] = wsBuffer[iLen - 1];
+ encode_buffer[1] = '0';
+ encode_buffer[2] = wsBuffer[iLen - 1];
iIndex = iLen - 2;
} else {
- szEncode[1] = wsBuffer[iLen - 1];
- szEncode[2] = wsBuffer[iLen - 2];
+ encode_buffer[1] = wsBuffer[iLen - 1];
+ encode_buffer[2] = wsBuffer[iLen - 2];
iIndex = iLen - 3;
}
- wsResultBuf << szEncode;
+ wsResultBuf << WideStringView(encode_buffer, 3);
while (iIndex > 0) {
- szEncode[1] = wsBuffer[iIndex];
- szEncode[2] = wsBuffer[iIndex - 1];
+ encode_buffer[1] = wsBuffer[iIndex];
+ encode_buffer[2] = wsBuffer[iIndex - 1];
iIndex -= 2;
- wsResultBuf << szEncode;
+ wsResultBuf << WideStringView(encode_buffer, 3);
}
}
}
@@ -757,10 +756,10 @@
WideString EncodeHTML(const ByteString& bsHTML) {
WideString wsHTML = WideString::FromUTF8(bsHTML.AsStringView());
- wchar_t szEncode[9];
- szEncode[0] = '&';
- szEncode[1] = '#';
- szEncode[2] = 'x';
+ wchar_t encode_buffer[8];
+ encode_buffer[0] = '&';
+ encode_buffer[1] = '#';
+ encode_buffer[2] = 'x';
WideTextBuffer wsResultBuf;
for (char32_t ch : pdfium::CodePointView(wsHTML.AsStringView())) {
WideString htmlReserve;
@@ -772,21 +771,19 @@
wsResultBuf.AppendChar(static_cast<wchar_t>(ch));
} else if (ch < 256) {
int32_t iIndex = ch / 16;
- szEncode[3] = kStrCode[iIndex];
- szEncode[4] = kStrCode[ch - iIndex * 16];
- szEncode[5] = ';';
- szEncode[6] = 0;
- wsResultBuf << szEncode;
+ encode_buffer[3] = kStrCode[iIndex];
+ encode_buffer[4] = kStrCode[ch - iIndex * 16];
+ encode_buffer[5] = ';';
+ wsResultBuf << WideStringView(encode_buffer, 6);
} else if (ch < 65536) {
int32_t iBigByte = ch / 256;
int32_t iLittleByte = ch % 256;
- szEncode[3] = kStrCode[iBigByte / 16];
- szEncode[4] = kStrCode[iBigByte % 16];
- szEncode[5] = kStrCode[iLittleByte / 16];
- szEncode[6] = kStrCode[iLittleByte % 16];
- szEncode[7] = ';';
- szEncode[8] = 0;
- wsResultBuf << szEncode;
+ encode_buffer[3] = kStrCode[iBigByte / 16];
+ encode_buffer[4] = kStrCode[iBigByte % 16];
+ encode_buffer[5] = kStrCode[iLittleByte / 16];
+ encode_buffer[6] = kStrCode[iLittleByte % 16];
+ encode_buffer[7] = ';';
+ wsResultBuf << WideStringView(encode_buffer, 8);
} else {
// TODO(tsepez): Handle codepoint not in BMP.
}
@@ -797,10 +794,10 @@
WideString EncodeXML(const ByteString& bsXML) {
WideString wsXML = WideString::FromUTF8(bsXML.AsStringView());
WideTextBuffer wsResultBuf;
- wchar_t szEncode[9];
- szEncode[0] = '&';
- szEncode[1] = '#';
- szEncode[2] = 'x';
+ wchar_t encode_buffer[8];
+ encode_buffer[0] = '&';
+ encode_buffer[1] = '#';
+ encode_buffer[2] = 'x';
for (char32_t ch : pdfium::CodePointView(wsXML.AsStringView())) {
switch (ch) {
case '"':
@@ -833,21 +830,19 @@
wsResultBuf.AppendChar(static_cast<wchar_t>(ch));
} else if (ch < 256) {
int32_t iIndex = ch / 16;
- szEncode[3] = kStrCode[iIndex];
- szEncode[4] = kStrCode[ch - iIndex * 16];
- szEncode[5] = ';';
- szEncode[6] = 0;
- wsResultBuf << szEncode;
+ encode_buffer[3] = kStrCode[iIndex];
+ encode_buffer[4] = kStrCode[ch - iIndex * 16];
+ encode_buffer[5] = ';';
+ wsResultBuf << WideStringView(encode_buffer, 6);
} else if (ch < 65536) {
int32_t iBigByte = ch / 256;
int32_t iLittleByte = ch % 256;
- szEncode[3] = kStrCode[iBigByte / 16];
- szEncode[4] = kStrCode[iBigByte % 16];
- szEncode[5] = kStrCode[iLittleByte / 16];
- szEncode[6] = kStrCode[iLittleByte % 16];
- szEncode[7] = ';';
- szEncode[8] = 0;
- wsResultBuf << szEncode;
+ encode_buffer[3] = kStrCode[iBigByte / 16];
+ encode_buffer[4] = kStrCode[iBigByte % 16];
+ encode_buffer[5] = kStrCode[iLittleByte / 16];
+ encode_buffer[6] = kStrCode[iLittleByte % 16];
+ encode_buffer[7] = ';';
+ wsResultBuf << WideStringView(encode_buffer, 8);
} else {
// TODO(tsepez): Handle codepoint not in BMP.
}