From 04b1f38057dbab3f45bde722667f10cb2e61df77 Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Tue, 6 Sep 2022 11:04:08 +0200 Subject: [PATCH] generic: avoid auto-creation of toplevel dir --- kernel/sy_old/sy_generic.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/kernel/sy_old/sy_generic.c b/kernel/sy_old/sy_generic.c index 879fb84b..bed9dd8c 100644 --- a/kernel/sy_old/sy_generic.c +++ b/kernel/sy_old/sy_generic.c @@ -1096,7 +1096,7 @@ int ordered_symlink(const char *oldpath, status = mars_symlink(oldpath, newpath, stamp, true); /* Automatically create any missing path dirs */ - while (unlikely(status < 0)) { + while (unlikely(status < 0 && status != -EEXIST)) { int old_len; int check; @@ -1104,12 +1104,20 @@ int ordered_symlink(const char *oldpath, dir_path = brick_strdup(newpath); dir_len = strlen(dir_path); } + /* skip backwards to the slash */ old_len = dir_len; while (dir_len > 0 && dir_path[dir_len] != '/') dir_len--; dir_path[dir_len] = '\0'; if (dir_len <= 0 || dir_len >= old_len) break; + /* ensure that top-level dir is not created. */ + dir_len--; + while (dir_len > 0 && dir_path[dir_len] != '/') + dir_len--; + if (dir_len <= 0 || dir_len >= old_len) + break; + /* create the interim dir */ check = mars_mkdir(dir_path); if (check >= 0) { brick_string_free(dir_path); @@ -1117,6 +1125,8 @@ int ordered_symlink(const char *oldpath, if (nr_retry++ < 3) goto retry; break; + } else if (check == -EEXIST) { + break; } } brick_string_free(dir_path);