diff options
Diffstat (limited to 'ext/session/mod_files.c')
-rw-r--r-- | ext/session/mod_files.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/ext/session/mod_files.c b/ext/session/mod_files.c index 33e177c5df..3366985279 100644 --- a/ext/session/mod_files.c +++ b/ext/session/mod_files.c @@ -121,7 +121,9 @@ static void ps_files_close(ps_files *data) static void ps_files_open(ps_files *data, const char *key TSRMLS_DC) { char buf[MAXPATHLEN]; +#if !defined(O_NOFOLLOW) || !defined(PHP_WIN32) struct stat sbuf; +#endif if (data->fd < 0 || !data->lastkey || strcmp(key, data->lastkey)) { if (data->lastkey) { @@ -339,13 +341,13 @@ PS_READ_FUNC(files) /* If strict mode, check session id existence */ if (PS(use_strict_mode) && - ps_files_key_exists(data, key TSRMLS_CC) == FAILURE) { + ps_files_key_exists(data, key? key->val : NULL TSRMLS_CC) == FAILURE) { /* key points to PS(id), but cannot change here. */ if (key) { - efree(PS(id)); + STR_RELEASE(PS(id)); PS(id) = NULL; } - PS(id) = PS(mod)->s_create_sid((void **)&data, NULL TSRMLS_CC); + PS(id) = PS(mod)->s_create_sid((void **)&data TSRMLS_CC); if (!PS(id)) { return FAILURE; } @@ -356,7 +358,7 @@ PS_READ_FUNC(files) PS(session_status) = php_session_active; } - ps_files_open(data, PS(id) TSRMLS_CC); + ps_files_open(data, PS(id)->val TSRMLS_CC); if (data->fd < 0) { return FAILURE; } @@ -365,20 +367,20 @@ PS_READ_FUNC(files) return FAILURE; } - data->st_size = *vallen = sbuf.st_size; + data->st_size = sbuf.st_size; if (sbuf.st_size == 0) { *val = STR_EMPTY_ALLOC(); return SUCCESS; } - *val = emalloc(sbuf.st_size); + *val = STR_ALLOC(sbuf.st_size, 0); #if defined(HAVE_PREAD) - n = pread(data->fd, *val, sbuf.st_size, 0); + n = pread(data->fd, (*val)->val, (*val)->len, 0); #else lseek(data->fd, 0, SEEK_SET); - n = read(data->fd, *val, sbuf.st_size); + n = read(data->fd, (*val)->val, (*val)->len); #endif if (n != sbuf.st_size) { @@ -387,7 +389,7 @@ PS_READ_FUNC(files) } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "read returned less bytes than requested"); } - efree(*val); + STR_RELEASE(*val); return FAILURE; } @@ -399,25 +401,25 @@ PS_WRITE_FUNC(files) long n; PS_FILES_DATA; - ps_files_open(data, key TSRMLS_CC); + ps_files_open(data, key->val TSRMLS_CC); if (data->fd < 0) { return FAILURE; } /* Truncate file if the amount of new data is smaller than the existing data set. */ - if (vallen < (int)data->st_size) { + if (val->len < (int)data->st_size) { php_ignore_value(ftruncate(data->fd, 0)); } #if defined(HAVE_PWRITE) - n = pwrite(data->fd, val, vallen, 0); + n = pwrite(data->fd, val->val, val->len, 0); #else lseek(data->fd, 0, SEEK_SET); - n = write(data->fd, val, vallen); + n = write(data->fd, val->val, val->len); #endif - if (n != vallen) { + if (n != val->len) { if (n == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "write failed: %s (%d)", strerror(errno), errno); } else { @@ -434,7 +436,7 @@ PS_DESTROY_FUNC(files) char buf[MAXPATHLEN]; PS_FILES_DATA; - if (!ps_files_path_create(buf, sizeof(buf), data, key)) { + if (!ps_files_path_create(buf, sizeof(buf), data, key->val)) { return FAILURE; } @@ -470,16 +472,16 @@ PS_GC_FUNC(files) PS_CREATE_SID_FUNC(files) { - char *sid; + zend_string *sid; int maxfail = 3; PS_FILES_DATA; do { - sid = php_session_create_id((void **)&data, newlen TSRMLS_CC); + sid = php_session_create_id((void**)&data TSRMLS_CC); /* Check collision */ - if (data && ps_files_key_exists(data, sid TSRMLS_CC) == SUCCESS) { + if (data && ps_files_key_exists(data, sid? sid->val : NULL TSRMLS_CC) == SUCCESS) { if (sid) { - efree(sid); + STR_RELEASE(sid); sid = NULL; } if (!(maxfail--)) { |