From 7d5b0d23827e124da3eab2f39fe6cd52673ff4c4 Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 3 Jan 2021 22:55:37 +0000 Subject: [PATCH] * handle rawbytestrings in Win32Ansi2UnicodeMove properly, resolves #38299 git-svn-id: trunk@48021 - --- .gitattributes | 1 + rtl/win/syswin.inc | 8 ++++++++ tests/webtbs/tw38299.pp | 15 +++++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 tests/webtbs/tw38299.pp diff --git a/.gitattributes b/.gitattributes index 7fbcab1ab4..1e20795141 100644 --- a/.gitattributes +++ b/.gitattributes @@ -18631,6 +18631,7 @@ tests/webtbs/tw38267b.pp svneol=native#text/pascal tests/webtbs/tw3827.pp svneol=native#text/plain tests/webtbs/tw3829.pp svneol=native#text/plain tests/webtbs/tw38295.pp svneol=native#text/pascal +tests/webtbs/tw38299.pp svneol=native#text/pascal tests/webtbs/tw3833.pp svneol=native#text/plain tests/webtbs/tw3840.pp svneol=native#text/plain tests/webtbs/tw3841.pp svneol=native#text/plain diff --git a/rtl/win/syswin.inc b/rtl/win/syswin.inc index 63ee752569..f79b9849cd 100644 --- a/rtl/win/syswin.inc +++ b/rtl/win/syswin.inc @@ -609,6 +609,14 @@ procedure Win32Ansi2UnicodeMove(source:pchar;cp : TSystemCodePage;var dest:Unico dwFlags:=MB_PRECOMPOSED; end; destlen:=MultiByteToWideChar(cp, dwFlags, source, len, nil, 0); + { destlen=0 means that Windows cannot convert, so call the default + handler. This is similiar to what unix does and is a good fallback + if rawbyte strings are passed } + if destlen=0 then + begin + DefaultAnsi2UnicodeMove(source,DefaultSystemCodePage,dest,len); + exit; + end; // this will null-terminate setlength(dest, destlen); if destlen>0 then diff --git a/tests/webtbs/tw38299.pp b/tests/webtbs/tw38299.pp new file mode 100644 index 0000000000..8c52902b48 --- /dev/null +++ b/tests/webtbs/tw38299.pp @@ -0,0 +1,15 @@ +{ %opt=-O2 -Fcutf8 } +program bug; +const + cAnsiLineFeed = AnsiChar(#10); + cAnsiCarriageReturn = AnsiChar(#13); +var + test: RawByteString; +begin + test := '123'; + test := test + UTF8Encode('456') + '789' + cAnsiCarriageReturn + cAnsiLineFeed; + writeln(test); + if test<>'123456789'#13#10 then + halt(1); + writeln('ok'); +end.