From: cgf AT cygnus DOT com (Christopher Faylor) Subject: Re: Repost: chown succeed, but SID is wrong! 12 Jan 1999 07:39:53 -0800 Message-ID: <19990112100915.J21061.cygnus.cygwin32.developers@cygnus.com> References: <369B13DB DOT E9A92D59 AT cityweb DOT de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii To: Corinna Vinschen , cygwin32-developers AT cygnus DOT com Sorry. I committed this change. I forgot to note it in the ChangeLog. It will be in the next snapshot. -chris On Tue, Jan 12, 1999 at 10:20:27AM +0100, Corinna Vinschen wrote: >I repost the following, because I got no response. >Is there anybody out there for comments? > >--------- snip ---------- >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. > >--> Error in original posting: >The tool XCACLS.EXE from NTRESKIT has the same error. >--> Correct: >The tool SUBINACL.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 a 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)) > { > -- cgf AT cygnus DOT com http://www.cygnus.com/