]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
libkmod: stop copying symbol names in kmod_elf_get_modversions()
authorEmil Velikov <emil.l.velikov@gmail.com>
Wed, 23 Oct 2024 16:19:53 +0000 (17:19 +0100)
committerLucas De Marchi <lucas.de.marchi@gmail.com>
Fri, 15 Nov 2024 16:03:46 +0000 (10:03 -0600)
Since the caller already copies the strings as needed, we can just
point to the elf data directly.

Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-by: Tobias Stoeckmann <tobias@stoeckmann.org>
Link: https://github.com/kmod-project/kmod/pull/210
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
libkmod/libkmod-elf.c

index 26254e7a1da0b67280a6bf8c048bf75b52dc9d27..85c1a95963101eb2e7e0ce9e0bf440f2d00aed34 100644 (file)
@@ -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;