|
@@ -43,19 +43,10 @@ static void chown_open_file(int fd, uid_t uid, gid_t gid) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void create_needed_dir(const char *dir, uid_t uid, gid_t gid)
|
|
|
+void change_dir_ownership(const char *dir, uid_t uid, gid_t gid)
|
|
|
{
|
|
|
- // attempt to create the directory
|
|
|
- if(mkdir(dir, 0755) == 0) {
|
|
|
- // we created it
|
|
|
-
|
|
|
- // chown it to match the required user
|
|
|
- if(chown(dir, uid, gid) == -1)
|
|
|
- error("Cannot chown directory '%s' to %u:%u", dir, (unsigned int)uid, (unsigned int)gid);
|
|
|
- }
|
|
|
- else if(errno != EEXIST)
|
|
|
- // log an error only if the directory does not exist
|
|
|
- error("Cannot create directory '%s'", dir);
|
|
|
+ if (chown(dir, uid, gid) == -1)
|
|
|
+ error("Cannot chown directory '%s' to %u:%u", dir, (unsigned int)uid, (unsigned int)gid);
|
|
|
}
|
|
|
|
|
|
void clean_directory(char *dirname)
|
|
@@ -74,6 +65,16 @@ void clean_directory(char *dirname)
|
|
|
closedir(dir);
|
|
|
}
|
|
|
|
|
|
+void prepare_required_directories(uid_t uid, gid_t gid) {
|
|
|
+ change_dir_ownership(netdata_configured_cache_dir, uid, gid);
|
|
|
+ change_dir_ownership(netdata_configured_varlib_dir, uid, gid);
|
|
|
+ change_dir_ownership(netdata_configured_lock_dir, uid, gid);
|
|
|
+ change_dir_ownership(netdata_configured_log_dir, uid, gid);
|
|
|
+ change_dir_ownership(claimingdirectory, uid, gid);
|
|
|
+
|
|
|
+ clean_directory(netdata_configured_lock_dir);
|
|
|
+}
|
|
|
+
|
|
|
int become_user(const char *username, int pid_fd) {
|
|
|
int am_i_root = (getuid() == 0)?1:0;
|
|
|
|
|
@@ -86,12 +87,7 @@ int become_user(const char *username, int pid_fd) {
|
|
|
uid_t uid = pw->pw_uid;
|
|
|
gid_t gid = pw->pw_gid;
|
|
|
|
|
|
- create_needed_dir(netdata_configured_cache_dir, uid, gid);
|
|
|
- create_needed_dir(netdata_configured_varlib_dir, uid, gid);
|
|
|
- create_needed_dir(netdata_configured_lock_dir, uid, gid);
|
|
|
- create_needed_dir(claimingdirectory, uid, gid);
|
|
|
-
|
|
|
- clean_directory(netdata_configured_lock_dir);
|
|
|
+ prepare_required_directories(uid, gid);
|
|
|
|
|
|
if(pidfile[0]) {
|
|
|
if(chown(pidfile, uid, gid) == -1)
|
|
@@ -487,12 +483,7 @@ int become_daemon(int dont_fork, const char *user)
|
|
|
else debug(D_SYSTEM, "Successfully became user '%s'.", user);
|
|
|
}
|
|
|
else {
|
|
|
- create_needed_dir(netdata_configured_cache_dir, getuid(), getgid());
|
|
|
- create_needed_dir(netdata_configured_varlib_dir, getuid(), getgid());
|
|
|
- create_needed_dir(netdata_configured_lock_dir, getuid(), getgid());
|
|
|
- create_needed_dir(claimingdirectory, getuid(), getgid());
|
|
|
-
|
|
|
- clean_directory(netdata_configured_lock_dir);
|
|
|
+ prepare_required_directories(getuid(), getgid());
|
|
|
}
|
|
|
|
|
|
if(pidfd != -1)
|