diff options
Diffstat (limited to 'elf-Fix-hwcaps-string-size-overestimation.patch')
-rw-r--r-- | elf-Fix-hwcaps-string-size-overestimation.patch | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/elf-Fix-hwcaps-string-size-overestimation.patch b/elf-Fix-hwcaps-string-size-overestimation.patch new file mode 100644 index 0000000..f0b2857 --- /dev/null +++ b/elf-Fix-hwcaps-string-size-overestimation.patch @@ -0,0 +1,62 @@ +From a23820f6052a740246fdc7dcd9c43ce8eed0c45a Mon Sep 17 00:00:00 2001 +From: Javier Pello <devel@otheo.eu> +Date: Mon, 5 Sep 2022 20:09:01 +0200 +Subject: [PATCH] elf: Fix hwcaps string size overestimation + +Conflict:NA +Reference:https://sourceware.org/git/?p=glibc.git;a=commit;h=a23820f6052a740246fdc7dcd9c43ce8eed0c45a + +Commit dad90d528259b669342757c37dedefa8577e2636 added glibc-hwcaps +support for LD_LIBRARY_PATH and, for this, it adjusted the total +string size required in _dl_important_hwcaps. However, in doing so +it inadvertently altered the calculation of the size required for +the power set strings, as the computation of the power set string +size depended on the first value assigned to the total variable, +which is later shifted, resulting in overallocation of string +space. Fix this now by using a different variable to hold the +string size required for glibc-hwcaps. + +Signed-off-by: Javier Pello <devel@otheo.eu> +--- + elf/dl-hwcaps.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/elf/dl-hwcaps.c b/elf/dl-hwcaps.c +index 6f161f6ad5..92eb53790e 100644 +--- a/elf/dl-hwcaps.c ++++ b/elf/dl-hwcaps.c +@@ -193,7 +193,7 @@ _dl_important_hwcaps (const char *glibc_hwcaps_prepend, + /* Each hwcaps subdirectory has a GLIBC_HWCAPS_PREFIX string prefix + and a "/" suffix once stored in the result. */ + hwcaps_counts.maximum_length += strlen (GLIBC_HWCAPS_PREFIX) + 1; +- size_t total = (hwcaps_counts.count * (strlen (GLIBC_HWCAPS_PREFIX) + 1) ++ size_t hwcaps_sz = (hwcaps_counts.count * (strlen (GLIBC_HWCAPS_PREFIX) + 1) + + hwcaps_counts.total_length); + + /* Count the number of bits set in the masked value. */ +@@ -229,11 +229,12 @@ _dl_important_hwcaps (const char *glibc_hwcaps_prepend, + assert (m == cnt); + + /* Determine the total size of all strings together. */ ++ size_t total; + if (cnt == 1) +- total += temp[0].len + 1; ++ total = temp[0].len + 1; + else + { +- total += temp[0].len + temp[cnt - 1].len + 2; ++ total = temp[0].len + temp[cnt - 1].len + 2; + if (cnt > 2) + { + total <<= 1; +@@ -255,6 +256,7 @@ _dl_important_hwcaps (const char *glibc_hwcaps_prepend, + /* This is the overall result, including both glibc-hwcaps + subdirectories and the legacy hwcaps subdirectories using the + power set construction. */ ++ total += hwcaps_sz; + struct r_strlenpair *overall_result + = malloc (*sz * sizeof (*result) + total); + if (overall_result == NULL) +-- +2.27.0 + |