On 17/05/2018 01:56, Brian Burkhalter wrote:
Hi Ivan,

On May 16, 2018, at 2:54 PM, Ivan Gerasimov <[email protected]> wrote:

Maybe it is better to compare fileData.cFileName with the pathbuf to make sure 
we're dealing with the correct file?
Certainly making this change to the previous proposal would do no harm:

--- a/src/java.base/windows/native/libjava/WinNTFileSystem_md.c
+++ b/src/java.base/windows/native/libjava/WinNTFileSystem_md.c
@@ -541,10 +541,13 @@
                  WIN32_FIND_DATAW fileData;
                  HANDLE h = FindFirstFileW(pathbuf, &fileData);
                  if (h != INVALID_HANDLE_VALUE) {
-                    ULARGE_INTEGER length;
-                    length.LowPart = fileData.nFileSizeLow;
-                    length.HighPart = fileData.nFileSizeHigh;
-                    rv = (jlong)length.QuadPart;
+                    size_t off = wcslen(pathbuf) - wcslen(fileData.cFileName);
+                    if (wcscmp(pathbuf + off, fileData.cFileName) == 0) {
+                        ULARGE_INTEGER length;
+                        length.LowPart = fileData.nFileSizeLow;
+                        length.HighPart = fileData.nFileSizeHigh;
+                        rv = (jlong)length.QuadPart;
+                    }
                      FindClose(h);
                  }
              }

The offset in the string comparison is necessary as “C:\\pagefile.sys” becomes 
“pagefile.sys” in fileData.cFileName. I’m not certain that this will work in 
all cases however but it is certainly no worse than before.

Can the call to _wstati64 be removed? That is, if GetFileAttributesExW fails with a sharing violation then just use FindFirstFileW as the fallback.

-Alan


Reply via email to