From: corinna DOT vinschen AT cityweb DOT de (Corinna Vinschen) Subject: chown succeed, but SID is wrong! 3 Jan 1999 15:24:19 -0800 Message-ID: <368FF53A.D474078F.cygnus.cygwin32.developers@cityweb.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: cygwin32-developers AT cygnus DOT com Funny: chown works as expected, with the following exception: My standalone workstation is named `corinna' and my personal user account is named `corinna', too. The relative SID is 1000. If I start the command chown corinna foo and later ls -lGn foo the surprising result is: -rwxr-xr-x 1 65535 300396 Jan 1 19:38 foo instead of -rwxr-xr-x 1 1000 300396 Jan 1 19:38 foo If I look into this files properties in the explorer, the owner is `unknown'. I have found, that the function LookupAccountName() returns the SID for the account corinna, but with the SID-type indicator set to SidTypeDomain! The function has returned the SID for the computer, not for the user. The tool XCACLS.EXE from NTRESKIT has the same error. I have patched the function chown in syscalls.cc. I'm not sure, if this is a reasonable solution, but it works for me and I think it's a good start for e real solution. I have attached the patch. It only does the following: If the returned SidType is not SidTypeUser, It calls LookupAccountName() again, with username set to `returned_domain_name\\username'. Regards, Corinna ChangeLog: ========== Sun Jan 3 23:20:00 1998 Corinna Vinschen * syscalls.cc (chown): Retry LookupAccountName with username set to domain\\username, if returned SID-Type is not SidTypeUser. Index: syscalls.cc =================================================================== RCS file: /src/cvsroot/winsup-981230/syscalls.cc,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 syscalls.cc --- syscalls.cc 1998/12/30 23:01:58 1.1.1.1 +++ syscalls.cc 1999/01/03 22:16:21 @@ -794,10 +794,14 @@ chown (const char * name, uid_t uid, gid BackupRead (hFile, NULL, 0, &bytes_read, TRUE, TRUE, &context); CloseHandle (hFile); + strcpy(abs_buf, username); + int retried = 0; +retry: + /* get sid for the new user */ sid_len = 1024; domname_len = 100; - if (!LookupAccountName (NULL, username, psid_name, + if (!LookupAccountName (NULL, abs_buf, psid_name, &sid_len, domain_name, &domname_len, &acc_type)) { __seterrno (); @@ -811,6 +815,16 @@ chown (const char * name, uid_t uid, gid return -1; } + if (acc_type != SidTypeUser + && ! retried + && domain_name && *domain_name) + { + __small_sprintf (abs_buf, "%s\\%s", + domain_name, username); + retried = 1; + goto retry; + } + /* convert security descriptor to absolute format */ if (!rel2abssd (psd, abs_psd, 1024)) {