#endif
}
-char * tsrm_win32_get_path_sid_key(const char *pathname)
+char * tsrm_win32_get_path_sid_key(const char *pathname, size_t pathname_len, size_t *key_len)
{
PSID pSid = TWG(impersonation_token_sid);
TCHAR *ptcSid = NULL;
char *bucket_key = NULL;
- size_t ptc_sid_len, pathname_len;
-
- pathname_len = strlen(pathname);
+ size_t ptc_sid_len;
if (!pSid) {
bucket_key = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pathname_len + 1);
if (!bucket_key) {
+ *key_len = 0;
return NULL;
}
memcpy(bucket_key, pathname, pathname_len);
+ *key_len = pathname_len;
return bucket_key;
}
if (!ConvertSidToStringSid(pSid, &ptcSid)) {
+ *key_len = 0;
return NULL;
}
ptc_sid_len = strlen(ptcSid);
- bucket_key = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pathname_len + ptc_sid_len + 1);
+ *key_len = pathname_len + ptc_sid_len;
+ bucket_key = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *key_len + 1);
if (!bucket_key) {
LocalFree(ptcSid);
+ *key_len = 0;
return NULL;
}
#define SHM_RND FILE_MAP_WRITE
#define SHM_REMAP FILE_MAP_COPY
-char * tsrm_win32_get_path_sid_key(const char *pathname );
+char * tsrm_win32_get_path_sid_key(const char *pathname, size_t pathname_len, size_t *key_len);
TSRM_API void tsrm_win32_startup(void);
TSRM_API void tsrm_win32_shutdown(void);
static inline zend_ulong realpath_cache_key(const char *path, size_t path_len) /* {{{ */
{
register zend_ulong h;
- char *bucket_key_start = tsrm_win32_get_path_sid_key(path);
+ size_t bucket_key_len;
+ char *bucket_key_start = tsrm_win32_get_path_sid_key(path, path_len, &bucket_key_len);
char *bucket_key = (char *)bucket_key_start;
const char *e;
return 0;
}
- e = bucket_key + strlen(bucket_key);
+ e = bucket_key + bucket_key_len;
for (h = Z_UL(2166136261); bucket_key < e;) {
h *= Z_UL(16777619);
h ^= *bucket_key++;