1
1
#include "../git-compat-util.h"
2
2
#include "win32.h"
3
3
#include <aclapi.h>
4
+ #include <sddl.h>
4
5
#include <conio.h>
5
6
#include <wchar.h>
6
7
#include "../strbuf.h"
@@ -2986,6 +2987,22 @@ static PSID get_current_user_sid(void)
2986
2987
return result ;
2987
2988
}
2988
2989
2990
+ static int acls_supported (const char * path )
2991
+ {
2992
+ size_t offset = offset_1st_component (path );
2993
+ WCHAR wroot [MAX_PATH ];
2994
+ DWORD file_system_flags ;
2995
+
2996
+ if (offset &&
2997
+ xutftowcs_path_ex (wroot , path , MAX_PATH , offset ,
2998
+ MAX_PATH , 0 ) > 0 &&
2999
+ GetVolumeInformationW (wroot , NULL , 0 , NULL , NULL ,
3000
+ & file_system_flags , NULL , 0 ))
3001
+ return !!(file_system_flags & FILE_PERSISTENT_ACLS );
3002
+
3003
+ return 0 ;
3004
+ }
3005
+
2989
3006
int is_path_owned_by_current_sid (const char * path )
2990
3007
{
2991
3008
WCHAR wpath [MAX_PATH ];
@@ -3025,6 +3042,7 @@ int is_path_owned_by_current_sid(const char *path)
3025
3042
else if (sid && IsValidSid (sid )) {
3026
3043
/* Now, verify that the SID matches the current user's */
3027
3044
static PSID current_user_sid ;
3045
+ BOOL is_member ;
3028
3046
3029
3047
if (!current_user_sid )
3030
3048
current_user_sid = get_current_user_sid ();
@@ -3033,6 +3051,42 @@ int is_path_owned_by_current_sid(const char *path)
3033
3051
IsValidSid (current_user_sid ) &&
3034
3052
EqualSid (sid , current_user_sid ))
3035
3053
result = 1 ;
3054
+ else if (IsWellKnownSid (sid , WinBuiltinAdministratorsSid ) &&
3055
+ CheckTokenMembership (NULL , sid , & is_member ) &&
3056
+ is_member )
3057
+ /*
3058
+ * If owned by the Administrators group, and the
3059
+ * current user is an administrator, we consider that
3060
+ * okay, too.
3061
+ */
3062
+ result = 1 ;
3063
+ else if (IsWellKnownSid (sid , WinWorldSid ) &&
3064
+ git_env_bool ("GIT_TEST_DEBUG_UNSAFE_DIRECTORIES" , 0 ) &&
3065
+ !acls_supported (path )) {
3066
+ /*
3067
+ * On FAT32 volumes, ownership is not actually recorded.
3068
+ */
3069
+ warning ("'%s' is on a file system that does not record ownership" , path );
3070
+ } else if (git_env_bool ("GIT_TEST_DEBUG_UNSAFE_DIRECTORIES" , 0 )) {
3071
+ LPSTR str1 , str2 , to_free1 = NULL , to_free2 = NULL ;
3072
+
3073
+ if (ConvertSidToStringSidA (sid , & str1 ))
3074
+ to_free1 = str1 ;
3075
+ else
3076
+ str1 = "(inconvertible)" ;
3077
+
3078
+ if (!current_user_sid )
3079
+ str2 = "(none)" ;
3080
+ else if (!IsValidSid (current_user_sid ))
3081
+ str2 = "(invalid)" ;
3082
+ else if (ConvertSidToStringSidA (current_user_sid , & str2 ))
3083
+ to_free2 = str2 ;
3084
+ else
3085
+ str2 = "(inconvertible)" ;
3086
+ warning ("'%s' is owned by:\n\t'%s'\nbut the current user is:\n\t'%s'" , path , str1 , str2 );
3087
+ LocalFree (to_free1 );
3088
+ LocalFree (to_free2 );
3089
+ }
3036
3090
}
3037
3091
3038
3092
/*
0 commit comments