summaryrefslogtreecommitdiff
path: root/basic
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2017-03-20 15:38:31 +0100
committerStephan Bergmann <sbergman@redhat.com>2017-03-20 15:46:50 +0100
commit36b4b0fb8c9a3499cfd2f05687ff30c2bfa13706 (patch)
tree9fd357c27f85111bdcf1752c3fd3dd6217d33415 /basic
parent028ef4748e53aa8f72c6464ce6bbeeb28c61d30c (diff)
Fix CurDir on Windows
* Allow lowercase argument. (And properly check the sal_Unicode value with rtl::isAsciiUpperCase instead of with isalpha, which would cause UB for values outside of unsigned char + EOF). * Use _wgetdcwd to get a UTF-16 path in the first place (instead of erroneously converting via createFromAscii and assuming the path only contains 7-bit ASCII characters). * At least with a MSVC 2015 Update 3 --enable-dbgutil build, a call like CurDir("A") for a non-existent drive A will cause a failure message box Microsoft Visual C++ Runtime Library Debug Assertion Failed! Program: ...\instdir\program\soffice.bin File: minkernel\crts\ucrt\src\desktopcrt\misc\getcwd.cpp Line: 225 Expression: ("Invalid Drive", 0) though, which appears it can't be intercepted---trying with a _set_thread_local_invalid_parameter_handler around the call to _wgetdcwd didn't have any effect. Change-Id: I666f84b0695152c0f2c25de3bae100e58929594a
Diffstat (limited to 'basic')
-rw-r--r--basic/source/runtime/methods.cxx23
1 files changed, 9 insertions, 14 deletions
diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx
index 33e4f3640a40..b5746d01427d 100644
--- a/basic/source/runtime/methods.cxx
+++ b/basic/source/runtime/methods.cxx
@@ -31,6 +31,7 @@
#include <vcl/msgbox.hxx>
#include <basic/sbx.hxx>
#include <svl/zforlist.hxx>
+#include <rtl/character.hxx>
#include <rtl/math.hxx>
#include <tools/urlobj.hxx>
#include <osl/time.h>
@@ -405,24 +406,18 @@ RTLFUNC(CurDir)
StarBASIC::Error( ERRCODE_BASIC_BAD_ARGUMENT );
return;
}
- else
+ auto c = rtl::toAsciiUpperCase(aDrive[0]);
+ if ( !rtl::isAsciiUpperCase( c ) )
{
- nCurDir = (int)aDrive[0];
- if ( !isalpha( nCurDir ) )
- {
- StarBASIC::Error( ERRCODE_BASIC_BAD_ARGUMENT );
- return;
- }
- else
- {
- nCurDir -= ( 'A' - 1 );
- }
+ StarBASIC::Error( ERRCODE_BASIC_BAD_ARGUMENT );
+ return;
}
+ nCurDir = c - 'A' + 1;
}
- char pBuffer[ _MAX_PATH ];
- if ( _getdcwd( nCurDir, pBuffer, _MAX_PATH ) != nullptr )
+ wchar_t pBuffer[ _MAX_PATH ];
+ if ( _wgetdcwd( nCurDir, pBuffer, _MAX_PATH ) != nullptr )
{
- rPar.Get(0)->PutString( OUString::createFromAscii( pBuffer ) );
+ rPar.Get(0)->PutString( OUString( pBuffer ) );
}
else
{