diff options
Diffstat (limited to 'TSRM/tsrm_win32.c')
-rw-r--r-- | TSRM/tsrm_win32.c | 75 |
1 files changed, 61 insertions, 14 deletions
diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index 9358718648..b5bd930fd0 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -109,16 +109,18 @@ TSRM_API void tsrm_win32_shutdown(void) char * tsrm_win32_get_path_sid_key(const char *pathname TSRMLS_DC) { PSID pSid = TWG(impersonation_token_sid); - DWORD sid_len = pSid ? GetLengthSid(pSid) : 0; TCHAR *ptcSid = NULL; char *bucket_key = NULL; + size_t ptc_sid_len, pathname_len; + + pathname_len = strlen(pathname); if (!pSid) { - bucket_key = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, strlen(pathname) + 1); + bucket_key = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pathname_len + 1); if (!bucket_key) { return NULL; } - memcpy(bucket_key, pathname, strlen(pathname)); + memcpy(bucket_key, pathname, pathname_len); return bucket_key; } @@ -126,14 +128,16 @@ char * tsrm_win32_get_path_sid_key(const char *pathname TSRMLS_DC) return NULL; } - bucket_key = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, strlen(pathname) + strlen(ptcSid) + 1); + + ptc_sid_len = strlen(ptcSid); + bucket_key = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pathname_len + ptc_sid_len + 1); if (!bucket_key) { LocalFree(ptcSid); return NULL; } - memcpy(bucket_key, ptcSid, strlen(ptcSid)); - memcpy(bucket_key + strlen(ptcSid), pathname, strlen(pathname) + 1); + memcpy(bucket_key, ptcSid, ptc_sid_len); + memcpy(bucket_key + ptc_sid_len, pathname, pathname_len + 1); LocalFree(ptcSid); return bucket_key; @@ -142,11 +146,8 @@ char * tsrm_win32_get_path_sid_key(const char *pathname TSRMLS_DC) PSID tsrm_win32_get_token_sid(HANDLE hToken) { - BOOL bSuccess = FALSE; DWORD dwLength = 0; PTOKEN_USER pTokenUser = NULL; - PSID sid; - PSID *ppsid = &sid; DWORD sid_len; PSID pResultSid = NULL; @@ -207,7 +208,6 @@ TSRM_API int tsrm_win32_access(const char *pathname, int mode TSRMLS_DC) BYTE * psec_desc = NULL; BOOL fAccess = FALSE; - BOOL bucket_key_alloc = FALSE; realpath_cache_bucket * bucket = NULL; char * real_path = NULL; @@ -245,7 +245,6 @@ TSRM_API int tsrm_win32_access(const char *pathname, int mode TSRMLS_DC) was impersonating already, this function uses that impersonation context. */ if(!OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, TRUE, &thread_token)) { - DWORD err = GetLastError(); if (GetLastError() == ERROR_NO_TOKEN) { if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &thread_token)) { TWG(impersonation_token) = NULL; @@ -282,14 +281,14 @@ TSRM_API int tsrm_win32_access(const char *pathname, int mode TSRMLS_DC) if (CWDG(realpath_cache_size_limit)) { t = time(0); - bucket = realpath_cache_lookup(pathname, strlen(pathname), t TSRMLS_CC); + bucket = realpath_cache_lookup(pathname, (int)strlen(pathname), t TSRMLS_CC); if(bucket == NULL && real_path == NULL) { /* We used the pathname directly. Call tsrm_realpath */ /* so that entry is created in realpath cache */ real_path = (char *)malloc(MAX_PATH); if(tsrm_realpath(pathname, real_path TSRMLS_CC) != NULL) { pathname = real_path; - bucket = realpath_cache_lookup(pathname, strlen(pathname), t TSRMLS_CC); + bucket = realpath_cache_lookup(pathname, (int)strlen(pathname), t TSRMLS_CC); } } } @@ -480,7 +479,7 @@ TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, } /*The following two checks can be removed once we drop XP support */ - type_len = strlen(type); + type_len = (int)strlen(type); if (type_len <1 || type_len > 2) { return NULL; } @@ -725,4 +724,52 @@ TSRM_API char *realpath(char *orig_path, char *buffer) return buffer; } +#if HAVE_UTIME +static zend_always_inline void UnixTimeToFileTime(time_t t, LPFILETIME pft) /* {{{ */ +{ + // Note that LONGLONG is a 64-bit value + LONGLONG ll; + + ll = Int32x32To64(t, 10000000) + 116444736000000000; + pft->dwLowDateTime = (DWORD)ll; + pft->dwHighDateTime = ll >> 32; +} +/* }}} */ + +TSRM_API int win32_utime(const char *filename, struct utimbuf *buf) /* {{{ */ +{ + FILETIME mtime, atime; + HANDLE hFile; + + hFile = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, + OPEN_ALWAYS, FILE_FLAG_BACKUP_SEMANTICS, NULL); + + /* OPEN_ALWAYS mode sets the last error to ERROR_ALREADY_EXISTS but + the CreateFile operation succeeds */ + if (GetLastError() == ERROR_ALREADY_EXISTS) { + SetLastError(0); + } + + if ( hFile == INVALID_HANDLE_VALUE ) { + return -1; + } + + if (!buf) { + SYSTEMTIME st; + GetSystemTime(&st); + SystemTimeToFileTime(&st, &mtime); + atime = mtime; + } else { + UnixTimeToFileTime(buf->modtime, &mtime); + UnixTimeToFileTime(buf->actime, &atime); + } + if (!SetFileTime(hFile, NULL, &atime, &mtime)) { + CloseHandle(hFile); + return -1; + } + CloseHandle(hFile); + return 1; +} +/* }}} */ +#endif #endif |