]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
libkmod: stop copying symbol names in kmod_elf_get_dependency_symbols()
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 3411e3f8774fb365db1ca035e11d6f4098b44659..7c2891f1fa0304d88940f9735b5108d9257634ac 100644 (file)
@@ -912,8 +912,7 @@ int kmod_elf_get_dependency_symbols(const struct kmod_elf *elf,
        uint64_t versionslen, strtablen, symtablen, str_off, sym_off, ver_off;
        uint64_t str_sec_off, sym_sec_off;
        struct kmod_modversion *a;
-       char *itr;
-       size_t namlen, slen, verlen, symlen, crclen;
+       size_t namlen, verlen, symlen, crclen;
        int i, count, symcount, vercount, err;
        bool handle_register_symbols;
        uint8_t *visited_versions;
@@ -977,7 +976,6 @@ int kmod_elf_get_dependency_symbols(const struct kmod_elf *elf,
 
        symcount = symtablen / symlen;
        count = 0;
-       slen = 0;
        str_off = str_sec_off;
        sym_off = sym_sec_off + symlen;
 
@@ -1047,7 +1045,6 @@ int kmod_elf_get_dependency_symbols(const struct kmod_elf *elf,
                        continue;
                }
 
-               slen += strlen(name) + 1;
                count++;
 
                idx = kmod_elf_crc_find(elf, ver_off, versionslen, name, &crc);
@@ -1073,7 +1070,6 @@ int kmod_elf_get_dependency_symbols(const struct kmod_elf *elf,
                                        free(symcrcs);
                                        return -EINVAL;
                                }
-                               slen += nlen + 1;
 
                                count++;
                        }
@@ -1087,14 +1083,13 @@ int kmod_elf_get_dependency_symbols(const struct kmod_elf *elf,
                return 0;
        }
 
-       *array = a = malloc(sizeof(struct kmod_modversion) * count + slen);
+       *array = a = malloc(sizeof(struct kmod_modversion) * count);
        if (*array == NULL) {
                free(visited_versions);
                free(symcrcs);
                return -errno;
        }
 
-       itr = (char *)(a + count);
        count = 0;
        str_off = str_sec_off;
        sym_off = sym_sec_off + symlen;
@@ -1155,15 +1150,11 @@ int kmod_elf_get_dependency_symbols(const struct kmod_elf *elf,
                else
                        bind = KMOD_SYMBOL_UNDEF;
 
-               slen = strlen(name);
                crc = symcrcs[i];
 
                a[count].crc = crc;
                a[count].bind = bind;
-               a[count].symbol = itr;
-               memcpy(itr, name, slen);
-               itr[slen] = '\0';
-               itr += slen + 1;
+               a[count].symbol = name;
 
                count++;
        }
@@ -1182,15 +1173,11 @@ int kmod_elf_get_dependency_symbols(const struct kmod_elf *elf,
                        continue;
 
                name = elf_get_mem(elf, ver_off + i * verlen + crclen);
-               slen = strlen(name);
                crc = elf_get_uint(elf, ver_off + i * verlen, crclen);
 
                a[count].crc = crc;
                a[count].bind = KMOD_SYMBOL_UNDEF;
-               a[count].symbol = itr;
-               memcpy(itr, name, slen);
-               itr[slen] = '\0';
-               itr += slen + 1;
+               a[count].symbol = name;
 
                count++;
        }