Skip to content

Commit

Permalink
Only mount non-empty directories for cgroups (miklos.szegedi@cloudera…
Browse files Browse the repository at this point in the history
….com via rkanter)

(cherry picked from commit 0838fe8)
(cherry picked from commit c1dc4ca)
(cherry picked from commit 92f02f9)
  • Loading branch information
rkanter committed Jul 31, 2018
1 parent e20a840 commit 4328a7e
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -2162,6 +2162,28 @@ void chown_dir_contents(const char *dir_path, uid_t uid, gid_t gid) {
free(path_tmp);
}

int is_empty(char *target_dir) {
DIR *dir = NULL;
struct dirent *entry = NULL;
dir = opendir(target_dir);
if (!dir) {
fprintf(LOGFILE, "Could not open directory %s - %s\n", target_dir,
strerror(errno));
return 0;
}
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0) {
continue;
}
if (strcmp(entry->d_name, "..") == 0) {
continue;
}
fprintf(LOGFILE, "Directory is not empty %s\n", target_dir);
return 0;
}
return 1;
}

/**
* Mount a cgroup controller at the requested mount point and create
* a hierarchy for the Hadoop NodeManager to manage.
Expand Down Expand Up @@ -2196,7 +2218,13 @@ int mount_cgroup(const char *pair, const char *hierarchy) {
result = -1;
} else {
if (strstr(mount_path, "..") != NULL) {
fprintf(LOGFILE, "Unsupported cgroup mount path detected.\n");
fprintf(LOGFILE, "Unsupported cgroup mount path detected. %s\n",
mount_path);
result = INVALID_COMMAND_PROVIDED;
goto cleanup;
}
if (!is_empty(mount_path)) {
fprintf(LOGFILE, "cgroup mount path is not empty. %s\n", mount_path);
result = INVALID_COMMAND_PROVIDED;
goto cleanup;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1188,6 +1188,23 @@ void test_trim_function() {
free(trimmed);
}

void test_is_empty() {
printf("\nTesting is_empty function\n");
if (is_empty("/")) {
printf("FAIL: / should not be empty\n");
exit(1);
}
if (is_empty("/tmp/2938rf2983hcqnw8ud/noexist")) {
printf("FAIL: /tmp/2938rf2983hcqnw8ud/noexist should not exist\n");
exit(1);
}
mkdir("/tmp/2938rf2983hcqnw8ud/emptydir", S_IRWXU);
if (!is_empty("/tmp/2938rf2983hcqnw8ud/emptydir")) {
printf("FAIL: /tmp/2938rf2983hcqnw8ud/emptydir be empty\n");
exit(1);
}
}

// This test is expected to be executed either by a regular
// user or by root. If executed by a regular user it doesn't
// test all the functions that would depend on changing the
Expand Down Expand Up @@ -1249,6 +1266,9 @@ int main(int argc, char **argv) {

printf("\nStarting tests\n");

printf("\ntest_is_empty()\n");
test_is_empty();

printf("\nTesting recursive_unlink_children()\n");
test_recursive_unlink_children();

Expand Down

0 comments on commit 4328a7e

Please sign in to comment.