Browse Source

support setting the filemode using session.save_path

PHP-5
Sascha Schumann 24 years ago
parent
commit
a10f0830e6
  1. 53
      ext/session/mod_files.c

53
ext/session/mod_files.c

@ -56,6 +56,7 @@ typedef struct {
size_t basedir_len;
size_t dirdepth;
size_t st_size;
int filemode;
} ps_files;
ps_module ps_mod_files = {
@ -152,7 +153,8 @@ static void ps_files_open(ps_files *data, const char *key TSRMLS_DC)
data->lastkey = estrdup(key);
data->fd = VCWD_OPEN_MODE(buf, O_CREAT | O_RDWR | O_BINARY, 0600);
data->fd = VCWD_OPEN_MODE(buf, O_CREAT | O_RDWR | O_BINARY,
data->filemode);
if (data->fd != -1) {
flock(data->fd, LOCK_EX);
@ -226,24 +228,55 @@ static int ps_files_cleanup_dir(const char *dirname, int maxlifetime TSRMLS_DC)
PS_OPEN_FUNC(files)
{
ps_files *data;
char *p;
data = ecalloc(sizeof(*data), 1);
PS_SET_MOD_DATA(data);
const char *p, *last;
const char *argv[3];
int argc = 0;
size_t dirdepth = 0;
int filemode = 0600;
/* split up input parameter */
last = save_path;
p = strchr(save_path, ';');
while (p) {
argv[argc++] = last;
last = ++p;
p = strchr(p, ';');
if (argc > 1) break;
}
argv[argc++] = last;
data->fd = -1;
if ((p = strchr(save_path, ';'))) {
if (argc > 1) {
errno = 0;
data->dirdepth = (size_t) strtol(save_path, NULL, 10);
dirdepth = (size_t) strtol(argv[0], NULL, 10);
if (errno == ERANGE) {
efree(data);
php_error(E_WARNING,
"The first parameter in session.save_path is invalid");
return FAILURE;
}
}
if (argc > 2) {
errno = 0;
filemode = strtol(argv[1], NULL, 8);
if (errno == ERANGE || filemode < 0 || filemode > 07777) {
php_error(E_WARNING,
"The second parameter in session.save_path is invalid");
return FAILURE;
}
save_path = p + 1;
}
save_path = argv[argc - 1];
data = emalloc(sizeof(*data));
memset(data, 0, sizeof(*data));
data->fd = -1;
data->dirdepth = dirdepth;
data->filemode = filemode;
data->basedir_len = strlen(save_path);
data->basedir = estrndup(save_path, data->basedir_len);
PS_SET_MOD_DATA(data);
return SUCCESS;
}

Loading…
Cancel
Save