summaryrefslogtreecommitdiff
path: root/ext/session/mod_files.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/session/mod_files.c')
-rw-r--r--ext/session/mod_files.c40
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--)) {