* [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.