Skip to content

Commit

Permalink
Revert "cgfsng: avoid tiny race window"
Browse files Browse the repository at this point in the history
This reverts commit 17e5599.

Signed-off-by: Stéphane Graber <stgraber@ubuntu.com>
  • Loading branch information
stgraber committed Oct 2, 2018
1 parent a153a47 commit c5e7a7a
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 57 deletions.
58 changes: 16 additions & 42 deletions src/lxc/cgroups/cgfsng.c
Expand Up @@ -1257,50 +1257,13 @@ static bool cg_unified_create_cgroup(struct hierarchy *h, char *cgname)
return bret;
}

static int mkdir_eexist_on_last(const char *dir, mode_t mode)
{
const char *tmp = dir;
const char *orig = dir;
size_t orig_len;

orig_len = strlen(dir);
do {
int ret;
size_t cur_len;
char *makeme;

dir = tmp + strspn(tmp, "/");
tmp = dir + strcspn(dir, "/");

errno = ENOMEM;
cur_len = dir - orig;
makeme = strndup(orig, cur_len);
if (!makeme)
return -1;

ret = mkdir(makeme, mode);
if (ret < 0) {
if ((errno != EEXIST) || (orig_len == cur_len)) {
SYSERROR("Failed to create directory \"%s\"", makeme);
free(makeme);
return -1;
}
}
free(makeme);

} while (tmp != dir);

return 0;
}

static bool monitor_create_path_for_hierarchy(struct hierarchy *h, char *cgname)
{
int ret;

h->monitor_full_path = must_make_path(h->mountpoint, h->container_base_path, cgname, NULL);
ret = mkdir_eexist_on_last(h->monitor_full_path, 0755);
if (ret < 0) {
ERROR("Failed to create cgroup \"%s\"", h->monitor_full_path);
if (dir_exists(h->monitor_full_path)) {
ERROR("The cgroup \"%s\" already existed", h->monitor_full_path);
return false;
}

Expand All @@ -1309,6 +1272,12 @@ static bool monitor_create_path_for_hierarchy(struct hierarchy *h, char *cgname)
return false;
}

ret = mkdir_p(h->monitor_full_path, 0755);
if (ret < 0) {
ERROR("Failed to create cgroup \"%s\"", h->monitor_full_path);
return false;
}

return cg_unified_create_cgroup(h, cgname);
}

Expand All @@ -1317,9 +1286,8 @@ static bool container_create_path_for_hierarchy(struct hierarchy *h, char *cgnam
int ret;

h->container_full_path = must_make_path(h->mountpoint, h->container_base_path, cgname, NULL);
ret = mkdir_eexist_on_last(h->container_full_path, 0755);
if (ret < 0) {
ERROR("Failed to create cgroup \"%s\"", h->container_full_path);
if (dir_exists(h->container_full_path)) {
ERROR("The cgroup \"%s\" already existed", h->container_full_path);
return false;
}

Expand All @@ -1328,6 +1296,12 @@ static bool container_create_path_for_hierarchy(struct hierarchy *h, char *cgnam
return false;
}

ret = mkdir_p(h->container_full_path, 0755);
if (ret < 0) {
ERROR("Failed to create cgroup \"%s\"", h->container_full_path);
return false;
}

return cg_unified_create_cgroup(h, cgname);
}

Expand Down
25 changes: 10 additions & 15 deletions src/lxc/utils.c
Expand Up @@ -221,31 +221,26 @@ extern int get_u16(unsigned short *val, const char *arg, int base)
return 0;
}

int mkdir_p(const char *dir, mode_t mode)
extern int mkdir_p(const char *dir, mode_t mode)
{
const char *tmp = dir;
const char *orig = dir;
do {
int ret;
char *makeme;
char *makeme;

do {
dir = tmp + strspn(tmp, "/");
tmp = dir + strcspn(dir, "/");

errno = ENOMEM;
makeme = strndup(orig, dir - orig);
if (!makeme)
return -1;

ret = mkdir(makeme, mode);
if (ret < 0 && errno != EEXIST) {
SYSERROR("Failed to create directory \"%s\"", makeme);
free(makeme);
return -1;
if (*makeme) {
if (mkdir(makeme, mode) && errno != EEXIST) {
SYSERROR("failed to create directory '%s'", makeme);
free(makeme);
return -1;
}
}
free(makeme);

} while (tmp != dir);
} while(tmp != dir);

return 0;
}
Expand Down

0 comments on commit c5e7a7a

Please sign in to comment.