From: Emil Velikov Date: Wed, 23 Oct 2024 16:19:53 +0000 (+0100) Subject: libkmod: stop copying symbol names in kmod_elf_get_modversions() X-Git-Tag: v34~105 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=069d314f8a4c965c762d4db36ea6eb0cea658801;p=thirdparty%2Fkmod.git libkmod: stop copying symbol names in kmod_elf_get_modversions() Since the caller already copies the strings as needed, we can just point to the elf data directly. Signed-off-by: Emil Velikov Reviewed-by: Tobias Stoeckmann Link: https://github.com/kmod-project/kmod/pull/210 Signed-off-by: Lucas De Marchi --- diff --git a/libkmod/libkmod-elf.c b/libkmod/libkmod-elf.c index 26254e7a..85c1a959 100644 --- a/libkmod/libkmod-elf.c +++ b/libkmod/libkmod-elf.c @@ -483,10 +483,9 @@ static inline void elf_get_modversion_lengths(const struct kmod_elf *elf, size_t /* array will be allocated with strings in a single malloc, just free *array */ int kmod_elf_get_modversions(const struct kmod_elf *elf, struct kmod_modversion **array) { - size_t off, crclen, namlen, slen, verlen; + size_t off, crclen, namlen, verlen; uint64_t sec_off, size; struct kmod_modversion *a; - char *itr; int i, count, err; elf_get_modversion_lengths(elf, &verlen, &crclen, &namlen); @@ -505,10 +504,12 @@ int kmod_elf_get_modversions(const struct kmod_elf *elf, struct kmod_modversion count = size / verlen; - off = sec_off; - slen = 0; + *array = a = malloc(sizeof(struct kmod_modversion) * count); + if (*array == NULL) + return -errno; - for (i = 0; i < count; i++, off += verlen) { + for (i = 0, off = sec_off; i < count; i++, off += verlen) { + uint64_t crc = elf_get_uint(elf, off, crclen); const char *symbol = elf_get_mem(elf, off + crclen); size_t nlen = strnlen(symbol, namlen); @@ -517,33 +518,12 @@ int kmod_elf_get_modversions(const struct kmod_elf *elf, struct kmod_modversion return -EINVAL; } - if (symbol[0] == '.') - nlen--; - - slen += nlen + 1; - } - - *array = a = malloc(sizeof(struct kmod_modversion) * count + slen); - if (*array == NULL) - return -errno; - - itr = (char *)(a + count); - off = sec_off; - - for (i = 0; i < count; i++, off += verlen) { - uint64_t crc = elf_get_uint(elf, off, crclen); - const char *symbol = elf_get_mem(elf, off + crclen); - size_t symbollen; - if (symbol[0] == '.') symbol++; a[i].crc = crc; a[i].bind = KMOD_SYMBOL_UNDEF; - a[i].symbol = itr; - symbollen = strlen(symbol) + 1; - memcpy(itr, symbol, symbollen); - itr += symbollen; + a[i].symbol = symbol; } return count;