]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxccontainer: check if target exists before remove in create_mount_target() 4581/head
authorKadin Sayani <kadin.sayani@canonical.com>
Wed, 3 Sep 2025 22:45:20 +0000 (16:45 -0600)
committerStéphane Graber <stgraber@stgraber.org>
Sat, 4 Oct 2025 02:22:36 +0000 (22:22 -0400)
Signed-off-by: Kadin Sayani <kadin.sayani@canonical.com>
src/lxc/lxccontainer.c

index 6c80065a65d22076d6b1325c78984169277931e8..0f41411d8e43979241ce13d9eb58817e107d250f 100644 (file)
@@ -4911,6 +4911,7 @@ WRAP_API_2(bool, lxcapi_restore, char *, bool)
 static int create_mount_target(const char *dest, mode_t st_mode)
 {
        char *dirdup, *destdirname;
+       struct stat sb;
        int ret;
 
        dirdup = strdup(dest);
@@ -4928,7 +4929,21 @@ static int create_mount_target(const char *dest, mode_t st_mode)
        }
        free(dirdup);
 
-       (void)remove(dest);
+       if (stat(dest, &sb) == 0) {
+               if (S_ISDIR(st_mode) && S_ISDIR(sb.st_mode))
+                       return 0;
+
+               if (S_ISREG(st_mode) && S_ISREG(sb.st_mode))
+                       return 0;
+
+               if (remove(dest) < 0) {
+                       SYSERROR("Failed to remove existing mount target \"%s\"", dest);
+                       return -1;
+               }
+       } else if (errno != ENOENT) {
+               SYSERROR("Failed to stat existing mount target \"%s\"", dest);
+               return -1;
+       }
 
        if (S_ISDIR(st_mode))
                ret = mkdir(dest, 0000);