[PATCH 5/6] parport: rework procfs handlers to take advantage of the new buffer

From: Josef Bacik
Date: Thu Aug 13 2020 - 17:04:37 EST


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@xxxxxxxxxxxxxx>
---
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