summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--tests/fCmd.test22
-rw-r--r--win/tclWinFile.c16
3 files changed, 38 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 83954c9..265faa8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-03-19 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * win/tclWinFile.c: [Bug 2893771]: file stat fails on locked files
+ on win32.
+
2013-03-18 Donal K. Fellows <dkf@users.sf.net>
* tests/cmdAH.test (cmdAH-19.12): [Bug 3608360]: Added test to ensure
diff --git a/tests/fCmd.test b/tests/fCmd.test
index c5ee676..6b054f7 100644
--- a/tests/fCmd.test
+++ b/tests/fCmd.test
@@ -2407,6 +2407,28 @@ cd [temporaryDirectory]
file delete -force abc.link
cd [workingDirectory]
+test fCmd-30.1 {file writable on 'My Documents'} -setup {
+ # Get the localized version of the folder name by looking in the registry.
+ set mydocsname [registry get {HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders} Personal]
+} -constraints {win reg} -body {
+ file writable $mydocsname
+} -result 1
+test fCmd-30.2 {file readable on 'NTUSER.DAT'} -constraints {win} -body {
+ expr {[info exists env(USERPROFILE)]
+ && [file exists $env(USERPROFILE)/NTUSER.DAT]
+ && [file readable $env(USERPROFILE)/NTUSER.DAT]}
+} -result {1}
+test fCmd-30.3 {file readable on 'pagefile.sys'} -constraints {win} -body {
+ set r {}
+ if {[info exists env(SystemDrive)]} {
+ set path $env(SystemDrive)/pagefile.sys
+ lappend r exists [file exists $path]
+ lappend r readable [file readable $path]
+ lappend r stat [catch {file stat $path a} e] $e
+ }
+ return $r
+} -result {exists 1 readable 0 stat 0 {}}
+
removeFile abc2.file
removeFile abc.file
removeDirectory abc2.dir
diff --git a/win/tclWinFile.c b/win/tclWinFile.c
index 8ea6548..8e41096 100644
--- a/win/tclWinFile.c
+++ b/win/tclWinFile.c
@@ -1337,11 +1337,14 @@ NativeAccess(
if (attr == 0xffffffff) {
/*
- * File doesn't exist.
+ * File might not exist.
*/
- TclWinConvertError(GetLastError());
- return -1;
+ DWORD lasterror = GetLastError();
+ if (lasterror != ERROR_SHARING_VIOLATION) {
+ TclWinConvertError(lasterror);
+ return -1;
+ }
}
if (mode == F_OK) {
@@ -1889,8 +1892,11 @@ NativeStat(nativePath, statPtr, checkLinks)
if((*tclWinProcs->getFileAttributesExProc)(nativePath,
GetFileExInfoStandard,
&data) != TRUE) {
- Tcl_SetErrno(ENOENT);
- return -1;
+ DWORD lasterror = GetLastError();
+ if (lasterror != ERROR_SHARING_VIOLATION) {
+ TclWinConvertError(lasterror);
+ return -1;
+ }
}