From: Darrick J. Wong Date: Mon, 29 Jul 2024 23:23:10 +0000 (-0700) Subject: xfs_scrub: guard against libicu returning negative buffer lengths X-Git-Tag: v6.10.0~15^2~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1072863bf085211c109f232c21e653091242d011;p=thirdparty%2Fxfsprogs-dev.git xfs_scrub: guard against libicu returning negative buffer lengths The libicu functions u_strFromUTF8, unorm2_normalize, and uspoof_getSkeleton return int32_t values. Guard against negative return values, even though the library itself never does this. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- diff --git a/scrub/unicrash.c b/scrub/unicrash.c index 4517e2bc..456caec2 100644 --- a/scrub/unicrash.c +++ b/scrub/unicrash.c @@ -189,7 +189,7 @@ name_entry_compute_checknames( /* Convert bytestr to unistr for normalization */ u_strFromUTF8(NULL, 0, &unistrlen, entry->name, entry->namelen, &uerr); - if (uerr != U_BUFFER_OVERFLOW_ERROR) + if (uerr != U_BUFFER_OVERFLOW_ERROR || unistrlen < 0) return false; uerr = U_ZERO_ERROR; unistr = calloc(unistrlen + 1, sizeof(UChar)); @@ -203,7 +203,7 @@ name_entry_compute_checknames( /* Normalize the string. */ normstrlen = unorm2_normalize(uc->normalizer, unistr, unistrlen, NULL, 0, &uerr); - if (uerr != U_BUFFER_OVERFLOW_ERROR) + if (uerr != U_BUFFER_OVERFLOW_ERROR || normstrlen < 0) goto out_unistr; uerr = U_ZERO_ERROR; normstr = calloc(normstrlen + 1, sizeof(UChar)); @@ -217,7 +217,7 @@ name_entry_compute_checknames( /* Compute skeleton. */ skelstrlen = uspoof_getSkeleton(uc->spoof, 0, unistr, unistrlen, NULL, 0, &uerr); - if (uerr != U_BUFFER_OVERFLOW_ERROR) + if (uerr != U_BUFFER_OVERFLOW_ERROR || skelstrlen < 0) goto out_normstr; uerr = U_ZERO_ERROR; skelstr = calloc(skelstrlen + 1, sizeof(UChar));