All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] NLM: Remove svcxdr_encode_owner()
@ 2021-09-16 19:03 Chuck Lever
  2021-09-22 15:45 ` J. Bruce Fields
  0 siblings, 1 reply; 3+ messages in thread
From: Chuck Lever @ 2021-09-16 19:03 UTC (permalink / raw)
  To: dai.ngo; +Cc: linux-nfs

Dai Ngo reports that, since the XDR overhaul, the NLM server crashes
when the TEST procedure wants to return NLM_DENIED. There is a bug
in svcxdr_encode_owner() that none of our standard test cases found.

Replace the open-coded function with a call to an appropriate
pre-fabricated XDR helper.

Reported-by: Dai Ngo <Dai.Ngo@oracle.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/lockd/svcxdr.h |   13 ++-----------
 1 file changed, 2 insertions(+), 11 deletions(-)

This might be a little better for the long term. Comments?

diff --git a/fs/lockd/svcxdr.h b/fs/lockd/svcxdr.h
index c69a0bb76c94..805fb19144d7 100644
--- a/fs/lockd/svcxdr.h
+++ b/fs/lockd/svcxdr.h
@@ -134,18 +134,9 @@ svcxdr_decode_owner(struct xdr_stream *xdr, struct xdr_netobj *obj)
 static inline bool
 svcxdr_encode_owner(struct xdr_stream *xdr, const struct xdr_netobj *obj)
 {
-	unsigned int quadlen = XDR_QUADLEN(obj->len);
-	__be32 *p;
-
-	if (xdr_stream_encode_u32(xdr, obj->len) < 0)
-		return false;
-	p = xdr_reserve_space(xdr, obj->len);
-	if (!p)
+	if (unlikely(obj->len > XDR_MAX_NETOBJ))
 		return false;
-	p[quadlen - 1] = 0;	/* XDR pad */
-	memcpy(p, obj->data, obj->len);
-
-	return true;
+	return xdr_stream_encode_opaque(xdr, obj->data, obj->len) > 0;
 }
 
 #endif /* _LOCKD_SVCXDR_H_ */



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] NLM: Remove svcxdr_encode_owner()
  2021-09-16 19:03 [PATCH] NLM: Remove svcxdr_encode_owner() Chuck Lever
@ 2021-09-22 15:45 ` J. Bruce Fields
  2021-09-22 15:47   ` Chuck Lever III
  0 siblings, 1 reply; 3+ messages in thread
From: J. Bruce Fields @ 2021-09-22 15:45 UTC (permalink / raw)
  To: Chuck Lever; +Cc: dai.ngo, linux-nfs

On Thu, Sep 16, 2021 at 03:03:32PM -0400, Chuck Lever wrote:
> Dai Ngo reports that, since the XDR overhaul, the NLM server crashes
> when the TEST procedure wants to return NLM_DENIED. There is a bug
> in svcxdr_encode_owner() that none of our standard test cases found.
> 
> Replace the open-coded function with a call to an appropriate
> pre-fabricated XDR helper.

Makes sense to me.  I assume you're taking this for 5.15.--b.

> 
> Reported-by: Dai Ngo <Dai.Ngo@oracle.com>
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> ---
>  fs/lockd/svcxdr.h |   13 ++-----------
>  1 file changed, 2 insertions(+), 11 deletions(-)
> 
> This might be a little better for the long term. Comments?
> 
> diff --git a/fs/lockd/svcxdr.h b/fs/lockd/svcxdr.h
> index c69a0bb76c94..805fb19144d7 100644
> --- a/fs/lockd/svcxdr.h
> +++ b/fs/lockd/svcxdr.h
> @@ -134,18 +134,9 @@ svcxdr_decode_owner(struct xdr_stream *xdr, struct xdr_netobj *obj)
>  static inline bool
>  svcxdr_encode_owner(struct xdr_stream *xdr, const struct xdr_netobj *obj)
>  {
> -	unsigned int quadlen = XDR_QUADLEN(obj->len);
> -	__be32 *p;
> -
> -	if (xdr_stream_encode_u32(xdr, obj->len) < 0)
> -		return false;
> -	p = xdr_reserve_space(xdr, obj->len);
> -	if (!p)
> +	if (unlikely(obj->len > XDR_MAX_NETOBJ))
>  		return false;
> -	p[quadlen - 1] = 0;	/* XDR pad */
> -	memcpy(p, obj->data, obj->len);
> -
> -	return true;
> +	return xdr_stream_encode_opaque(xdr, obj->data, obj->len) > 0;
>  }
>  
>  #endif /* _LOCKD_SVCXDR_H_ */
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] NLM: Remove svcxdr_encode_owner()
  2021-09-22 15:45 ` J. Bruce Fields
@ 2021-09-22 15:47   ` Chuck Lever III
  0 siblings, 0 replies; 3+ messages in thread
From: Chuck Lever III @ 2021-09-22 15:47 UTC (permalink / raw)
  To: Bruce Fields; +Cc: Dai Ngo, Linux NFS Mailing List



> On Sep 22, 2021, at 11:45 AM, J. Bruce Fields <bfields@fieldses.org> wrote:
> 
> On Thu, Sep 16, 2021 at 03:03:32PM -0400, Chuck Lever wrote:
>> Dai Ngo reports that, since the XDR overhaul, the NLM server crashes
>> when the TEST procedure wants to return NLM_DENIED. There is a bug
>> in svcxdr_encode_owner() that none of our standard test cases found.
>> 
>> Replace the open-coded function with a call to an appropriate
>> pre-fabricated XDR helper.
> 
> Makes sense to me.  I assume you're taking this for 5.15.--b.

Yes. I'm just finishing up testing for the next -rc PR.


>> Reported-by: Dai Ngo <Dai.Ngo@oracle.com>
>> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
>> ---
>> fs/lockd/svcxdr.h |   13 ++-----------
>> 1 file changed, 2 insertions(+), 11 deletions(-)
>> 
>> This might be a little better for the long term. Comments?
>> 
>> diff --git a/fs/lockd/svcxdr.h b/fs/lockd/svcxdr.h
>> index c69a0bb76c94..805fb19144d7 100644
>> --- a/fs/lockd/svcxdr.h
>> +++ b/fs/lockd/svcxdr.h
>> @@ -134,18 +134,9 @@ svcxdr_decode_owner(struct xdr_stream *xdr, struct xdr_netobj *obj)
>> static inline bool
>> svcxdr_encode_owner(struct xdr_stream *xdr, const struct xdr_netobj *obj)
>> {
>> -	unsigned int quadlen = XDR_QUADLEN(obj->len);
>> -	__be32 *p;
>> -
>> -	if (xdr_stream_encode_u32(xdr, obj->len) < 0)
>> -		return false;
>> -	p = xdr_reserve_space(xdr, obj->len);
>> -	if (!p)
>> +	if (unlikely(obj->len > XDR_MAX_NETOBJ))
>> 		return false;
>> -	p[quadlen - 1] = 0;	/* XDR pad */
>> -	memcpy(p, obj->data, obj->len);
>> -
>> -	return true;
>> +	return xdr_stream_encode_opaque(xdr, obj->data, obj->len) > 0;
>> }
>> 
>> #endif /* _LOCKD_SVCXDR_H_ */
>> 

--
Chuck Lever




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-09-22 15:47 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-16 19:03 [PATCH] NLM: Remove svcxdr_encode_owner() Chuck Lever
2021-09-22 15:45 ` J. Bruce Fields
2021-09-22 15:47   ` Chuck Lever III

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.