2020-08-13 21:06:45

by Josef Bacik

[permalink] [raw]
Subject: [PATCH 4/6] sysctl: make proc_put_long() use scnprintf

Now that we're passing down a kernel buffer with enough space to account
for an extra NULL terminator, go ahead and use scnprintf() to print out
a long in proc_put_long(). count here includes NULL terminator slot in
the buffer, so we will get the correct behavior we're looking for.

Signed-off-by: Josef Bacik <[email protected]>
---
kernel/sysctl.c | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 287862f91717..d8cc8737f58f 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -484,6 +484,7 @@ static int proc_get_long(char **buf, size_t *size,

return 0;
}
+#undef TMPBUFLEN

/**
* proc_put_long - converts an integer to a decimal ASCII formatted string
@@ -498,18 +499,12 @@ static int proc_get_long(char **buf, size_t *size,
*/
static void proc_put_long(void **buf, size_t *size, unsigned long val, bool neg)
{
- int len;
- char tmp[TMPBUFLEN], *p = tmp;
+ size_t ret;

- sprintf(p, "%s%lu", neg ? "-" : "", val);
- len = strlen(tmp);
- if (len > *size)
- len = *size;
- memcpy(*buf, tmp, len);
- *size -= len;
- *buf += len;
+ ret = scnprintf(*buf, *size, "%s%lu", neg ? "-" : "", val);
+ *size -= ret;
+ *buf += ret;
}
-#undef TMPBUFLEN

static void proc_put_char(void **buf, size_t *size, char c)
{
--
2.24.1


2020-09-01 15:17:37

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH 4/6] sysctl: make proc_put_long() use scnprintf

On Thu, Aug 13, 2020 at 05:04:09PM -0400, Josef Bacik wrote:
> Now that we're passing down a kernel buffer with enough space to account
> for an extra NULL terminator, go ahead and use scnprintf() to print out
> a long in proc_put_long(). count here includes NULL terminator slot in
> the buffer, so we will get the correct behavior we're looking for.
>
> Signed-off-by: Josef Bacik <[email protected]>

Looks good,

Reviewed-by: Christoph Hellwig <[email protected]>