diff options
Diffstat (limited to 'kernel/livepatch/transition.c')
| -rw-r--r-- | kernel/livepatch/transition.c | 54 | 
1 files changed, 27 insertions, 27 deletions
| diff --git a/kernel/livepatch/transition.c b/kernel/livepatch/transition.c index 30187b1d8275..f1b25ec581e0 100644 --- a/kernel/livepatch/transition.c +++ b/kernel/livepatch/transition.c @@ -196,36 +196,36 @@ static int klp_check_stack_func(struct klp_func *func, unsigned long *entries,  	struct klp_ops *ops;  	int i; -	for (i = 0; i < nr_entries; i++) { -		address = entries[i]; +	if (klp_target_state == KLP_UNPATCHED) { +		 /* +		  * Check for the to-be-unpatched function +		  * (the func itself). +		  */ +		func_addr = (unsigned long)func->new_func; +		func_size = func->new_size; +	} else { +		/* +		 * Check for the to-be-patched function +		 * (the previous func). +		 */ +		ops = klp_find_ops(func->old_func); -		if (klp_target_state == KLP_UNPATCHED) { -			 /* -			  * Check for the to-be-unpatched function -			  * (the func itself). -			  */ -			func_addr = (unsigned long)func->new_func; -			func_size = func->new_size; +		if (list_is_singular(&ops->func_stack)) { +			/* original function */ +			func_addr = (unsigned long)func->old_func; +			func_size = func->old_size;  		} else { -			/* -			 * Check for the to-be-patched function -			 * (the previous func). -			 */ -			ops = klp_find_ops(func->old_func); - -			if (list_is_singular(&ops->func_stack)) { -				/* original function */ -				func_addr = (unsigned long)func->old_func; -				func_size = func->old_size; -			} else { -				/* previously patched function */ -				struct klp_func *prev; - -				prev = list_next_entry(func, stack_node); -				func_addr = (unsigned long)prev->new_func; -				func_size = prev->new_size; -			} +			/* previously patched function */ +			struct klp_func *prev; + +			prev = list_next_entry(func, stack_node); +			func_addr = (unsigned long)prev->new_func; +			func_size = prev->new_size;  		} +	} + +	for (i = 0; i < nr_entries; i++) { +		address = entries[i];  		if (address >= func_addr && address < func_addr + func_size)  			return -EAGAIN; |