diff mbox series

arm64: ptrace: user_regset_copyin_ignore() always returns 0

Message ID 4c678cd1-7e75-5c73-0de8-2ffaa3a96e0e@omp.ru (mailing list archive)
State New, archived
Headers show
Series arm64: ptrace: user_regset_copyin_ignore() always returns 0 | expand

Commit Message

Sergey Shtylyov Sept. 20, 2022, 8:54 p.m. UTC
user_regset_copyin_ignore() always return 0, so checking its result seems
pointless -- don't do this...

Found by Linux Verification Center (linuxtesting.org) with the SVACE static
analysis tool.

Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>

---
This patch is against the 'for-next/core' branch of the ARM64 repo...

 arch/arm64/kernel/ptrace.c |   16 ++++------------
 1 file changed, 4 insertions(+), 12 deletions(-)

Comments

Sergey Shtylyov Sept. 21, 2022, 8:56 a.m. UTC | #1
On 9/20/22 11:54 PM, Sergey Shtylyov wrote:

> user_regset_copyin_ignore() always return 0, so checking its result seems

   Oops, should've been "returns"...

> pointless -- don't do this...
> 
> Found by Linux Verification Center (linuxtesting.org) with the SVACE static
> analysis tool.
> 
> Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
[...]

MBR, Sergey
Will Deacon Sept. 22, 2022, 11:59 a.m. UTC | #2
On Tue, Sep 20, 2022 at 11:54:55PM +0300, Sergey Shtylyov wrote:
> user_regset_copyin_ignore() always return 0, so checking its result seems
> pointless -- don't do this...
> 
> Found by Linux Verification Center (linuxtesting.org) with the SVACE static
> analysis tool.
> 
> Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
> 
> ---
> This patch is against the 'for-next/core' branch of the ARM64 repo...
> 
>  arch/arm64/kernel/ptrace.c |   16 ++++------------
>  1 file changed, 4 insertions(+), 12 deletions(-)
> 
> Index: linux/arch/arm64/kernel/ptrace.c
> ===================================================================
> --- linux.orig/arch/arm64/kernel/ptrace.c
> +++ linux/arch/arm64/kernel/ptrace.c
> @@ -514,9 +514,7 @@ static int hw_break_set(struct task_stru
>  
>  	/* Resource info and pad */
>  	offset = offsetof(struct user_hwdebug_state, dbg_regs);
> -	ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
> -	if (ret)
> -		return ret;
> +	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
>  
>  	/* (address, ctrl) registers */
>  	limit = regset->n * regset->size;
> @@ -543,11 +541,8 @@ static int hw_break_set(struct task_stru
>  			return ret;
>  		offset += PTRACE_HBP_CTRL_SZ;
>  
> -		ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
> -						offset,
> -						offset + PTRACE_HBP_PAD_SZ);
> -		if (ret)
> -			return ret;
> +		user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
> +					  offset, offset + PTRACE_HBP_PAD_SZ);
>  		offset += PTRACE_HBP_PAD_SZ;
>  		idx++;
>  	}
> @@ -939,10 +934,7 @@ static int sve_set_common(struct task_st
>  
>  	start = end;
>  	end = SVE_PT_SVE_FPSR_OFFSET(vq);
> -	ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
> -					start, end);
> -	if (ret)
> -		goto out;
> +	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, start, end);

I think it would be better to have user_regset_copyin_ignore() return void
so that we don't run the risk of missing an error code if it starts
returning one in future.

Will
Sergey Shtylyov Sept. 22, 2022, 5:37 p.m. UTC | #3
On 9/22/22 2:59 PM, Will Deacon wrote:
[...]
>> user_regset_copyin_ignore() always return 0, so checking its result seems
>> pointless -- don't do this...
>>
>> Found by Linux Verification Center (linuxtesting.org) with the SVACE static
>> analysis tool.
>>
>> Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
>>
>> ---
>> This patch is against the 'for-next/core' branch of the ARM64 repo...
>>
>>  arch/arm64/kernel/ptrace.c |   16 ++++------------
>>  1 file changed, 4 insertions(+), 12 deletions(-)
>>
>> Index: linux/arch/arm64/kernel/ptrace.c
>> ===================================================================
>> --- linux.orig/arch/arm64/kernel/ptrace.c
>> +++ linux/arch/arm64/kernel/ptrace.c
>> @@ -514,9 +514,7 @@ static int hw_break_set(struct task_stru
>>  
>>  	/* Resource info and pad */
>>  	offset = offsetof(struct user_hwdebug_state, dbg_regs);
>> -	ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
>> -	if (ret)
>> -		return ret;
>> +	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
>>  
>>  	/* (address, ctrl) registers */
>>  	limit = regset->n * regset->size;
>> @@ -543,11 +541,8 @@ static int hw_break_set(struct task_stru
>>  			return ret;
>>  		offset += PTRACE_HBP_CTRL_SZ;
>>  
>> -		ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
>> -						offset,
>> -						offset + PTRACE_HBP_PAD_SZ);
>> -		if (ret)
>> -			return ret;
>> +		user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
>> +					  offset, offset + PTRACE_HBP_PAD_SZ);
>>  		offset += PTRACE_HBP_PAD_SZ;
>>  		idx++;
>>  	}
>> @@ -939,10 +934,7 @@ static int sve_set_common(struct task_st
>>  
>>  	start = end;
>>  	end = SVE_PT_SVE_FPSR_OFFSET(vq);
>> -	ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
>> -					start, end);
>> -	if (ret)
>> -		goto out;
>> +	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, start, end);
> 
> I think it would be better to have user_regset_copyin_ignore() return void
> so that we don't run the risk of missing an error code if it starts
> returning one in future.

   That's the plan! But I need to convert the users 1st, right?

