Merge pull request #360 from flaming-toast/func-sysfs-fix

kpatch-patch-hook: fix incorrect old_offsets for loadable modules
This commit is contained in:
Seth Jennings 2014-08-15 21:33:45 -05:00
commit 7b82b59a68
5 changed files with 17 additions and 17 deletions

View File

@ -711,16 +711,15 @@ static int kpatch_link_object(struct kpatch_module *kpmod,
goto err_unlink;
list_for_each_entry(func, &object->funcs, list) {
unsigned long old_addr;
/* calculate actual old location */
if (vmlinux) {
old_addr = func->old_offset;
ret = kpatch_verify_symbol_match(func->name,
old_addr);
func->old_addr);
if (ret)
goto err_unlink;
} else {
unsigned long old_addr;
old_addr = kpatch_find_module_symbol(mod, func->name);
if (!old_addr) {
pr_err("unable to find symbol '%s' in module '%s\n",
@ -728,14 +727,14 @@ static int kpatch_link_object(struct kpatch_module *kpmod,
ret = -EINVAL;
goto err_unlink;
}
func->old_addr = old_addr;
}
/* add to ftrace filter and register handler if needed */
ret = kpatch_ftrace_add_func(old_addr);
ret = kpatch_ftrace_add_func(func->old_addr);
if (ret)
goto err_unlink;
func->old_addr = old_addr;
}
return 0;

View File

@ -36,7 +36,7 @@ struct kpatch_func {
/* public */
unsigned long new_addr;
unsigned long new_size;
unsigned long old_offset;
unsigned long old_addr;
unsigned long old_size;
const char *name;
struct list_head list;
@ -44,7 +44,6 @@ struct kpatch_func {
/* private */
struct hlist_node node;
unsigned long old_addr;
enum kpatch_op op;
};

View File

@ -42,8 +42,7 @@ static struct kobject *functions_kobj;
struct kpatch_func_obj {
struct kobject kobj;
struct kpatch_patch_func *func;
char name[KSYM_NAME_LEN];
struct kpatch_func *func;
};
static struct kpatch_func_obj **func_objs = NULL;
@ -91,7 +90,7 @@ static ssize_t func_old_addr_show(struct kobject *kobj,
struct kpatch_func_obj *func =
container_of(kobj, struct kpatch_func_obj, kobj);
return sprintf(buf, "0x%lx\n", func->func->old_offset);
return sprintf(buf, "0x%lx\n", func->func->old_addr);
}
static ssize_t func_new_addr_show(struct kobject *kobj,
@ -257,7 +256,12 @@ static int patch_make_funcs_list(struct list_head *objects)
func->new_addr = p_func->new_addr;
func->new_size = p_func->new_size;
func->old_offset = p_func->old_offset;
if (!strcmp("vmlinux", object->name))
func->old_addr = p_func->old_addr;
else
func->old_addr = 0x0;
func->old_size = p_func->old_size;
func->name = p_func->name;
func->force = is_func_forced(func->new_addr);
@ -267,13 +271,11 @@ static int patch_make_funcs_list(struct list_head *objects)
if (!func_obj)
return -ENOMEM;
func_obj->func = p_func;
func_obj->func = func;
func_objs[i++] = func_obj;
sprint_symbol_no_offset(func_obj->name,
p_func->old_offset);
ret = kobject_add(&func_obj->kobj, functions_kobj,
"%s", func_obj->name);
"%s", func->name);
if (ret)
return ret;
}

View File

@ -25,7 +25,7 @@
struct kpatch_patch_func {
unsigned long new_addr;
unsigned long new_size;
unsigned long old_offset;
unsigned long old_addr;
unsigned long old_size;
char *name;
char *objname;

View File

@ -1992,7 +1992,7 @@ void kpatch_create_patches_sections(struct kpatch_elf *kelf,
sym->name, result.value, result.size);
/* add entry in text section */
funcs[index].old_offset = result.value;
funcs[index].old_addr = result.value;
funcs[index].old_size = result.size;
funcs[index].new_size = sym->sym.st_size;