summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2013-03-19 13:48:37 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2013-03-19 13:48:37 (GMT)
commitddc36ee47351940ce5a6909c91bcda6709e5ad70 (patch)
treeb98cf0261f632507519e0f2c89046224feb09eac
parent6f7bddf8cda3d77db571c7fd4efe5f67c06ea118 (diff)
parente22aa5854dc50ba15a3966093bec99d37059b93e (diff)
downloadtcl-ddc36ee47351940ce5a6909c91bcda6709e5ad70.zip
tcl-ddc36ee47351940ce5a6909c91bcda6709e5ad70.tar.gz
tcl-ddc36ee47351940ce5a6909c91bcda6709e5ad70.tar.bz2
[Bug 2893771]: file stat fails on locked files on win32.
-rw-r--r--ChangeLog5
-rw-r--r--tests/fCmd.test22
-rw-r--r--win/tclWinFile.c22
3 files changed, 44 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 7bf6d0d..0fef3c3 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 4e27d22..682d5e4 100644
--- a/tests/fCmd.test
+++ b/tests/fCmd.test
@@ -2539,6 +2539,28 @@ file delete -force d1/d2
file delete -force d1
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 3817fa4..b5e104f 100644
--- a/win/tclWinFile.c
+++ b/win/tclWinFile.c
@@ -1543,11 +1543,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) {
@@ -2046,8 +2049,17 @@ NativeStat(
if ((*tclWinProcs->getFileAttributesExProc)(nativePath,
GetFileExInfoStandard, &data) != TRUE) {
- Tcl_SetErrno(ENOENT);
- return -1;
+ HANDLE hFind;
+ WIN32_FIND_DATAT ffd;
+ DWORD lasterror = GetLastError();
+
+ if (lasterror != ERROR_SHARING_VIOLATION) {
+ TclWinConvertError(lasterror);
+ return -1;
+ }
+ hFind = (*tclWinProcs->findFirstFileProc)(nativePath, &ffd);
+ memcpy(&data, &ffd, sizeof(data));
+ FindClose(hFind);
}
attr = data.dwFileAttributes;