Fix crashes on windows.

This commit is contained in:
Antti Aalto 2016-07-03 20:32:04 +03:00
parent 84a9171f1d
commit 4487b37e50

View file

@ -37,17 +37,29 @@ cdef extern from 'windows.h':
ctypedef BYTE* PSID
struct _ACL:
uint16_t AceCount
cdef enum _SID_NAME_USE:
SidTypeUser,
SidTypeGroup,
SidTypeDomain,
SidTypeAlias,
SidTypeWellKnownGroup,
SidTypeDeletedAccount,
SidTypeInvalid,
SidTypeUnknown,
SidTypeComputer,
SidTypeLabel
HLOCAL LocalFree(HLOCAL)
DWORD GetLastError();
void SetLastError(DWORD)
DWORD FormatMessageW(DWORD, void*, DWORD, DWORD, wchar_t**, DWORD, void*)
DWORD FormatMessageW(DWORD, void*, DWORD, DWORD, wchar_t*, DWORD, void*)
BOOL InitializeSecurityDescriptor(BYTE*, DWORD)
BOOL LookupAccountNameW(LPCTSTR, LPCTSTR, PSID, LPDWORD, LPCTSTR, LPDWORD, LPDWORD)
BOOL LookupAccountNameW(LPCTSTR, LPCTSTR, PSID, LPDWORD, LPCTSTR, LPDWORD, _SID_NAME_USE*)
BOOL GetSecurityDescriptorDacl(PSID, BOOL*, _ACL**, BOOL*)
cdef extern int ERROR_INSUFFICIENT_BUFFER
@ -101,7 +113,7 @@ cdef extern from 'Sddl.h':
BOOL GetFileSecurityW(LPCTSTR, int, PSID, DWORD, LPDWORD)
BOOL GetSecurityDescriptorOwner(PSID, PSID*, LPBOOL)
BOOL LookupAccountSidW(LPCTSTR, PSID, LPCTSTR, LPDWORD, LPCTSTR, LPDWORD, uint16_t*)
BOOL LookupAccountSidW(LPCTSTR, PSID, LPCTSTR, LPDWORD, LPCTSTR, LPDWORD, _SID_NAME_USE*)
BOOL ConvertSidToStringSidW(PSID, LPCTSTR*)
BOOL ConvertStringSidToSidW(LPCTSTR, PSID*)
BOOL ConvertSecurityDescriptorToStringSecurityDescriptorW(BYTE*, DWORD, int, LPCTSTR*, int*)
@ -122,7 +134,7 @@ def raise_error(api, path=''):
if not error:
return
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, error, 0, &error_message, 0, NULL)
NULL, error, 0, <wchar_t*>&error_message, 0, NULL)
error_string = PyUnicode_FromWideChar(error_message, -1)
LocalFree(<HLOCAL>error_message)
error_string = api + ': ' + error_string
@ -162,7 +174,7 @@ cdef _look_up_account_sid(PSID sid):
cdef wchar_t* domain = <wchar_t*>malloc((SIZE) * sizeof(wchar_t))
cdef DWORD cch_name = SIZE
cdef DWORD cch_domain = SIZE
cdef uint16_t sid_type = <uint16_t>0
cdef _SID_NAME_USE sid_type
cdef BOOL ret = LookupAccountSidW(NULL, sid, name, &cch_name, domain, &cch_domain, &sid_type)
if ret == 0:
@ -199,17 +211,18 @@ def get_owner(path):
if sid == NULL:
return 'unknown', 'S-1-0-0'
name, domain, sid_type = _look_up_account_sid(sid)
sidstr = sid2string(sid)
free(sd)
if domain and domain.lower() != platform.node().lower() and domain != 'BUILTIN':
return '{0}\\{1}'.format(domain, name), sid2string(sid)
return '{0}\\{1}'.format(domain, name), sidstr
else:
return name, sid2string(sid)
return name, sidstr
def set_owner(path, owner, sidstring = None):
cdef PSID newsid
cdef wchar_t* temp
cdef DWORD sid_type = 0
cdef _SID_NAME_USE sid_type
cdef DWORD length = 0
cdef DWORD domainlength = 0
if sidstring is not None:
@ -260,7 +273,7 @@ def acl_get(path, item, st, numeric_owner=False):
pyDACL = []
cdef PSID newsid
cdef uint32_t domainlength
cdef uint32_t sid_type
cdef _SID_NAME_USE sid_type
for i in range(length):
permissions = None
name = ""
@ -270,7 +283,7 @@ def acl_get(path, item, st, numeric_owner=False):
sidstr = sid2string(<PSID>(ACEs[i].Trustee.ptstrName))
elif ACEs[i].Trustee.TrusteeForm == TRUSTEE_IS_NAME:
sid_type = 0
sid_type = SidTypeInvalid
domainlength = 0
LookupAccountNameW(NULL, ACEs[i].Trustee.ptstrName, NULL, &(length), NULL, &domainlength, &sid_type)