Corinna, Here is a chown related patch, fixing one old and one recent bug.
2003/02/03 Pierre Humblet <[EMAIL PROTECTED]> * security.h: Add third argument to set_process_privilege. * autoload.cc: Add OpenThreadToken. * sec_helper.cc (set_process_privilege): Add and use use_thread argument. * security.cc (alloc_sd): Modify call to set_process_privilege. Remember the result in each process. If failed and file owner is not the user, fail.
Index: security.h =================================================================== RCS file: /cvs/src/src/winsup/cygwin/security.h,v retrieving revision 1.36 diff -u -p -r1.36 security.h --- security.h 14 Dec 2002 17:23:42 -0000 1.36 +++ security.h 3 Feb 2003 14:16:39 -0000 @@ -236,7 +236,7 @@ BOOL get_logon_server (const char * doma /* sec_helper.cc: Security helper functions. */ BOOL __stdcall is_grp_member (__uid32_t uid, __gid32_t gid); -int set_process_privilege (const char *privilege, BOOL enable = TRUE); +int set_process_privilege (const char *privilege, bool enable = true, bool use_thread += false); /* shared.cc: */ /* Retrieve a security descriptor that allows all access */ Index: sec_helper.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/sec_helper.cc,v retrieving revision 1.32 diff -u -p -r1.32 sec_helper.cc --- sec_helper.cc 26 Jan 2003 06:42:40 -0000 1.32 +++ sec_helper.cc 3 Feb 2003 14:21:24 -0000 @@ -294,7 +294,7 @@ got_it: #endif //unused int -set_process_privilege (const char *privilege, BOOL enable) +set_process_privilege (const char *privilege, bool enable, bool use_thread) { HANDLE hToken = NULL; LUID restore_priv; @@ -302,8 +302,12 @@ set_process_privilege (const char *privi int ret = -1; DWORD size; - if (!OpenProcessToken (hMainProc, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, - &hToken)) + if ((use_thread + && !OpenThreadToken (GetCurrentThread (), TOKEN_QUERY | +TOKEN_ADJUST_PRIVILEGES, + 0, &hToken)) + ||(!use_thread + && !OpenProcessToken (hMainProc, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, + &hToken))) { __seterrno (); goto out; @@ -329,7 +333,6 @@ set_process_privilege (const char *privi be enabled. GetLastError () returns an correct error code, though. */ if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED) { - debug_printf ("Privilege %s couldn't be assigned", privilege); __seterrno (); goto out; } Index: security.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/security.cc,v retrieving revision 1.132 diff -u -p -r1.132 security.cc --- security.cc 26 Jan 2003 06:42:40 -0000 1.132 +++ security.cc 3 Feb 2003 14:27:36 -0000 @@ -1563,9 +1563,20 @@ alloc_sd (__uid32_t uid, __gid32_t gid, } owner_sid.debug_print ("alloc_sd: owner SID ="); - /* Must have SE_RESTORE_NAME privilege to change owner */ - if (cur_owner_sid && owner_sid != cur_owner_sid - && set_process_privilege (SE_RESTORE_NAME) < 0 ) + /* Try turning privilege on, may not have WRITE_OWNER or WRITE_DAC access. + Must have privilege to set different owner, else BackupWrite misbehaves */ + static int NO_COPY saved_res; /* 0: never, 1: failed, 2 & 3: OK */ + int res; + if (!saved_res || cygheap->user.issetuid ()) + { + res = 2 + set_process_privilege (SE_RESTORE_NAME, true, + cygheap->user.issetuid ()); + if (!cygheap->user.issetuid ()) + saved_res = res; + } + else + res = saved_res; + if (res == 1 && owner_sid != cygheap->user.sid ()) return NULL; /* Get SID of new group. */ Index: autoload.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/autoload.cc,v retrieving revision 1.59 diff -u -p -r1.59 autoload.cc --- autoload.cc 15 Jan 2003 10:21:23 -0000 1.59 +++ autoload.cc 3 Feb 2003 14:33:17 -0000 @@ -352,6 +352,7 @@ LoadDLLfunc (LsaOpenPolicy, 16, advapi32 LoadDLLfunc (LsaQueryInformationPolicy, 12, advapi32) LoadDLLfunc (MakeSelfRelativeSD, 12, advapi32) LoadDLLfunc (OpenProcessToken, 12, advapi32) +LoadDLLfunc (OpenThreadToken, 16, advapi32) LoadDLLfunc (RegCloseKey, 4, advapi32) LoadDLLfunc (RegCreateKeyExA, 36, advapi32) LoadDLLfunc (RegDeleteKeyA, 8, advapi32)