lkml.org 
[lkml]   [2020]   [Aug]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 5/6] parport: rework procfs handlers to take advantage of the new buffer
Date
The buffer coming from higher up the stack has an extra byte to handle
the NULL terminator in the string. Instead of using a temporary buffer
to sprintf into and then copying into the buffer, just scnprintf
directly into the buffer and update lenp as appropriate.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
drivers/parport/procfs.c | 108 +++++++++++++--------------------------
1 file changed, 36 insertions(+), 72 deletions(-)

diff --git a/drivers/parport/procfs.c b/drivers/parport/procfs.c
index d740eba3c099..453d035ad5f6 100644
--- a/drivers/parport/procfs.c
+++ b/drivers/parport/procfs.c
@@ -37,9 +37,8 @@ static int do_active_device(struct ctl_table *table, int write,
void *result, size_t *lenp, loff_t *ppos)
{
struct parport *port = (struct parport *)table->extra1;
- char buffer[256];
struct pardevice *dev;
- int len = 0;
+ size_t ret = 0;

if (write) /* can't happen anyway */
return -EACCES;
@@ -48,24 +47,19 @@ static int do_active_device(struct ctl_table *table, int write,
*lenp = 0;
return 0;
}
-
+
for (dev = port->devices; dev ; dev = dev->next) {
if(dev == port->cad) {
- len += sprintf(buffer, "%s\n", dev->name);
+ ret += scnprintf(result + ret, *lenp - ret, "%s\n",
+ dev->name);
}
}

- if(!len) {
- len += sprintf(buffer, "%s\n", "none");
- }
-
- if (len > *lenp)
- len = *lenp;
- else
- *lenp = len;
+ if (!ret)
+ ret = scnprintf(result, *lenp, "%s\n", "none");

- *ppos += len;
- memcpy(result, buffer, len);
+ *lenp = ret;
+ *ppos += ret;
return 0;
}

@@ -75,8 +69,7 @@ static int do_autoprobe(struct ctl_table *table, int write,
{
struct parport_device_info *info = table->extra2;
const char *str;
- char buffer[256];
- int len = 0;
+ size_t ret = 0;

if (write) /* permissions stop this */
return -EACCES;
@@ -85,30 +78,24 @@ static int do_autoprobe(struct ctl_table *table, int write,
*lenp = 0;
return 0;
}
-
+
if ((str = info->class_name) != NULL)
- len += sprintf (buffer + len, "CLASS:%s;\n", str);
+ ret += scnprintf(result + ret, *lenp - ret, "CLASS:%s;\n", str);

if ((str = info->model) != NULL)
- len += sprintf (buffer + len, "MODEL:%s;\n", str);
+ ret += scnprintf(result + ret, *lenp - ret, "MODEL:%s;\n", str);

if ((str = info->mfr) != NULL)
- len += sprintf (buffer + len, "MANUFACTURER:%s;\n", str);
+ ret += scnprintf(result + ret, *lenp - ret, "MANUFACTURER:%s;\n", str);

if ((str = info->description) != NULL)
- len += sprintf (buffer + len, "DESCRIPTION:%s;\n", str);
+ ret += scnprintf(result + ret, *lenp - ret, "DESCRIPTION:%s;\n", str);

if ((str = info->cmdset) != NULL)
- len += sprintf (buffer + len, "COMMAND SET:%s;\n", str);
-
- if (len > *lenp)
- len = *lenp;
- else
- *lenp = len;
+ ret += scnprintf(result + ret, *lenp - ret, "COMMAND SET:%s;\n", str);

- *ppos += len;
-
- memcpy(result, buffer, len);
+ *lenp = ret;
+ *ppos += ret;
return 0;
}
#endif /* IEEE1284.3 support. */
@@ -117,8 +104,7 @@ static int do_hardware_base_addr(struct ctl_table *table, int write,
void *result, size_t *lenp, loff_t *ppos)
{
struct parport *port = (struct parport *)table->extra1;
- char buffer[20];
- int len = 0;
+ size_t ret;

if (*ppos) {
*lenp = 0;
@@ -128,15 +114,10 @@ static int do_hardware_base_addr(struct ctl_table *table, int write,
if (write) /* permissions prevent this anyway */
return -EACCES;

- len += sprintf (buffer, "%lu\t%lu\n", port->base, port->base_hi);
-
- if (len > *lenp)
- len = *lenp;
- else
- *lenp = len;
-
- *ppos += len;
- memcpy(result, buffer, len);
+ ret = scnprintf(result, *lenp, "%lu\t%lu\n", port->base,
+ port->base_hi);
+ *lenp = ret;
+ *ppos += ret;
return 0;
}

@@ -144,8 +125,7 @@ static int do_hardware_irq(struct ctl_table *table, int write,
void *result, size_t *lenp, loff_t *ppos)
{
struct parport *port = (struct parport *)table->extra1;
- char buffer[20];
- int len = 0;
+ size_t ret;

if (*ppos) {
*lenp = 0;
@@ -155,15 +135,10 @@ static int do_hardware_irq(struct ctl_table *table, int write,
if (write) /* permissions prevent this anyway */
return -EACCES;

- len += sprintf (buffer, "%d\n", port->irq);
+ ret = scnprintf(result, *lenp, "%d\n", port->irq);

- if (len > *lenp)
- len = *lenp;
- else
- *lenp = len;
-
- *ppos += len;
- memcpy(result, buffer, len);
+ *lenp = ret;
+ *ppos += ret;
return 0;
}

@@ -171,8 +146,7 @@ static int do_hardware_dma(struct ctl_table *table, int write,
void *result, size_t *lenp, loff_t *ppos)
{
struct parport *port = (struct parport *)table->extra1;
- char buffer[20];
- int len = 0;
+ size_t ret;

if (*ppos) {
*lenp = 0;
@@ -182,15 +156,10 @@ static int do_hardware_dma(struct ctl_table *table, int write,
if (write) /* permissions prevent this anyway */
return -EACCES;

- len += sprintf (buffer, "%d\n", port->dma);
-
- if (len > *lenp)
- len = *lenp;
- else
- *lenp = len;
+ ret = scnprintf(result, *lenp, "%d\n", port->dma);

- *ppos += len;
- memcpy(result, buffer, len);
+ *lenp = ret;
+ *ppos += ret;
return 0;
}

@@ -198,8 +167,7 @@ static int do_hardware_modes(struct ctl_table *table, int write,
void *result, size_t *lenp, loff_t *ppos)
{
struct parport *port = (struct parport *)table->extra1;
- char buffer[40];
- int len = 0;
+ size_t ret = 0;

if (*ppos) {
*lenp = 0;
@@ -213,7 +181,8 @@ static int do_hardware_modes(struct ctl_table *table, int write,
#define printmode(x) \
do { \
if (port->modes & PARPORT_MODE_##x) \
- len += sprintf(buffer + len, "%s%s", f++ ? "," : "", #x); \
+ ret += scnprintf(result + ret, *lenp - ret, \
+ "%s%s", f++ ? "," : "", #x); \
} while (0)
int f = 0;
printmode(PCSPP);
@@ -224,15 +193,10 @@ do { \
printmode(DMA);
#undef printmode
}
- buffer[len++] = '\n';
-
- if (len > *lenp)
- len = *lenp;
- else
- *lenp = len;
+ ret += scnprintf(result + ret, *lenp - ret, "\n");

- *ppos += len;
- memcpy(result, buffer, len);
+ *lenp = ret;
+ *ppos += ret;
return 0;
}

--
2.24.1
\
 
 \ /
  Last update: 2020-08-13 23:05    [W:3.100 / U:0.380 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site