From: SourceForge.net <no...@so...> - 2005-05-03 23:09:13
|
Bugs item #1193497, was opened at 2005-05-01 14:26 Message generated for change (Comment added) made by jfg118 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110894&aid=1193497&group_id=10894 Category: None Group: development: 8.5a3 Status: Open Resolution: Invalid Priority: 5 Submitted By: fvogelnew1 (fvogelnew1) Assigned to: Vince Darley (vincentdarley) Summary: file writable lies for certain XP directories Initial Comment: Windows XP SP2 french, Tcl/Tk cvs HEAD file writable "C:/Documents and Settings/<account>/Mes Documents/mydir" returns 1 if mydir does exist, or 0 if not. This is correct. file writable "C:/Documents and Settings/" returns also 1, which is correct. But: file writable "C:/Documents and Settings/<account>/Mes Documents" returns 0 but it should be 1 <account> is my account name (with administrator rights), this directory of course exists and I'm allowed to write files in it. ---------------------------------------------------------------------- Comment By: Jason (jfg118) Date: 2005-05-03 16:09 Message: Logged In: YES user_id=1266631 Something like this would check the ACL list for writable permission, written in C++ though. bool is_writable(const char *path) { char psd_buf[1024], *psd_ptr = psd_buf, *psd_alloc = 0; DWORD sd_rlen; if (!GetFileSecurity (path, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, psd_buf, sizeof(psd_buf), &sd_rlen)) { return false; // Failed ... } if (sizeof(psd_buf) < sd_rlen) { psd_alloc = new char[sd_rlen]; DWORD psd_alloc_rlen; if (!GetFileSecurity (path, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, psd_alloc, sd_rlen, &psd_alloc_rlen) || sd_rlen < psd_alloc_rlen) { delete [] psd_alloc; return false; // Failed .... } psd_ptr = psd_alloc; sd_rlen = psd_alloc_rlen; } HANDLE hToken = NULL, hIToken = NULL; if ( !OpenProcessToken ( GetCurrentProcess ( ), TOKEN_DUPLICATE, &hToken ) ) { if (psd_alloc) delete [] psd_alloc; return false; } BOOL status = DuplicateToken (hToken, SecurityIdentification, &hIToken); CloseHandle (hToken); if (! status) { if (psd_alloc) delete [] psd_alloc; return false; } GENERIC_MAPPING mapping = { FILE_GENERIC_READ, FILE_GENERIC_WRITE, FILE_GENERIC_EXECUTE, FILE_ALL_ACCESS }; char pbuf[sizeof (PRIVILEGE_SET) + 3 * sizeof (LUID_AND_ATTRIBUTES)]; DWORD plength = sizeof(pbuf), granted; if (AccessCheck (psd_ptr, hIToken, FILE_WRITE_DATA, &mapping, (PPRIVILEGE_SET) pbuf, &plength, &granted, &status)) retVal = true; CloseHandle(hIToken); if (psd_alloc) delete [] psd_alloc; return true; } ---------------------------------------------------------------------- Comment By: Jason (jfg118) Date: 2005-05-03 16:05 Message: Logged In: YES user_id=1266631 Clearly from the MSDN document it states that the "Read-only attribute" does not mean that the directory is not writable, but instead means it is a "special customized folder". The writeability is determined by the ACL list. From MSDN : CAUSE Unlike the Read-only attribute for a file, the Read-only attribute for a folder is typically ignored by Windows, Windows components and accessories, and other programs. For example, you can delete, rename, and change a folder with the Read-only attribute by using Windows Explorer. The Read-only and System attributes is only used by Windows Explorer to determine whether the folder is a special folder, such as a system folder that has its view customized by Windows (for example, My Documents, Favorites, Fonts, Downloaded Program Files), or a folder that you customized by using the Customize tab of the folder's Properties dialog box. ---------------------------------------------------------------------- Comment By: fvogelnew1 (fvogelnew1) Date: 2005-05-02 15:11 Message: Logged In: YES user_id=1245417 The fact that the read only box cannot be unchecked using the Explorer is a Windows by-design item, yes. But all the directories of my report have this attribute set. Nevertheless, [file writable] returns 0 or 1 depending on which directory it checks. Moreover, I *can* write files in all of them. IMO this means that the way tcl implements the file writable command should be revised to return 1 for all of them. Otherwise, how can I check if a directory is writable or not? In other words, there should be more/other checks than the read only attribute (I know there is already more, see bug 749876, but this is apparently not enough). ---------------------------------------------------------------------- Comment By: Jeffrey Hobbs (hobbs) Date: 2005-05-02 14:55 Message: Logged In: YES user_id=72656 Which would imply that this is a Windows by-design item. ---------------------------------------------------------------------- Comment By: fvogelnew1 (fvogelnew1) Date: 2005-05-02 13:52 Message: Logged In: YES user_id=1245417 And apparently this is by design of Windows. See http://support.microsoft.com/kb/326549/en-us ---------------------------------------------------------------------- Comment By: fvogelnew1 (fvogelnew1) Date: 2005-05-02 13:46 Message: Logged In: YES user_id=1245417 And I can't remove the read only attribute using Explorer. It let me do it, but if I reopen the Properties box, it is here again. ---------------------------------------------------------------------- Comment By: fvogelnew1 (fvogelnew1) Date: 2005-05-02 13:25 Message: Logged In: YES user_id=1245417 All the directories I mention in my report show the read only attribute if I look at their properties using Explorer, even "mydir" which I created manually in "Mes Documents". ---------------------------------------------------------------------- Comment By: Jeffrey Hobbs (hobbs) Date: 2005-05-02 13:07 Message: Logged In: YES user_id=72656 While you can actually write to that directory, I think Windows handles it specially. If I do through Explorer and do Properties on my "My Documents" dir, it does clearly have the "Read only" box checked, which is correctly reported by Tcl as well. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110894&aid=1193497&group_id=10894 |