Rework the function signature and return the error code instead of the
stripped module. Thus we no longer explicitly set errno.
Reference: https://github.com/kmod-project/kmod/issues/244
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Link: https://github.com/kmod-project/kmod/pull/346
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
return -ENODATA;
}
-const void *kmod_elf_strip(const struct kmod_elf *elf, unsigned int flags)
+int kmod_elf_strip(const struct kmod_elf *elf, unsigned int flags, const void **stripped)
{
uint8_t *changed;
int err = 0;
changed = memdup(elf->memory, elf->size);
if (changed == NULL)
- return NULL;
+ return -errno;
ELFDBG(elf, "copied memory to allow writing.\n");
if (flags & KMOD_INSERT_FORCE_MODVERSION) {
err = elf_strip_versions_section(elf, changed);
- if (err < 0) {
- errno = -err;
+ if (err < 0)
goto fail;
- }
}
if (flags & KMOD_INSERT_FORCE_VERMAGIC) {
err = elf_strip_vermagic(elf, changed);
- if (err < 0) {
- errno = -err;
+ if (err < 0)
goto fail;
- }
}
- return changed;
+ *stripped = changed;
+ return 0;
fail:
free(changed);
- return NULL;
+ return err;
}
static int kmod_elf_get_symbols_symtab(const struct kmod_elf *elf,
_must_check_ _nonnull_all_ int kmod_elf_get_modversions(const struct kmod_elf *elf, struct kmod_modversion **array);
_must_check_ _nonnull_all_ int kmod_elf_get_symbols(const struct kmod_elf *elf, struct kmod_modversion **array);
_must_check_ _nonnull_all_ int kmod_elf_get_dependency_symbols(const struct kmod_elf *elf, struct kmod_modversion **array);
-_must_check_ _nonnull_all_ const void *kmod_elf_strip(const struct kmod_elf *elf, unsigned int flags);
+_must_check_ _nonnull_all_ int kmod_elf_strip(const struct kmod_elf *elf, unsigned int flags, const void **stripped);
/*
* Debug mock lib need to find section ".gnu.linkonce.this_module" in order to
return err;
}
- stripped = kmod_elf_strip(elf, flags);
- if (stripped == NULL) {
- ERR(mod->ctx, "Failed to strip version information: %m\n");
- return -errno;
+ err = kmod_elf_strip(elf, flags, &stripped);
+ if (err) {
+ ERR(mod->ctx, "Failed to strip version information: %s\n",
+ strerror(-err));
+ return err;
}
mem = stripped;
} else {