commit: 4b3d656a450d0e7b6aa402eb784ae63440c0ced0 Author: Nicolas PARLANT <nicolas.parlant <AT> parhuet <DOT> fr> AuthorDate: Thu May 22 08:36:20 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Thu May 22 15:58:49 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=4b3d656a
dev-libs/libconfig: add 1.8.0 this release builds with gcc-15 / llvm-20 add dot-a eclass for static-libs two patches from upstream for 32bits tests and invalid mem write Signed-off-by: Nicolas PARLANT <nicolas.parlant <AT> parhuet.fr> Part-of: https://github.com/gentoo/gentoo/pull/42200 Closes: https://github.com/gentoo/gentoo/pull/42200 Signed-off-by: Sam James <sam <AT> gentoo.org> dev-libs/libconfig/Manifest | 1 + .../libconfig-1.8.0-fix_format_bin_32bit.patch | 32 +++++++ .../files/libconfig-1.8.0-fix_inv_mem_w.patch | 103 +++++++++++++++++++++ dev-libs/libconfig/libconfig-1.8.0.ebuild | 74 +++++++++++++++ 4 files changed, 210 insertions(+) diff --git a/dev-libs/libconfig/Manifest b/dev-libs/libconfig/Manifest index fc104704e778..e9c21d97b356 100644 --- a/dev-libs/libconfig/Manifest +++ b/dev-libs/libconfig/Manifest @@ -1 +1,2 @@ DIST libconfig-1.7.3.tar.gz 3026416 BLAKE2B 94301be4d6e472fc9daeac7a04074855737ddda94bb5748cd0087fafe192cf674ea1c020808ebf855372188b6b27a57ed185323fa26988bb1fccde0566617cba SHA512 3749bf9eb29bab0f6b14f4fc759f0c419ed27a843842aaabed1ec1fbe0faa8c93322ff875ca1291d69cb28a39ece86d512aec42c2140d566c38c56dc616734f4 +DIST libconfig-1.8.0.tar.gz 1722355 BLAKE2B 3879fa62277332f9df07c3776d11e6ec6c7518fe83c83a6b50b15683a34d9d57f54bb550f911076654b0f62c40fa650167d8a233e01f05be0c5b5dcc9fc8749b SHA512 7899d3898e1741d90cf2381561b172ec6ba2bcc47d1b3e6058bcef74d73634d9be33eb8f99a58c7af15ac99e56800510edf3c412d9c1f136e6a3ab744455b992 diff --git a/dev-libs/libconfig/files/libconfig-1.8.0-fix_format_bin_32bit.patch b/dev-libs/libconfig/files/libconfig-1.8.0-fix_format_bin_32bit.patch new file mode 100644 index 000000000000..0af33d7fb324 --- /dev/null +++ b/dev-libs/libconfig/files/libconfig-1.8.0-fix_format_bin_32bit.patch @@ -0,0 +1,32 @@ +https://github.com/hyperrealm/libconfig/pull/260 +From b90c45a18110fcca415d00a98ff79c908c42544b Mon Sep 17 00:00:00 2001 +From: Sergei Trofimovich <[email protected]> +Date: Thu, 1 May 2025 20:58:26 +0100 +Subject: [PATCH] libconfig_format_bin: fix on 32-bit systems + +Before the change conversion of bin produced wrong +leading zeros and failed test son `i686-linux` as: + + [TEST] BinaryAndHex + files "temp.cfg" and "./testdata/binhex.cfg" differ starting at line 5, char 12 + tests.c:55: failed assert: ("temp.cfg") ["temp.cfg"] ==txtfile (output_file) ["./testdata/binhex.cfg"] + [FAIL] BinaryAndHex + +Closes: https://github.com/hyperrealm/libconfig/issues/259 +--- + lib/util.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/util.c b/lib/util.c +index 5455cac..cf73766 100644 +--- a/lib/util.c ++++ b/lib/util.c +@@ -286,7 +286,7 @@ void libconfig_format_double(double val, int precision, int sci_ok, char *buf, + /* ------------------------------------------------------------------------- */ + + #ifdef __GNUC__ +-#define clzl(x) __builtin_clzl(x) ++#define clzl(x) __builtin_clzll(x) + #else + static int clzl(int64_t val) + { diff --git a/dev-libs/libconfig/files/libconfig-1.8.0-fix_inv_mem_w.patch b/dev-libs/libconfig/files/libconfig-1.8.0-fix_inv_mem_w.patch new file mode 100644 index 000000000000..aee117ca9e3b --- /dev/null +++ b/dev-libs/libconfig/files/libconfig-1.8.0-fix_inv_mem_w.patch @@ -0,0 +1,103 @@ +https://github.com/hyperrealm/libconfig/pull/261 +From f55523ab4722b216349d909bf770f7a84b4f4c67 Mon Sep 17 00:00:00 2001 +From: Shubham Tiwari <[email protected]> +Date: Sun, 4 May 2025 17:39:52 +0530 +Subject: [PATCH] Fix invalid memory write + +--- + fuzz/fuzz_config_read.c | 60 ++++++++++++++++++----------------------- + 1 file changed, 26 insertions(+), 34 deletions(-) + +diff --git a/fuzz/fuzz_config_read.c b/fuzz/fuzz_config_read.c +index 38138dd..02adb0b 100644 +--- a/fuzz/fuzz_config_read.c ++++ b/fuzz/fuzz_config_read.c +@@ -93,49 +93,36 @@ size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size, + srand(seed); + config_init(&cfg); + +- fuzz_data_t *fuzz_data = (fuzz_data_t *) data; +- +- // Ensure MIN_BUFF_SIZE * 2 <= size <= MAX_BUFF_SIZE +- if (remaining_size < MIN_BUFF_SIZE) +- { +- return 2 * MIN_BUFF_SIZE; +- } +- if (remaining_size > MAX_BUFF_SIZE) +- { +- return MAX_BUFF_SIZE; ++ if (size < MIN_BUFF_SIZE || max_size < MIN_BUFF_SIZE || max_size > MAX_BUFF_SIZE) { ++ return MIN_BUFF_SIZE; + } + +- remaining_size -= MIN_BUFF_SIZE; ++ fuzz_data_t *fuzz_data = (fuzz_data_t *) data; ++ remaining_size -= sizeof(fuzz_data_t); + +- fuzz_data->lookup_type = rand() % (CONFIG_TYPE_LIST + 1); ++ // Limit sizes to avoid overflow ++ size_t max_content = min_size(remaining_size, MAX_CONFIG_SIZE - 1); ++ fuzz_data->content_size = rand() % max_content; + +- // Ensure the content and path sizes are within bounds +- if (fuzz_data->content_size + fuzz_data->path_size > remaining_size) +- { +- fuzz_data->content_size = rand() % remaining_size; +- fuzz_data->path_size = remaining_size - fuzz_data->content_size; ++ size_t max_path = min_size(remaining_size - fuzz_data->content_size, MAX_PATH_SIZE - 1); ++ fuzz_data->path_size = rand() % max_path; ++ ++ if (fuzz_data->content_size + fuzz_data->path_size + sizeof(fuzz_data_t) >= max_size) { ++ fuzz_data->content_size = max_content / 2; ++ fuzz_data->path_size = max_path / 2; + } + +- // Extract and mutate the config + fuzz_data_content(fuzz_data, &config_data); +- fuzz_data->content_size = LLVMFuzzerMutate(config_data, fuzz_data->content_size, remaining_size); +- config_data[fuzz_data->content_size] = '\0'; // Null-terminate the config ++ fuzz_data_path(fuzz_data, &path_data); + +- if (fuzz_data->content_size > remaining_size) { +- return 0; +- } ++ // Mutate content and path safely ++ fuzz_data->content_size = LLVMFuzzerMutate(config_data, fuzz_data->content_size, max_content); ++ config_data[fuzz_data->content_size < max_content ? fuzz_data->content_size : max_content - 1] = '\0'; + +- remaining_size -= fuzz_data->content_size; ++ fuzz_data->path_size = LLVMFuzzerMutate(path_data, fuzz_data->path_size, max_path); ++ path_data[fuzz_data->path_size < max_path ? fuzz_data->path_size : max_path - 1] = '\0'; + +- // Extract and mutate the path +- fuzz_data->path_size = min_size(fuzz_data->path_size, remaining_size); +- fuzz_data_path(fuzz_data, &path_data); +- if (remaining_size > 0) { +- fuzz_data->path_size = LLVMFuzzerMutate(path_data, fuzz_data->path_size, remaining_size); +- } +- path_data[fuzz_data->path_size] = '\0'; // Null-terminate the path +- +- return min_size(MIN_BUFF_SIZE + fuzz_data->content_size + fuzz_data->path_size, max_size); ++ return sizeof(fuzz_data_t) + fuzz_data->content_size + fuzz_data->path_size + 2; + } + + int LLVMFuzzerTestOneInput(const uint8_t *data, const size_t size) +@@ -169,6 +156,11 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, const size_t size) + + config_init(&cfg); + ++ if (fuzz_data->content_size > MAX_CONFIG_SIZE || ++ fuzz_data->path_size > MAX_PATH_SIZE || ++ sizeof(fuzz_data_t) + fuzz_data->content_size + fuzz_data->path_size > size) { ++ goto end; ++ } + fuzz_data_content(fuzz_data, &config_ptr); + fuzz_data_path(fuzz_data, &path_ptr); + const char *config_data = (const char *) config_ptr; +@@ -243,4 +235,4 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, const size_t size) + end: + config_destroy(&cfg); + return rc; +-} +\ No newline at end of file ++} diff --git a/dev-libs/libconfig/libconfig-1.8.0.ebuild b/dev-libs/libconfig/libconfig-1.8.0.ebuild new file mode 100644 index 000000000000..69be7e860802 --- /dev/null +++ b/dev-libs/libconfig/libconfig-1.8.0.ebuild @@ -0,0 +1,74 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +MY_PV=1.8 # Release "1.8.0" tagged as "1.8" + +inherit autotools dot-a multilib-minimal + +DESCRIPTION="Libconfig is a simple library for manipulating structured configuration files" +HOMEPAGE=" + https://www.hyperrealm.com/libconfig/libconfig.html + https://github.com/hyperrealm/libconfig +" +SRC_URI="https://github.com/hyperrealm/${PN}/archive/v${MY_PV}.tar.gz -> ${P}.tar.gz" +S="${WORKDIR}/${PN}-${MY_PV}" + +LICENSE="LGPL-2.1" +SLOT="0/11" +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~x86-linux" +IUSE="+cxx static-libs test" +RESTRICT="!test? ( test )" + +DEPEND=" + sys-apps/texinfo + app-alternatives/yacc + dev-build/libtool +" + +PATCHES=( + # Fix tests on 32bits. Merged upstream + # https://github.com/hyperrealm/libconfig/pull/260 + "${FILESDIR}"/${P}-fix_format_bin_32bit.patch + # Fix mem corruption. Merged upstream + # https://github.com/hyperrealm/libconfig/pull/261 + "${FILESDIR}"/${P}-fix_inv_mem_w.patch +) + +src_prepare() { + default + + sed -i \ + -e '/sleep 3/d' \ + configure.ac || die + + eautoreconf + multilib_copy_sources +} + +multilib_src_configure() { + use static-libs && lto-guarantee-fat + + local myeconfargs=( + $(use_enable cxx) + $(use_enable static-libs static) + $(use_enable test tests) + --disable-examples + ) + + econf "${myeconfargs[@]}" +} + +multilib_src_test() { + # It responds to check but that does not work as intended + emake test +} + +multilib_src_install() { + default + + find "${ED}" -name '*.la' -delete || die + + strip-lto-bytecode +}
