aboutsummaryrefslogtreecommitdiffstats
path: root/scrub
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2019-11-06 17:29:08 -0500
committerEric Sandeen <sandeen@sandeen.net>2019-11-06 17:29:08 -0500
commitac1c1f8e68a83f0ec0a969ec75464c9f9df9967b (patch)
tree7e4c801e4a7b415f6550764e40956950f1da86b0 /scrub
parent7a2eef2b2cede76f4e8c02776c28af37a01f799c (diff)
downloadxfsprogs-dev-ac1c1f8e68a83f0ec0a969ec75464c9f9df9967b.tar.gz
xfs_scrub: remove moveon from unicode name collision helpers
Replace the moveon returns in the unicode name collsion detector code with a direct integer error return. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
Diffstat (limited to 'scrub')
-rw-r--r--scrub/phase5.c52
-rw-r--r--scrub/unicrash.c64
-rw-r--r--scrub/unicrash.h24
3 files changed, 80 insertions, 60 deletions
diff --git a/scrub/phase5.c b/scrub/phase5.c
index 7f4ae1a811..e752a0c49a 100644
--- a/scrub/phase5.c
+++ b/scrub/phase5.c
@@ -87,23 +87,32 @@ xfs_scrub_scan_dirents(
DIR *dir;
struct dirent *dentry;
bool moveon = true;
+ int ret;
dir = fdopendir(*fd);
if (!dir) {
str_errno(ctx, descr_render(dsc));
+ moveon = false;
goto out;
}
*fd = -1; /* closedir will close *fd for us */
- moveon = unicrash_dir_init(&uc, ctx, bstat);
- if (!moveon)
+ ret = unicrash_dir_init(&uc, ctx, bstat);
+ if (ret) {
+ str_liberror(ctx, ret, descr_render(dsc));
+ moveon = false;
goto out_unicrash;
+ }
dentry = readdir(dir);
while (dentry) {
- if (uc)
- moveon = unicrash_check_dir_name(uc, dsc, dentry);
- else
+ if (uc) {
+ ret = unicrash_check_dir_name(uc, dsc, dentry);
+ if (ret) {
+ str_liberror(ctx, ret, descr_render(dsc));
+ moveon = false;
+ }
+ } else
moveon = xfs_scrub_check_name(ctx, dsc,
_("directory"), dentry->d_name);
if (!moveon)
@@ -154,9 +163,11 @@ xfs_scrub_scan_fhandle_namespace_xattrs(
int i;
int error;
- moveon = unicrash_xattr_init(&uc, ctx, bstat);
- if (!moveon)
+ error = unicrash_xattr_init(&uc, ctx, bstat);
+ if (error) {
+ str_liberror(ctx, error, descr_render(dsc));
return false;
+ }
memset(attrbuf, 0, XFS_XATTR_LIST_MAX);
memset(&cur, 0, sizeof(cur));
@@ -169,10 +180,15 @@ xfs_scrub_scan_fhandle_namespace_xattrs(
ent = ATTR_ENTRY(attrlist, i);
snprintf(keybuf, XATTR_NAME_MAX, "%s.%s", attr_ns->name,
ent->a_name);
- if (uc)
- moveon = unicrash_check_xattr_name(uc, dsc,
+ if (uc) {
+ error = unicrash_check_xattr_name(uc, dsc,
keybuf);
- else
+ if (error) {
+ str_liberror(ctx, error,
+ descr_render(dsc));
+ moveon = false;
+ }
+ } else
moveon = xfs_scrub_check_name(ctx, dsc,
_("extended attribute"),
keybuf);
@@ -321,9 +337,11 @@ xfs_scrub_fs_label(
bool moveon = true;
int error;
- moveon = unicrash_fs_label_init(&uc, ctx);
- if (!moveon)
+ error = unicrash_fs_label_init(&uc, ctx);
+ if (error) {
+ str_liberror(ctx, error, descr_render(&dsc));
return false;
+ }
descr_set(&dsc, NULL);
@@ -342,9 +360,13 @@ xfs_scrub_fs_label(
goto out;
/* Otherwise check for weirdness. */
- if (uc)
- moveon = unicrash_check_fs_label(uc, &dsc, label);
- else
+ if (uc) {
+ error = unicrash_check_fs_label(uc, &dsc, label);
+ if (error) {
+ str_liberror(ctx, error, descr_render(&dsc));
+ moveon = false;
+ }
+ } else
moveon = xfs_scrub_check_name(ctx, &dsc, _("filesystem label"),
label);
if (!moveon)
diff --git a/scrub/unicrash.c b/scrub/unicrash.c
index 9b619c021a..d5d2cf201e 100644
--- a/scrub/unicrash.c
+++ b/scrub/unicrash.c
@@ -145,8 +145,8 @@ is_utf8_locale(void)
}
/*
- * Generate normalized form and skeleton of the name.
- * If this fails, just forget everything; this is an advisory checker.
+ * Generate normalized form and skeleton of the name. If this fails, just
+ * forget everything and return false; this is an advisory checker.
*/
static bool
name_entry_compute_checknames(
@@ -379,7 +379,7 @@ name_entry_examine(
}
/* Initialize the collision detector. */
-static bool
+static int
unicrash_init(
struct unicrash **ucp,
struct scrub_ctx *ctx,
@@ -392,7 +392,7 @@ unicrash_init(
if (!is_utf8_locale()) {
*ucp = NULL;
- return true;
+ return 0;
}
if (nr_buckets > 65536)
@@ -402,7 +402,7 @@ unicrash_init(
p = calloc(1, UNICRASH_SZ(nr_buckets));
if (!p)
- return false;
+ return errno;
p->ctx = ctx;
p->nr_buckets = nr_buckets;
p->compare_ino = compare_ino;
@@ -418,12 +418,12 @@ unicrash_init(
p->is_only_root_writeable = is_only_root_writeable;
*ucp = p;
- return true;
+ return 0;
out_spoof:
uspoof_close(p->spoof);
out_free:
free(p);
- return false;
+ return ENOMEM;
}
/*
@@ -441,7 +441,7 @@ is_only_root_writable(
}
/* Initialize the collision detector for a directory. */
-bool
+int
unicrash_dir_init(
struct unicrash **ucp,
struct scrub_ctx *ctx,
@@ -456,7 +456,7 @@ unicrash_dir_init(
}
/* Initialize the collision detector for an extended attribute. */
-bool
+int
unicrash_xattr_init(
struct unicrash **ucp,
struct scrub_ctx *ctx,
@@ -468,7 +468,7 @@ unicrash_xattr_init(
}
/* Initialize the collision detector for a filesystem label. */
-bool
+int
unicrash_fs_label_init(
struct unicrash **ucp,
struct scrub_ctx *ctx)
@@ -608,7 +608,7 @@ out:
* must be skeletonized according to Unicode TR39 to detect names that
* could be visually confused with each other.
*/
-static bool
+static void
unicrash_add(
struct unicrash *uc,
struct name_entry *new_entry,
@@ -633,7 +633,7 @@ unicrash_add(
(uc->compare_ino ? entry->ino != new_entry->ino : true)) {
*badflags |= UNICRASH_NOT_UNIQUE;
*existing_entry = entry;
- return true;
+ return;
}
/* Confusable? */
@@ -642,16 +642,14 @@ unicrash_add(
(uc->compare_ino ? entry->ino != new_entry->ino : true)) {
*badflags |= UNICRASH_CONFUSABLE;
*existing_entry = entry;
- return true;
+ return;
}
entry = entry->next;
}
-
- return true;
}
/* Check a name for unicode normalization problems or collisions. */
-static bool
+static int
__unicrash_check_name(
struct unicrash *uc,
struct descr *dsc,
@@ -660,67 +658,67 @@ __unicrash_check_name(
xfs_ino_t ino)
{
struct name_entry *dup_entry = NULL;
- struct name_entry *new_entry;
+ struct name_entry *new_entry = NULL;
unsigned int badflags = 0;
- bool moveon;
/* If we can't create entry data, just skip it. */
if (!name_entry_create(uc, name, ino, &new_entry))
- return true;
+ return 0;
name_entry_examine(new_entry, &badflags);
-
- moveon = unicrash_add(uc, new_entry, &badflags, &dup_entry);
- if (!moveon)
- return false;
-
+ unicrash_add(uc, new_entry, &badflags, &dup_entry);
if (badflags)
unicrash_complain(uc, dsc, namedescr, new_entry, badflags,
dup_entry);
- return true;
+ return 0;
}
-/* Check a directory entry for unicode normalization problems or collisions. */
-bool
+/*
+ * Check a directory entry for unicode normalization problems or collisions.
+ * If errors occur, this function will log them and return nonzero.
+ */
+int
unicrash_check_dir_name(
struct unicrash *uc,
struct descr *dsc,
struct dirent *dentry)
{
if (!uc)
- return true;
+ return 0;
return __unicrash_check_name(uc, dsc, _("directory"),
dentry->d_name, dentry->d_ino);
}
/*
* Check an extended attribute name for unicode normalization problems
- * or collisions.
+ * or collisions. If errors occur, this function will log them and return
+ * nonzero.
*/
-bool
+int
unicrash_check_xattr_name(
struct unicrash *uc,
struct descr *dsc,
const char *attrname)
{
if (!uc)
- return true;
+ return 0;
return __unicrash_check_name(uc, dsc, _("extended attribute"),
attrname, 0);
}
/*
* Check the fs label for unicode normalization problems or misleading bits.
+ * If errors occur, this function will log them and return nonzero.
*/
-bool
+int
unicrash_check_fs_label(
struct unicrash *uc,
struct descr *dsc,
const char *label)
{
if (!uc)
- return true;
+ return 0;
return __unicrash_check_name(uc, dsc, _("filesystem label"),
label, 0);
}
diff --git a/scrub/unicrash.h b/scrub/unicrash.h
index af96b2305c..c3a7f385c5 100644
--- a/scrub/unicrash.h
+++ b/scrub/unicrash.h
@@ -13,26 +13,26 @@ struct unicrash;
struct dirent;
-bool unicrash_dir_init(struct unicrash **ucp, struct scrub_ctx *ctx,
+int unicrash_dir_init(struct unicrash **ucp, struct scrub_ctx *ctx,
struct xfs_bulkstat *bstat);
-bool unicrash_xattr_init(struct unicrash **ucp, struct scrub_ctx *ctx,
+int unicrash_xattr_init(struct unicrash **ucp, struct scrub_ctx *ctx,
struct xfs_bulkstat *bstat);
-bool unicrash_fs_label_init(struct unicrash **ucp, struct scrub_ctx *ctx);
+int unicrash_fs_label_init(struct unicrash **ucp, struct scrub_ctx *ctx);
void unicrash_free(struct unicrash *uc);
-bool unicrash_check_dir_name(struct unicrash *uc, struct descr *dsc,
+int unicrash_check_dir_name(struct unicrash *uc, struct descr *dsc,
struct dirent *dirent);
-bool unicrash_check_xattr_name(struct unicrash *uc, struct descr *dsc,
+int unicrash_check_xattr_name(struct unicrash *uc, struct descr *dsc,
const char *attrname);
-bool unicrash_check_fs_label(struct unicrash *uc, struct descr *dsc,
+int unicrash_check_fs_label(struct unicrash *uc, struct descr *dsc,
const char *label);
#else
-# define unicrash_dir_init(u, c, b) (true)
-# define unicrash_xattr_init(u, c, b) (true)
-# define unicrash_fs_label_init(u, c) (true)
+# define unicrash_dir_init(u, c, b) (0)
+# define unicrash_xattr_init(u, c, b) (0)
+# define unicrash_fs_label_init(u, c) (0)
# define unicrash_free(u) do {(u) = (u);} while (0)
-# define unicrash_check_dir_name(u, d, n) (true)
-# define unicrash_check_xattr_name(u, d, n) (true)
-# define unicrash_check_fs_label(u, d, n) (true)
+# define unicrash_check_dir_name(u, d, n) (0)
+# define unicrash_check_xattr_name(u, d, n) (0)
+# define unicrash_check_fs_label(u, d, n) (0)
#endif /* HAVE_LIBICU */
#endif /* XFS_SCRUB_UNICRASH_H_ */