]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
btrfs: fix get_btrfs_subvol_path()
authorChristian Brauner <christian.brauner@ubuntu.com>
Mon, 10 Dec 2018 13:22:04 +0000 (14:22 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 10 Dec 2018 13:22:04 +0000 (14:22 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/storage/btrfs.c
src/lxc/storage/btrfs.h

index d2727b6dce999da9fc442111ae88a9fdf74d6acc..012132d19c06b777fb02d83556808cac381cebbb 100644 (file)
 #include "storage.h"
 #include "utils.h"
 
+#ifndef HAVE_STRLCAT
+#include "include/strlcat.h"
+#endif
+
 #ifndef HAVE_STRLCPY
 #include "include/strlcpy.h"
 #endif
@@ -58,11 +62,11 @@ extern char *dir_new_path(char *src, const char *oldname, const char *name,
  * simply return a.
  */
 char *get_btrfs_subvol_path(int fd, u64 dir_id, u64 objid, char *name,
-                           int name_len)
+                           u16 name_len)
 {
        struct btrfs_ioctl_ino_lookup_args args;
-       int ret, e;
-       size_t len;
+       int ret;
+       size_t len, retlen;
        char *retpath;
 
        memset(&args, 0, sizeof(args));
@@ -70,17 +74,16 @@ char *get_btrfs_subvol_path(int fd, u64 dir_id, u64 objid, char *name,
        args.objectid = objid;
 
        ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &args);
-       e = errno;
        if (ret) {
-               ERROR("Failed to lookup path for %llu %llu %s - %s\n",
-                                (unsigned long long) dir_id,
-                                (unsigned long long) objid,
-                                name, strerror(e));
+               SYSERROR("Failed to lookup path for %llu %llu %s",
+                        (unsigned long long) dir_id,
+                        (unsigned long long) objid,
+                        name);
                return NULL;
        } else
-               INFO("Got path for %llu %llu - %s\n",
-                       (unsigned long long) objid, (unsigned long long) dir_id,
-                       name);
+               INFO("Got path for %llu %llu - %s",
+                    (unsigned long long) objid, (unsigned long long) dir_id,
+                    name);
 
        if (args.name[0]) {
                /*
@@ -91,18 +94,33 @@ char *get_btrfs_subvol_path(int fd, u64 dir_id, u64 objid, char *name,
                retpath = malloc(len);
                if (!retpath)
                        return NULL;
+
                (void)strlcpy(retpath, args.name, len);
-               strncat(retpath, "/", 1);
-               strncat(retpath, name, name_len);
+               (void)strlcat(retpath, "/", len);
+
+               retlen = strlcat(retpath, name, len);
+               if (retlen >= len) {
+                       ERROR("Failed to append name - %s", name);
+                       free(retpath);
+                       return NULL;
+               }
        } else {
                /* we're at the root of ref_tree */
                len = name_len + 1;
                retpath = malloc(len);
                if (!retpath)
                        return NULL;
+
                *retpath = '\0';
-               strncat(retpath, name, name_len);
+
+               retlen = strlcat(retpath, name, len);
+               if (retlen >= len) {
+                       ERROR("Failed to append name - %s", name);
+                       free(retpath);
+                       return NULL;
+               }
        }
+
        return retpath;
 }
 
index 142f7abbd8ebb6d64106f22953e48971c3d98a85..ec34d09e8c1fd8d63c0592188672deb7f6f5500e 100644 (file)
@@ -396,7 +396,7 @@ extern int btrfs_mount(struct lxc_storage *bdev);
 extern int btrfs_umount(struct lxc_storage *bdev);
 
 extern char *get_btrfs_subvol_path(int fd, u64 dir_id, u64 objid, char *name,
-                                  int name_len);
+                                  u16 name_len);
 extern int btrfs_list_get_path_rootid(int fd, u64 *treeid);
 extern bool is_btrfs_fs(const char *path);
 extern int is_btrfs_subvol(const char *path);