Whamcloud - gitweb
LU-4694 hsm: Cleanup codes about return value
[fs/lustre-release.git] / lustre / utils / lhsmtool_posix.c
index 2e82fbc..2e18351 100644 (file)
@@ -366,6 +366,9 @@ static int ct_mkdir_p(const char *path)
        int      rc;
 
        ptr = strdup(path);
+       if (ptr == NULL)
+               return -errno;
+
        saved = ptr;
        while (*ptr == '/')
                ptr++;
@@ -485,8 +488,8 @@ static int ct_restore_stripe(const char *src, const char *dst, int dst_fd,
        rc = fsetxattr(dst_fd, XATTR_LUSTRE_LOV, lovea, lovea_size,
                       XATTR_CREATE);
        if (rc < 0) {
-               CT_ERROR(errno, "cannot set lov EA on '%s'", dst);
                rc = -errno;
+               CT_ERROR(rc, "cannot set lov EA on '%s'", dst);
        }
 
        return rc;
@@ -856,7 +859,7 @@ static int ct_archive(const struct hsm_action_item *hai, const long hal_flags)
        if (hai->hai_extent.length == -1) {
                /* whole file, write it to tmp location and atomically
                 * replace old archived file */
-               strncat(dst, "_tmp", sizeof(dst) - strlen(dst) - 1);
+               strlcat(dst, "_tmp", sizeof(dst));
                /* we cannot rely on the same test because ct_copy_data()
                 * updates hai_extent.length */
                rename_needed = true;
@@ -877,7 +880,7 @@ static int ct_archive(const struct hsm_action_item *hai, const long hal_flags)
 
        src_fd = llapi_hsm_action_get_fd(hcp);
        if (src_fd < 0) {
-               rc = -errno;
+               rc = src_fd;
                CT_ERROR(rc, "cannot open '%s' for read", src);
                goto fini_major;
        }
@@ -1136,6 +1139,11 @@ static int ct_restore(const struct hsm_action_item *hai, const long hal_flags)
        }
 
        dst_fd = llapi_hsm_action_get_fd(hcp);
+       if (dst_fd < 0) {
+               rc = dst_fd;
+               CT_ERROR(rc, "cannot open '%s' for write", dst);
+               goto fini;
+       }
 
        if (set_lovea) {
                /* the layout cannot be allocated through .fid so we have to
@@ -1202,7 +1210,7 @@ static int ct_remove(const struct hsm_action_item *hai, const long hal_flags)
                goto fini;
        }
 
-       strncat(dst, ".lov", sizeof(dst) - strlen(dst) - 1);
+       strlcat(dst, ".lov", sizeof(dst));
        rc = unlink(dst);
        if (rc < 0) {
                rc = -errno;
@@ -1529,8 +1537,8 @@ static int ct_rebind_one(const lustre_fid *old_fid, const lustre_fid *new_fid)
                        return -errno;
                }
                /* rename lov file */
-               strncat(src, ".lov", sizeof(src) - strlen(src) - 1);
-               strncat(dst, ".lov", sizeof(dst) - strlen(dst) - 1);
+               strlcat(src, ".lov", sizeof(src));
+               strlcat(dst, ".lov", sizeof(dst));
                if (rename(src, dst))
                        CT_ERROR(errno, "cannot rename '%s' to '%s'", src, dst);
 
@@ -1690,21 +1698,28 @@ out:
 
 static int ct_max_sequence(void)
 {
-       int   rc, i;
-       char  path[PATH_MAX];
-       __u64 seq = 0;
-       __u16 subseq;
+       int     rc, i;
+       char    path[PATH_MAX];
+       __u64   seq = 0;
+       __u16   subseq;
 
-       strncpy(path, opt.o_hsm_root, sizeof(path));
+       strlcpy(path, opt.o_hsm_root, sizeof(path));
        /* FID sequence is stored in top-level directory names:
         * hsm_root/16bits (high weight)/16 bits/16 bits/16 bits (low weight).
         */
        for (i = 0; i < 4; i++) {
+               size_t path_len;
+
                rc = ct_dir_level_max(path, &subseq);
                if (rc != 0)
                        return rc;
                seq |= ((__u64)subseq << ((3 - i) * 16));
-               sprintf(path + strlen(path), "/%04x", subseq);
+               path_len = strlen(path);
+               rc = snprintf(path + path_len, sizeof(path) - path_len,
+                             "/%04x", subseq);
+               if (rc >= (sizeof(path) - path_len))
+                       return -E2BIG;
+               path[sizeof(path) - 1] = '\0';
        }
 
        printf("max_sequence: "LPX64"\n", seq);
@@ -1844,7 +1859,7 @@ static int ct_setup(void)
        if (rc < 0) {
                CT_ERROR(rc, "cannot find a Lustre filesystem mounted at '%s'",
                         opt.o_mnt);
-               return -rc;
+               return rc;
        }
 
        return rc;
@@ -1870,14 +1885,16 @@ int main(int argc, char **argv)
 {
        int     rc;
 
-       strncpy(cmd_name, basename(argv[0]), sizeof(cmd_name));
+       strlcpy(cmd_name, basename(argv[0]), sizeof(cmd_name));
        rc = ct_parseopts(argc, argv);
        if (rc < 0) {
                CT_WARN("try '%s --help' for more information", cmd_name);
                return -rc;
        }
 
-       ct_setup();
+       rc = ct_setup();
+       if (rc < 0)
+               goto error_cleanup;
 
        switch (opt.o_action) {
        case CA_IMPORT:
@@ -1899,6 +1916,7 @@ int main(int argc, char **argv)
                         " rc=%d (%s)", err_major, err_minor, rc,
                         strerror(-rc));
 
+error_cleanup:
        ct_cleanup();
 
        return -rc;