Skip to content

Commit

Permalink
livepatch: make object/func-walking helpers more robust
Browse files Browse the repository at this point in the history
Current object-walking helper checks the presence of obj->funcs to
determine the end of objs array in klp_object structure. This is
somewhat fragile because one can easily forget about funcs definition
during livepatch creation. In such a case the livepatch module is
successfully loaded and all objects after the incorrect one are omitted.
This is very confusing. Let's make the helper more robust and check also
for the other external member, name. Thus the helper correctly stops on
an empty item of the array. We need to have a check for obj->funcs in
klp_init_object() to make it work.

The same applies to a func-walking helper.

As a benefit we'll check for new_func member definition during the
livepatch initialization. There is no such check anywhere in the code
now.

[[email protected]: fix shortlog]
Signed-off-by: Miroslav Benes <[email protected]>
Acked-by: Josh Poimboeuf <[email protected]>
Acked-by: Jessica Yu <[email protected]>
Signed-off-by: Jiri Kosina <[email protected]>
  • Loading branch information
mirab authored and Jiri Kosina committed Apr 29, 2016
1 parent 0f49fc9 commit f09d908
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 2 deletions.
6 changes: 4 additions & 2 deletions include/linux/livepatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,10 +124,12 @@ struct klp_patch {
};

#define klp_for_each_object(patch, obj) \
for (obj = patch->objs; obj->funcs; obj++)
for (obj = patch->objs; obj->funcs || obj->name; obj++)

#define klp_for_each_func(obj, func) \
for (func = obj->funcs; func->old_name; func++)
for (func = obj->funcs; \
func->old_name || func->new_func || func->old_sympos; \
func++)

int klp_register_patch(struct klp_patch *);
int klp_unregister_patch(struct klp_patch *);
Expand Down
3 changes: 3 additions & 0 deletions kernel/livepatch/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,9 @@ static void klp_free_patch(struct klp_patch *patch)

static int klp_init_func(struct klp_object *obj, struct klp_func *func)
{
if (!func->old_name || !func->new_func)
return -EINVAL;

INIT_LIST_HEAD(&func->stack_node);
func->state = KLP_DISABLED;

Expand Down

0 comments on commit f09d908

Please sign in to comment.