From: Darrick J. Wong <djwong@xxxxxxxxxx> Make sure we actually load and unload libicu properly. This isn't strictly required since the library can bootstrap itself, but unloading means fewer things for valgrind to complain about. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- scrub/unicrash.c | 17 +++++++++++++++++ scrub/unicrash.h | 4 ++++ scrub/xfs_scrub.c | 6 ++++++ 3 files changed, 27 insertions(+) diff --git a/scrub/unicrash.c b/scrub/unicrash.c index d5d2cf20..de3217c2 100644 --- a/scrub/unicrash.c +++ b/scrub/unicrash.c @@ -722,3 +722,20 @@ unicrash_check_fs_label( return __unicrash_check_name(uc, dsc, _("filesystem label"), label, 0); } + +/* Load libicu and initialize it. */ +bool +unicrash_load(void) +{ + UErrorCode uerr = U_ZERO_ERROR; + + u_init(&uerr); + return U_FAILURE(uerr); +} + +/* Unload libicu once we're done with it. */ +void +unicrash_unload(void) +{ + u_cleanup(); +} diff --git a/scrub/unicrash.h b/scrub/unicrash.h index c3a7f385..32cae3d4 100644 --- a/scrub/unicrash.h +++ b/scrub/unicrash.h @@ -25,6 +25,8 @@ int unicrash_check_xattr_name(struct unicrash *uc, struct descr *dsc, const char *attrname); int unicrash_check_fs_label(struct unicrash *uc, struct descr *dsc, const char *label); +bool unicrash_load(void); +void unicrash_unload(void); #else # define unicrash_dir_init(u, c, b) (0) # define unicrash_xattr_init(u, c, b) (0) @@ -33,6 +35,8 @@ int unicrash_check_fs_label(struct unicrash *uc, struct descr *dsc, # 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) +# define unicrash_init() (0) +# define unicrash_unload() do { } while (0) #endif /* HAVE_LIBICU */ #endif /* XFS_SCRUB_UNICRASH_H_ */ diff --git a/scrub/xfs_scrub.c b/scrub/xfs_scrub.c index 1edeb150..6b202912 100644 --- a/scrub/xfs_scrub.c +++ b/scrub/xfs_scrub.c @@ -603,6 +603,11 @@ main( setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + if (unicrash_load()) { + fprintf(stderr, + _("%s: could initialize Unicode library.\n"), progname); + goto out; + } pthread_mutex_init(&ctx.lock, NULL); ctx.mode = SCRUB_MODE_REPAIR; @@ -788,6 +793,7 @@ main( phase_end(&all_pi, 0); if (progress_fp) fclose(progress_fp); + unicrash_unload(); /* * If we're being run as a service, the return code must fit the LSB