elf: Fix hwcaps string size overestimation

Commit dad90d5282 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>
This commit is contained in:
Javier Pello 2022-09-05 20:09:01 +02:00 committed by Florian Weimer
parent 3d7d5c10c8
commit a23820f605

View File

@ -193,7 +193,7 @@ _dl_important_hwcaps (const char *glibc_hwcaps_prepend,
/* Each hwcaps subdirectory has a GLIBC_HWCAPS_PREFIX string prefix /* Each hwcaps subdirectory has a GLIBC_HWCAPS_PREFIX string prefix
and a "/" suffix once stored in the result. */ and a "/" suffix once stored in the result. */
hwcaps_counts.maximum_length += strlen (GLIBC_HWCAPS_PREFIX) + 1; 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); + hwcaps_counts.total_length);
/* Count the number of bits set in the masked value. */ /* 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); assert (m == cnt);
/* Determine the total size of all strings together. */ /* Determine the total size of all strings together. */
size_t total;
if (cnt == 1) if (cnt == 1)
total += temp[0].len + 1; total = temp[0].len + 1;
else else
{ {
total += temp[0].len + temp[cnt - 1].len + 2; total = temp[0].len + temp[cnt - 1].len + 2;
if (cnt > 2) if (cnt > 2)
{ {
total <<= 1; total <<= 1;
@ -255,6 +256,7 @@ _dl_important_hwcaps (const char *glibc_hwcaps_prepend,
/* This is the overall result, including both glibc-hwcaps /* This is the overall result, including both glibc-hwcaps
subdirectories and the legacy hwcaps subdirectories using the subdirectories and the legacy hwcaps subdirectories using the
power set construction. */ power set construction. */
total += hwcaps_sz;
struct r_strlenpair *overall_result struct r_strlenpair *overall_result
= malloc (*sz * sizeof (*result) + total); = malloc (*sz * sizeof (*result) + total);
if (overall_result == NULL) if (overall_result == NULL)