> Will

MBR, Sergey
Catalin Marinas Sept. 26, 2022, 2:01 p.m. UTC | #4
On Thu, Sep 22, 2022 at 08:37:57PM +0300, Sergey Shtylyov wrote:
> On 9/22/22 2:59 PM, Will Deacon wrote:
> [...]
> >> user_regset_copyin_ignore() always return 0, so checking its result seems
> >> pointless -- don't do this...
> >>
> >> Found by Linux Verification Center (linuxtesting.org) with the SVACE static
> >> analysis tool.
> >>
> >> Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
> >>
> >> ---
> >> This patch is against the 'for-next/core' branch of the ARM64 repo...
> >>
> >>  arch/arm64/kernel/ptrace.c |   16 ++++------------
> >>  1 file changed, 4 insertions(+), 12 deletions(-)
> >>
> >> Index: linux/arch/arm64/kernel/ptrace.c
> >> ===================================================================
> >> --- linux.orig/arch/arm64/kernel/ptrace.c
> >> +++ linux/arch/arm64/kernel/ptrace.c
> >> @@ -514,9 +514,7 @@ static int hw_break_set(struct task_stru
> >>  
> >>  	/* Resource info and pad */
> >>  	offset = offsetof(struct user_hwdebug_state, dbg_regs);
> >> -	ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
> >> -	if (ret)
> >> -		return ret;
> >> +	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
> >>  
> >>  	/* (address, ctrl) registers */
> >>  	limit = regset->n * regset->size;
> >> @@ -543,11 +541,8 @@ static int hw_break_set(struct task_stru
> >>  			return ret;
> >>  		offset += PTRACE_HBP_CTRL_SZ;
> >>  
> >> -		ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
> >> -						offset,
> >> -						offset + PTRACE_HBP_PAD_SZ);
> >> -		if (ret)
> >> -			return ret;
> >> +		user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
> >> +					  offset, offset + PTRACE_HBP_PAD_SZ);
> >>  		offset += PTRACE_HBP_PAD_SZ;
> >>  		idx++;
> >>  	}
> >> @@ -939,10 +934,7 @@ static int sve_set_common(struct task_st
> >>  
> >>  	start = end;
> >>  	end = SVE_PT_SVE_FPSR_OFFSET(vq);
> >> -	ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
> >> -					start, end);
> >> -	if (ret)
> >> -		goto out;
> >> +	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, start, end);
> > 
> > I think it would be better to have user_regset_copyin_ignore() return void
> > so that we don't run the risk of missing an error code if it starts
> > returning one in future.
> 
>    That's the plan! But I need to convert the users 1st, right?

Right, though normally we'd like to see the full series that does the
arch clean-up followed by the user_regset_copyin_ignore() return changed
to void. If for some reason the last patch is rejected by the maintainer
because there are plans to actually return some non-zero value, we'd
have to revert the above.
Sergey Shtylyov Sept. 27, 2022, 6:46 p.m. UTC | #5
Hello!

On 9/26/22 5:01 PM, Catalin Marinas wrote:

