int rc;
ptr = strdup(path);
+ if (ptr == NULL)
+ return -errno;
+
saved = ptr;
while (*ptr == '/')
ptr++;
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;
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;
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;
}
}
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
goto fini;
}
- strncat(dst, ".lov", sizeof(dst) - strlen(dst) - 1);
+ strlcat(dst, ".lov", sizeof(dst));
rc = unlink(dst);
if (rc < 0) {
rc = -errno;
static int ct_import_fid(const lustre_fid *import_fid)
{
- char fid_path[PATH_MAX];
+ char fid_path[PATH_MAX];
+ int rc;
+
+ ct_path_lustre(fid_path, sizeof(fid_path), opt.o_mnt, import_fid);
+ rc = access(fid_path, F_OK);
+ if (rc == 0 || errno != ENOENT) {
+ rc = (errno == 0) ? -EEXIST : -errno;
+ CT_ERROR(rc, "cannot import '"DFID"'", PFID(import_fid));
+ return rc;
+ }
ct_path_archive(fid_path, sizeof(fid_path), opt.o_hsm_root,
import_fid);
+
CT_TRACE("Resolving "DFID" to %s", PFID(import_fid), fid_path);
return ct_import_one(fid_path, opt.o_dst);
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);
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);
hal->hal_fsname, hal->hal_archive_id, hal->hal_count);
if (strcmp(hal->hal_fsname, fs_name) != 0) {
- CT_ERROR(EINVAL, "'%s' invalid fs name, expecting: %s",
+ rc = -EINVAL;
+ CT_ERROR(rc, "'%s' invalid fs name, expecting: %s",
hal->hal_fsname, fs_name);
err_major++;
if (opt.o_abort_on_error)
hai = hai_next(hai);
}
- llapi_hsm_action_list_free(&hal);
-
if (opt.o_abort_on_error && err_major)
break;
}
if (rc < 0) {
CT_ERROR(rc, "cannot find a Lustre filesystem mounted at '%s'",
opt.o_mnt);
- return -rc;
+ return rc;
}
return rc;
{
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:
" rc=%d (%s)", err_major, err_minor, rc,
strerror(-rc));
+error_cleanup:
ct_cleanup();
return -rc;