Merge pull request #828 from rppt/callbacks-fix

livepatch-patch-hook: make callbacks addition depend on the kernel ve…
This commit is contained in:
Joe Lawrence 2018-04-17 10:16:02 -04:00 committed by GitHub
commit e7834dcdff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -53,6 +53,14 @@
#define HAVE_IMMEDIATE
#endif
#ifdef RHEL_RELEASE_CODE
# if RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)
# define HAVE_CALLBACKS
# endif
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
# define HAVE_CALLBACKS
#endif
/*
* There are quite a few similar structures at play in this file:
* - livepatch.h structs prefixed with klp_*
@ -79,7 +87,9 @@ struct patch_object {
struct list_head list;
struct list_head funcs;
struct list_head relocs;
#ifdef HAVE_CALLBACKS
struct klp_callbacks callbacks;
#endif
const char *name;
int funcs_nr, relocs_nr;
};
@ -216,6 +226,7 @@ extern struct kpatch_post_patch_callback __kpatch_callbacks_post_patch[], __kpat
extern struct kpatch_pre_unpatch_callback __kpatch_callbacks_pre_unpatch[], __kpatch_callbacks_pre_unpatch_end[];
extern struct kpatch_post_unpatch_callback __kpatch_callbacks_post_unpatch[], __kpatch_callbacks_post_unpatch_end[];
#ifdef HAVE_CALLBACKS
static int add_callbacks_to_patch_objects(void)
{
struct kpatch_pre_patch_callback *p_pre_patch_callback;
@ -286,6 +297,24 @@ static int add_callbacks_to_patch_objects(void)
return 0;
}
#else /* HAVE_CALLBACKS */
static inline int add_callbacks_to_patch_objects(void)
{
if (__kpatch_callbacks_pre_patch !=
__kpatch_callbacks_pre_patch_end ||
__kpatch_callbacks_post_patch !=
__kpatch_callbacks_post_patch_end ||
__kpatch_callbacks_pre_unpatch !=
__kpatch_callbacks_pre_unpatch_end ||
__kpatch_callbacks_post_unpatch !=
__kpatch_callbacks_post_unpatch_end) {
pr_err("patch callbacks are not supported\n");
return -EINVAL;
}
return 0;
}
#endif /* HAVE_CALLBACKS */
extern struct kpatch_patch_func __kpatch_funcs[], __kpatch_funcs_end[];
#ifndef HAVE_ELF_RELOCS
@ -392,7 +421,9 @@ static int __init patch_init(void)
}
#endif /* HAVE_ELF_RELOCS */
#ifdef HAVE_CALLBACKS
lobject->callbacks = object->callbacks;
#endif
i++;
}