]> git.tdb.fi Git - libs/core.git/blobdiff - source/fs/stat.cpp
Fix GetSecurityInfo error checking and request appropriate access to the file
[libs/core.git] / source / fs / stat.cpp
index 716a7d6a4f82707587aed2a9b452aa4bde87715c..77564f0ecd2d6c49b3297db2733686423de870bb 100644 (file)
@@ -4,6 +4,7 @@
 #else
 #define _FILE_OFFSET_BITS 64
 #include <cerrno>
+#include <unistd.h>
 #include <sys/stat.h>
 #include <grp.h>
 #include <pwd.h>
@@ -91,9 +92,15 @@ Stat Stat::stat(const Path &path)
 {
 #ifdef WIN32
        HANDLE handle;
-       handle = CreateFile(path.str().c_str(), 0, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
+       handle = CreateFile(path.str().c_str(), READ_CONTROL, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS, 0);
        if(handle==INVALID_HANDLE_VALUE)
-               throw system_error("CreateFile");
+       {
+               DWORD err = GetLastError();
+               if(err==ERROR_FILE_NOT_FOUND)
+                       return Stat();
+               else
+                       throw system_error("CreateFile", err);
+       }
 
        BY_HANDLE_FILE_INFORMATION info;
        if(!GetFileInformationByHandle(handle, &info))
@@ -115,10 +122,12 @@ Stat Stat::stat(const Path &path)
        PSECURITY_DESCRIPTOR sec_desc;
        PSID owner = 0;
        PSID group = 0;
-       if(!GetSecurityInfo(handle, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION, &owner, &group, 0, 0, &sec_desc))
+       const SECURITY_INFORMATION sec_info = OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION;
+       DWORD err = GetSecurityInfo(handle, SE_FILE_OBJECT, sec_info, &owner, &group, 0, 0, &sec_desc);
+       if(err)
        {
                CloseHandle(handle);
-               throw system_error("GetSecurityInfo");
+               throw system_error("GetSecurityInfo", err);
        }
 
        if(owner)