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>
}
}
-struct kmod_elf *kmod_elf_new(const void *memory, off_t size)
+int kmod_elf_new(const void *memory, off_t size, struct kmod_elf **out_elf)
{
struct kmod_elf *elf;
size_t shdrs_size, shdr_size;
assert_cc(sizeof(uint32_t) == sizeof(Elf64_Word));
elf = malloc(sizeof(struct kmod_elf));
- if (elf == NULL) {
- return NULL;
- }
+ if (elf == NULL)
+ return -ENOMEM;
err = elf_identify(elf, memory, size);
if (err < 0) {
free(elf);
- errno = -err;
- return NULL;
+ return err;
}
elf->memory = memory;
}
kmod_elf_save_sections(elf);
- return elf;
+ *out_elf = elf;
+ return 0;
invalid:
free(elf);
- errno = EINVAL;
- return NULL;
+ return -EINVAL;
}
void kmod_elf_unref(struct kmod_elf *elf)
return NULL;
}
- file->elf = kmod_elf_new(file->memory, file->size);
+ err = kmod_elf_new(file->memory, file->size, &file->elf);
+ if (err) {
+ errno = -err;
+ return NULL;
+ }
return file->elf;
}
const char *symbol;
};
-_nonnull_all_ struct kmod_elf *kmod_elf_new(const void *memory, off_t size);
+_must_check_ _nonnull_all_ int kmod_elf_new(const void *memory, off_t size, struct kmod_elf **elf);
_nonnull_all_ void kmod_elf_unref(struct kmod_elf *elf);
_must_check_ _nonnull_all_ const void *kmod_elf_get_memory(const struct kmod_elf *elf);
_must_check_ _nonnull_all_ int kmod_elf_get_modinfo_strings(const struct kmod_elf *elf, char ***array);
return -1;
}
- elf = kmod_elf_new(mem, len);
- if (elf == NULL)
+ err = kmod_elf_new(mem, len, &elf);
+ if (err < 0) {
+ errno = -err;
return -1;
+ }
err = kmod_elf_get_section(elf, ".gnu.linkonce.this_module", &off, &bufsize);
buf = (const char *)kmod_elf_get_memory(elf) + off;