[...]
>>>> user_regset_copyin_ignore() always return 0, so checking its result seems
>>>> pointless -- don't do this...
>>>>
>>>> Found by Linux Verification Center (linuxtesting.org) with the SVACE static
>>>> analysis tool.
>>>>
>>>> Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
>>>>
>>>> ---
>>>> This patch is against the 'for-next/core' branch of the ARM64 repo...
>>>>
>>>>  arch/arm64/kernel/ptrace.c |   16 ++++------------
>>>>  1 file changed, 4 insertions(+), 12 deletions(-)
>>>>
>>>> Index: linux/arch/arm64/kernel/ptrace.c
>>>> ===================================================================
>>>> --- linux.orig/arch/arm64/kernel/ptrace.c
>>>> +++ linux/arch/arm64/kernel/ptrace.c
>>>> @@ -514,9 +514,7 @@ static int hw_break_set(struct task_stru
>>>>  
>>>>  	/* Resource info and pad */
>>>>  	offset = offsetof(struct user_hwdebug_state, dbg_regs);
>>>> -	ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
>>>> -	if (ret)
>>>> -		return ret;
>>>> +	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
>>>>  
>>>>  	/* (address, ctrl) registers */
>>>>  	limit = regset->n * regset->size;
>>>> @@ -543,11 +541,8 @@ static int hw_break_set(struct task_stru
>>>>  			return ret;
>>>>  		offset += PTRACE_HBP_CTRL_SZ;
>>>>  
>>>> -		ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
>>>> -						offset,
>>>> -						offset + PTRACE_HBP_PAD_SZ);
>>>> -		if (ret)
>>>> -			return ret;
>>>> +		user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
>>>> +					  offset, offset + PTRACE_HBP_PAD_SZ);
>>>>  		offset += PTRACE_HBP_PAD_SZ;
>>>>  		idx++;
>>>>  	}
>>>> @@ -939,10 +934,7 @@ static int sve_set_common(struct task_st
>>>>  
>>>>  	start = end;
>>>>  	end = SVE_PT_SVE_FPSR_OFFSET(vq);
>>>> -	ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
>>>> -					start, end);
>>>> -	if (ret)
>>>> -		goto out;
>>>> +	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, start, end);
>>>
>>> I think it would be better to have user_regset_copyin_ignore() return void
>>> so that we don't run the risk of missing an error code if it starts
>>> returning one in future.
>>
>>    That's the plan! But I need to convert the users 1st, right?
> 
> Right, though normally we'd like to see the full series that does the
> arch clean-up followed by the user_regset_copyin_ignore() return changed
> to void. If for some reason the last patch is rejected by the maintainer
> because there are plans to actually return some non-zero value, we'd
> have to revert the above.

   Hm... I usually try to avoid a cross-tree patch series but here I should
be able to use the linux-next repo as I series' base. Is that OK?

MBR, Sergey
Catalin Marinas Sept. 29, 2022, 5:11 p.m. UTC | #6
On Tue, Sep 27, 2022 at 09:46:11PM +0300, Sergey Shtylyov wrote:
> On 9/26/22 5:01 PM, Catalin Marinas wrote:
> >>>> user_regset_copyin_ignore() always return 0, so checking its result seems
> >>>> pointless -- don't do this...
[...]
> >>> I think it would be better to have user_regset_copyin_ignore() return void
> >>> so that we don't run the risk of missing an error code if it starts
> >>> returning one in future.
> >>
> >>    That's the plan! But I need to convert the users 1st, right?
> > 
> > Right, though normally we'd like to see the full series that does the
> > arch clean-up followed by the user_regset_copyin_ignore() return changed
> > to void. If for some reason the last patch is rejected by the maintainer
> > because there are plans to actually return some non-zero value, we'd
> > have to revert the above.
> 
>    Hm... I usually try to avoid a cross-tree patch series but here I should
> be able to use the linux-next repo as I series' base. Is that OK?

It depends on how you plan to merge it, though basing the series off
linux-next is not ideal. It's fine to merge individual patches in one
release though specific trees and the final patch in another but when
you posted this single patch we didn't have the context. So ideally I'd
like to see an ack on the patch converting user_regset_copyin_ignore()
to void. It wasn't obvious there's such patch.

You can also have a cross-tree series and convince one of the maintainer
to pick it up (usually cc'ing akpm does the trick ;)).
diff mbox series

Patch

Index: linux/arch/arm64/kernel/ptrace.c
===================================================================
--- linux.orig/arch/arm64/kernel/ptrace.c
+++ linux/arch/arm64/kernel/ptrace.c
@@ -514,9 +514,7 @@  static int hw_break_set(struct task_stru
 
 	/* Resource info and pad */
 	offset = offsetof(struct user_hwdebug_state, dbg_regs);
-	ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
-	if (ret)
-		return ret;
+	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, 0, offset);
 
 	/* (address, ctrl) registers */
 	limit = regset->n * regset->size;
@@ -543,11 +541,8 @@  static int hw_break_set(struct task_stru
 			return ret;
 		offset += PTRACE_HBP_CTRL_SZ;
 
-		ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
-						offset,
-						offset + PTRACE_HBP_PAD_SZ);
-		if (ret)
-			return ret;
+		user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
+					  offset, offset + PTRACE_HBP_PAD_SZ);
 		offset += PTRACE_HBP_PAD_SZ;
 		idx++;
 	}
@@ -939,10 +934,7 @@  static int sve_set_common(struct task_st
 
 	start = end;
 	end = SVE_PT_SVE_FPSR_OFFSET(vq);
-	ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
-					start, end);
-	if (ret)
-		goto out;
+	user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, start, end);
 
 	/*
 	 * Copy fpsr, and fpcr which must follow contiguously in