2020-10-12 02:17:02

by Artur Molchanov

[permalink] [raw]
Subject: [PATCH v2] net/sunrpc: Fix return value for sysctl sunrpc.transports

Fix returning value for sysctl sunrpc.transports.
Return error code from sysctl proc_handler function proc_do_xprt instead of number of the written bytes.
Otherwise sysctl returns random garbage for this key.

Since v1:
- Handle negative returned value from memory_read_from_buffer as an error


Signed-off-by: Artur Molchanov <[email protected]>
Cc: [email protected]
---
net/sunrpc/sysctl.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c
index 999eee1ed61c..e81a28f30f1d 100644
--- a/net/sunrpc/sysctl.c
+++ b/net/sunrpc/sysctl.c
@@ -70,7 +70,13 @@ static int proc_do_xprt(struct ctl_table *table, int write,
return 0;
}
len = svc_print_xprts(tmpbuf, sizeof(tmpbuf));
- return memory_read_from_buffer(buffer, *lenp, ppos, tmpbuf, len);
+ *lenp = memory_read_from_buffer(buffer, *lenp, ppos, tmpbuf, len);
+
+ if (*lenp < 0) {
+ *lenp = 0;
+ return -EINVAL;
+ }
+ return 0;
}

static int
--
2.20.1


2020-10-12 14:20:03

by J. Bruce Fields

[permalink] [raw]
Subject: Re: [PATCH v2] net/sunrpc: Fix return value for sysctl sunrpc.transports

On Mon, Oct 12, 2020 at 01:00:45AM +0300, Artur Molchanov wrote:
> Fix returning value for sysctl sunrpc.transports.
> Return error code from sysctl proc_handler function proc_do_xprt instead of number of the written bytes.
> Otherwise sysctl returns random garbage for this key.
>
> Since v1:
> - Handle negative returned value from memory_read_from_buffer as an error

Thanks, applying for 5.10.--b.

>
>
> Signed-off-by: Artur Molchanov <[email protected]>
> Cc: [email protected]
> ---
> net/sunrpc/sysctl.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c
> index 999eee1ed61c..e81a28f30f1d 100644
> --- a/net/sunrpc/sysctl.c
> +++ b/net/sunrpc/sysctl.c
> @@ -70,7 +70,13 @@ static int proc_do_xprt(struct ctl_table *table, int write,
> return 0;
> }
> len = svc_print_xprts(tmpbuf, sizeof(tmpbuf));
> - return memory_read_from_buffer(buffer, *lenp, ppos, tmpbuf, len);
> + *lenp = memory_read_from_buffer(buffer, *lenp, ppos, tmpbuf, len);
> +
> + if (*lenp < 0) {
> + *lenp = 0;
> + return -EINVAL;
> + }
> + return 0;
> }
>
> static int
> --
> 2.20.1