Browse Source

Bug fix: Unicode contents in web sources was incorrectly decoded

Casting RawByteString to UTF8String does not properly decode UTF8

Source commit: 85ab7076039c7fc9f8b35c73b7c843ed6f892834
Martin Prikryl 9 months ago
parent
commit
82ca508ba5

+ 6 - 0
source/core/Common.cpp

@@ -125,6 +125,12 @@ UnicodeString AnsiToString(const char * S, size_t Len)
   return UnicodeString(AnsiString(S, Len));
 }
 //---------------------------------------------------------------------------
+UnicodeString UTFToString(const RawByteString & S)
+{
+  // Simply casting RawByteString to UTF8String does not work
+  return UnicodeString(UTF8String(S.c_str(), S.Length()));
+}
+//---------------------------------------------------------------------------
 // Note similar function ValidLocalFileName
 UnicodeString MakeValidFileName(UnicodeString FileName)
 {

+ 1 - 0
source/core/Common.h

@@ -47,6 +47,7 @@ void __fastcall Shred(AnsiString & Str);
 void __fastcall Shred(RawByteString & Str);
 UnicodeString AnsiToString(const RawByteString & S);
 UnicodeString AnsiToString(const char * S, size_t Len);
+UnicodeString UTFToString(const RawByteString & S);
 UnicodeString MakeValidFileName(UnicodeString FileName);
 UnicodeString RootKeyToStr(HKEY RootKey, const UnicodeString & Default = EmptyStr);
 UnicodeString BooleanToStr(bool B);

+ 1 - 2
source/core/Http.cpp

@@ -173,8 +173,7 @@ void THttp::Put(const UnicodeString & Request)
 //---------------------------------------------------------------------------
 UnicodeString THttp::GetResponse()
 {
-  UTF8String UtfResponse(FResponse);
-  return UnicodeString(UtfResponse);
+  return UTFToString(FResponse);
 }
 //---------------------------------------------------------------------------
 int THttp::NeonBodyReaderImpl(const char * Buf, size_t Len)

+ 1 - 0
source/core/NeonIntf.h

@@ -8,6 +8,7 @@
 #include <SessionData.h>
 //---------------------------------------------------------------------------
 #define StrToNeon(S) UTF8String(S).c_str()
+// Should be used with character pointer only
 #define StrFromNeon(S) UnicodeString(UTF8String(S))
 //---------------------------------------------------------------------------
 struct TNeonCertificateData

+ 1 - 0
source/core/S3FileSystem.cpp

@@ -29,6 +29,7 @@
 //---------------------------------------------------------------------------
 #pragma package(smart_init)
 //---------------------------------------------------------------------------
+// Should be used with character pointer only
 #define StrFromS3(S) StrFromNeon(S)
 #define StrToS3(S) StrToNeon(S)
 //---------------------------------------------------------------------------

+ 2 - 2
source/core/WebDAVFileSystem.cpp

@@ -80,7 +80,7 @@ static UnicodeString PathUnescape(const char * Path)
     // In such case, take the path as is and we will probably overwrite the name with "display name".
     UtfResult = Path;
   }
-  UnicodeString Result = StrFromNeon(UtfResult);
+  UnicodeString Result = UnicodeString(UtfResult);
   return Result;
 }
 //---------------------------------------------------------------------------
@@ -1549,7 +1549,7 @@ void TWebDAVFileSystem::NeonPreSend(
   TWebDAVFileSystem * FileSystem = SessionContext->FileSystem;
 
   SessionContext->AuthorizationProtocol = EmptyStr;
-  UnicodeString HeaderBuf(StrFromNeon(AnsiString(Header->data, Header->used)));
+  UnicodeString HeaderBuf(UnicodeString(AnsiString(Header->data, Header->used)));
   const UnicodeString AuthorizationHeaderName(L"Authorization:");
   int P = HeaderBuf.Pos(AuthorizationHeaderName);
   if (P > 0)