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.
         }