Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp1662975pxa; Thu, 13 Aug 2020 14:05:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxHANG0eEicU68ImgJiG38OEQLHLyJcaf8KEE4n7WDtvuzzEaK9lHTiQAeDAjEcCUUoWBkn X-Received: by 2002:a17:906:ce39:: with SMTP id sd25mr6948880ejb.80.1597352727876; Thu, 13 Aug 2020 14:05:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597352727; cv=none; d=google.com; s=arc-20160816; b=Te/12DZacFQuyabQaSmvY7pC4Y2ZC8J9MrZ2ZI2v2PoVZZeCqIHC0GQmWDMwbIpEym hiMLEFgyvXVPMAfxlVyVv7Yja5e/EfEkpIh9MwDTGb9PjNCdRJRki5J77+nJxx6wgzT6 zMI2EaV82eoXhLI24V9zFbjU+NPc4nZR92WmBF7Pcn08hojYo0TTsFMNNDfA3eeoEh3O eux14WL7Ne1nUJtbmwbQg7qGVedDagkqwrlOOqothWigObxm1kIwbhbauZJVMuqwCnUI lel/OFEdXY2NjmFwNrbTxf3kx6T5vKoxjJdesNgtOmPebOBgx/hHOdpZdD7a4XpwHPZW JBUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=B2hh6MpQwu6Rqj6uOiklAGWqGW54Mh8HhVSMxBFaJos=; b=tIWLW+M0Mw+PknRlcxmJTlfgbi5CPBndPpW/Q8vBnB9PxdTxFXL+h+xk6oGBpw12y/ UIhgKvPrBfO63yk0085FsSZGLg3VqV093PZuZYfzPNZEA1dkZ6dHJGOlUbVXqbl9wsw+ ZZyvIu0AifgWgA+p/dVlRmAL9cnhy5V0ygQkE+NqD5x1/XYUg46tCQGekTgoC2+jMWXt NzOebocUoLMLNo0RGhHFsEuF18onAC3iZDTnCtsaR9YUgg3W47etRquDZpvMCJMifFU8 BbxMT+hGWOh6BoKvi6sk7VXHvZfVWOgZEPbnu+H8Yln9A3akhrGOBmRKi5Di3BIL1pF6 IqgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@toxicpanda-com.20150623.gappssmtp.com header.s=20150623 header.b=ejNsa+jp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s15si4054736ejx.745.2020.08.13.14.05.04; Thu, 13 Aug 2020 14:05:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@toxicpanda-com.20150623.gappssmtp.com header.s=20150623 header.b=ejNsa+jp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726768AbgHMVEa (ORCPT + 99 others); Thu, 13 Aug 2020 17:04:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46852 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726699AbgHMVE2 (ORCPT ); Thu, 13 Aug 2020 17:04:28 -0400 Received: from mail-qk1-x744.google.com (mail-qk1-x744.google.com [IPv6:2607:f8b0:4864:20::744]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A1E81C061757 for ; Thu, 13 Aug 2020 14:04:28 -0700 (PDT) Received: by mail-qk1-x744.google.com with SMTP id x69so6557670qkb.1 for ; Thu, 13 Aug 2020 14:04:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=B2hh6MpQwu6Rqj6uOiklAGWqGW54Mh8HhVSMxBFaJos=; b=ejNsa+jphEK3859SCEU0roKfiKmiiVa2ALt77VinrUqepgftjIRozCHn5PCiDJA+G+ sM9Cr1E3IVkgOtNWe4JkL03D6EnuXxN5yH41MS0Gksym+5Z3jmh1e2JPffSnVfswMRAd 98iMI1p72ITKNH2G324zgWTmP4IgYYRs5wQBvxNEe4v2V0hiVz51M+pj8/J4miX2puC9 7VSQfvyMpYDBA21Z6skpxhPp8gOGtYg/5Ypq1eq+AtD2iT3foLq3VdKZk9nwuWDZ9kmH Cq5o0knbL5g075H/aSxfGDHHpOKOGIc8qg+HBNwx1NZKvSZvY84c6r6OCtyNJqNPcQJ5 FuZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=B2hh6MpQwu6Rqj6uOiklAGWqGW54Mh8HhVSMxBFaJos=; b=hnzt+YOrG9Sg0aFldyEV1+4gdpJs/FcYjmL6TVtchioLQpkOM1fOGm0FIfRny06FoE OuWZgWTBCsYMUHP5QBBlPFVWDgnxEmjnlteXcpN/w5ju2u3duKcwSIVuiDMPkQiASmRw 0QAXfEeO+EE305CIGKYSr1wyCyawfglZN7ZCOWL7cjTgLMYNv+zQR3D6yKO72BgGkdVJ MWfsGDThhInh2FoYUssJHPPMpEiubY2kuVeEfz5q0XBP/Ek2+5MeO0ruFq32cqq5pcCV woMZTuMGMLFMWcUXoztkuyEmq8UBxiR3inRIF97gVgtkbkrW5heQjInEN1CQB8ettAeq 02Lw== X-Gm-Message-State: AOAM532CGNsYuFNKqrsarBtwWxr7POAegatRGJgqAe/jAAWMSAfyLvDs uXXqntw4UqymLSZZuX35weFbJA== X-Received: by 2002:a37:5d01:: with SMTP id r1mr6634316qkb.18.1597352665792; Thu, 13 Aug 2020 14:04:25 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id j15sm6397355qkl.63.2020.08.13.14.04.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2020 14:04:25 -0700 (PDT) From: Josef Bacik To: hch@lst.de, viro@ZenIV.linux.org.uk, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, willy@infradead.org, kernel-team@fb.com Subject: [PATCH 5/6] parport: rework procfs handlers to take advantage of the new buffer Date: Thu, 13 Aug 2020 17:04:10 -0400 Message-Id: <20200813210411.905010-6-josef@toxicpanda.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200813210411.905010-1-josef@toxicpanda.com> References: <20200813210411.905010-1-josef@toxicpanda.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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