Use stat instead of access, use stored persona

This commit is contained in:
wbaumann 2012-01-28 11:14:36 +00:00
parent 9a5e41b3f8
commit 7d71ddc114
2 changed files with 28 additions and 40 deletions

View File

@ -1,6 +1,11 @@
ChangeLog for davfs2
--------------------

2012-01-28 Werner Baumann (werner.baumann@onlinehome.de)
* mount_davfs.c, check_dirs:
Use stat instead of access.
Use stored persona.

2012-01-25 Werner Baumann (werner.baumann@onlinehome.de)
* mount_davfs.c, mount_davfs.h:
Check mount point in parse_commandline.

View File

@ -463,7 +463,7 @@ check_dirs(dav_args *args)
{
struct stat st;

if (access(DAV_MOUNTS, R_OK) == 0) {
if (stat(DAV_MOUNTS, &st) == 0) {
mounts = DAV_MOUNTS;
} else {
mounts = _PATH_MOUNTED;
@ -472,7 +472,7 @@ check_dirs(dav_args *args)
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG), "mounts in: %s", mounts);

gain_privileges(args);
if (access(DAV_SYS_RUN, F_OK) != 0) {
if (stat(DAV_SYS_RUN, &st) != 0) {
if (mkdir(DAV_SYS_RUN, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH | S_ISVTX)
!= 0)
error(EXIT_FAILURE, errno, _("can't create directory %s"),
@ -487,12 +487,8 @@ check_dirs(dav_args *args)
error(EXIT_FAILURE, errno,
_("can't change mode of directory %s"), DAV_SYS_RUN);
}
struct group *grp = getgrnam(args->dav_group);
if (!grp)
error(EXIT_FAILURE, errno, _("group %s does not exist"),
args->dav_group);
if (st.st_gid != grp->gr_gid) {
if (chown(DAV_SYS_RUN, 0, grp->gr_gid) != 0)
if (st.st_gid != args->dav_gid) {
if (chown(DAV_SYS_RUN, 0, args->dav_gid) != 0)
error(EXIT_FAILURE, errno,
_("can't change group of directory %s"), DAV_SYS_RUN);
}
@ -500,32 +496,29 @@ check_dirs(dav_args *args)

if (!args->privileged) {

char *path = NULL;
struct passwd *pw = getpwuid(getuid());
if (pw && pw->pw_dir)
path = ne_concat(pw->pw_dir, "/.", PACKAGE, NULL);
if (path && access(path, F_OK) != 0)
char *path = ne_concat(args->home, "/.", PACKAGE, NULL);
if (stat(path, &st) != 0)
mkdir(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);

if (path && access(path, F_OK) == 0) {
if (stat(path, &st) == 0) {
char *dir = ne_concat(path, "/", DAV_CACHE, NULL);
if (access(dir, F_OK) != 0)
if (stat(dir, &st) != 0)
mkdir(dir, S_IRWXU);
free(dir);

dir = ne_concat(path, "/", DAV_CERTS_DIR, NULL);
if (access(dir, F_OK) != 0)
if (stat(dir, &st) != 0)
mkdir(dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
free(dir);

dir = ne_concat(path, "/", DAV_CERTS_DIR, "/", DAV_CLICERTS_DIR,
NULL);
if (access(dir, F_OK) != 0)
if (stat(dir, &st) != 0)
mkdir(dir, S_IRWXU);
free(dir);

char *file_name = ne_concat(path, "/", DAV_CONFIG, NULL);
if (access(file_name, F_OK) != 0) {
if (stat(file_name, &st) != 0) {
char *template = ne_concat(DAV_DATA_DIR, "/", DAV_CONFIG, NULL);
char *command = ne_concat("cp ", template, " ", file_name,
NULL);
@ -536,7 +529,7 @@ check_dirs(dav_args *args)
free(file_name);

file_name = ne_concat(path, "/", DAV_SECRETS, NULL);
if (access(file_name, F_OK) != 0) {
if (stat(file_name, &st) != 0) {
char *template = ne_concat(DAV_DATA_DIR, "/", DAV_SECRETS,
NULL);
char *command = ne_concat("cp ", template, " ", file_name,
@ -554,7 +547,7 @@ check_dirs(dav_args *args)
if (strcmp(args->cache_dir, args->sys_cache) == 0) {

gain_privileges(args);
if (access(args->sys_cache, F_OK) != 0) {
if (stat(args->sys_cache, &st) != 0) {
if (mkdir(args->sys_cache, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
!= 0)
error(EXIT_FAILURE, errno, _("can't create directory %s"),
@ -570,12 +563,8 @@ check_dirs(dav_args *args)
_("can't change mode of directory %s"),
args->sys_cache);
}
struct group *grp = getgrnam(args->dav_group);
if (!grp)
error(EXIT_FAILURE, errno, _("group %s does not exist"),
args->dav_group);
if (st.st_gid != grp->gr_gid) {
if (chown(args->sys_cache, 0, grp->gr_gid) != 0)
if (st.st_gid != args->dav_gid) {
if (chown(args->sys_cache, 0, args->dav_gid) != 0)
error(EXIT_FAILURE, errno,
_("can't change group of directory %s"),
args->sys_cache);
@ -584,12 +573,7 @@ check_dirs(dav_args *args)

} else {

struct passwd *pw = getpwuid(getuid());
if (!pw)
error(EXIT_FAILURE, errno, _("can't read user data base"));
if (!pw->pw_name)
error(EXIT_FAILURE, 0, _("can't read user data base"));
if (access(args->cache_dir, F_OK) != 0) {
if (stat(args->cache_dir, &st) != 0) {
if (mkdir(args->cache_dir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
!= 0)
error(EXIT_FAILURE, errno, _("can't create directory %s"),
@ -598,18 +582,17 @@ check_dirs(dav_args *args)
if (stat(args->cache_dir, &st) != 0)
error(EXIT_FAILURE, errno, _("can't access directory %s"),
args->cache_dir);
if ((st.st_uid != getuid() || (st.st_mode & S_IRWXU) != S_IRWXU)
if ((st.st_uid != args->uid || (st.st_mode & S_IRWXU) != S_IRWXU)
&& (st.st_mode & S_IRWXO) != S_IRWXO) {
if ((st.st_mode & S_IRWXG) != S_IRWXG)
error(EXIT_FAILURE, errno, _("can't access directory %s"),
args->cache_dir);
struct group *grp = getgrgid(st.st_gid);
if (!grp)
error(EXIT_FAILURE, errno, _("can't read group data base"));
char **members = grp->gr_mem;
while (*members && strcmp(*members, pw->pw_name) != 0)
members++;
if (!*members)
int i;
for (i = 0; i < args->ngroups; i++) {
if (st.st_gid == args->groups[i])
break;
}
if (i == args->ngroups)
error(EXIT_FAILURE, 0, _("can't access directory %s"),
args->cache_dir);
}