From patchwork Thu Aug 13 21:04:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11712983 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AC24D14E3 for ; Thu, 13 Aug 2020 21:04:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9135722B45 for ; Thu, 13 Aug 2020 21:04:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="Dd6NByMn" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726688AbgHMVEW (ORCPT ); Thu, 13 Aug 2020 17:04:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46826 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726667AbgHMVEV (ORCPT ); Thu, 13 Aug 2020 17:04:21 -0400 Received: from mail-qv1-xf44.google.com (mail-qv1-xf44.google.com [IPv6:2607:f8b0:4864:20::f44]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 30327C061383 for ; Thu, 13 Aug 2020 14:04:21 -0700 (PDT) Received: by mail-qv1-xf44.google.com with SMTP id y11so3342726qvl.4 for ; Thu, 13 Aug 2020 14:04:21 -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=IaO87JqeLl+O7BlBAJGOZPpEX9UGcCnuKI5svLj4Bs0=; b=Dd6NByMnoMi3tP43XCjKs0W3n7u8BCSUEtGRpIIaCs2IgLp+ygeLLj94chmfodjhtt EOH55mnbYk2ifoEUgRM+MUfLmmbVss7DZ1GRHcRwgKMysI9HNBdYsJMcOlU9tV3MTfhF nk66fgHZH2LURB6agR1Y0tAAI2lnO92ecq153l8ZkE7KtsK6AG0p+L/Ooc4Y6bzNNstw ppWq/IY+drpLCtL+4ROVEf6MYHBskleV6qt/xz19czgdWupbyKDRyUrMAL5ymSUvGUIK ua96ZYLtZPSo0ReAGKzlDhFZKijMziH69zLENxYL1oHbdNzykL+y7kK5w4qXfmI7zhwH NPwg== 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=IaO87JqeLl+O7BlBAJGOZPpEX9UGcCnuKI5svLj4Bs0=; b=ESOvaOScjuHm6cEqdjsK4hlB3Q+cqWYxCcyt2pxqvZ4hqeK0pP1vQUTb/brvWmEdsR r1U7CdS6nCcxL6IlV9DvgxmlAFRLy8y8IR9X1dF9y/8BH7rK2Srtn/RiLeKWpykivFLa WzvbnPoFPArl6nOTuk8c+ZKyDk/AXbFphQAVbjsb594IUq6h5LSmnSafDmBnhUpmHbGY qPdSnfMD8pK+G0jFz8cGRuXVJPSGaiIiRaUyd9aHrJAJ6kUFhMJcOTnVLJZN+8zNYyDi Sr3Y9FGLihTjEsaU1hixzfJzV6HllIbjofoCnR+ZYwM3nyrlvKBptgxK+9cheoMeRoBU ZxLA== X-Gm-Message-State: AOAM533WELFkUrnyyid5yV6jiddsihhK/o7bJFkbdP3xKgfxMH1ix31e NAvCy3AQrJqW5axsMrl6BojwUA== X-Google-Smtp-Source: ABdhPJwUQKeBLYjB4FhXaPS3rNe1ShEUQBY/o2BXQwPq2gZ+BYtq4Fh77+yPDsPgTstlbMMGvYs++Q== X-Received: by 2002:ad4:560f:: with SMTP id ca15mr6718700qvb.144.1597352660264; Thu, 13 Aug 2020 14:04:20 -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 c9sm6304727qkm.44.2020.08.13.14.04.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2020 14:04:19 -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 2/6] tree-wide: rename vmemdup_user to kvmemdup_user Date: Thu, 13 Aug 2020 17:04:07 -0400 Message-Id: <20200813210411.905010-3-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 Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org This helper uses kvmalloc, not vmalloc, so rename it to kvmemdup_user to make it clear we're using kvmalloc() and will need to use kvfree(). Signed-off-by: Josef Bacik Reviewed-by: Christoph Hellwig --- arch/x86/kvm/cpuid.c | 6 +++--- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 2 +- drivers/tty/vt/consolemap.c | 2 +- include/linux/string.h | 2 +- mm/util.c | 6 +++--- sound/core/control.c | 4 ++-- virt/kvm/kvm_main.c | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 3fd6eec202d7..22834ea499ee 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -200,9 +200,9 @@ int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu, if (cpuid->nent > KVM_MAX_CPUID_ENTRIES) goto out; if (cpuid->nent) { - cpuid_entries = vmemdup_user(entries, - array_size(sizeof(struct kvm_cpuid_entry), - cpuid->nent)); + cpuid_entries = kvmemdup_user(entries, + array_size(sizeof(struct kvm_cpuid_entry), + cpuid->nent)); if (IS_ERR(cpuid_entries)) { r = PTR_ERR(cpuid_entries); goto out; diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index 7a2430e34e00..c2f973aa3680 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -147,7 +147,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, bo_handles = NULL; } - buf = vmemdup_user(u64_to_user_ptr(exbuf->command), exbuf->size); + buf = kvmemdup_user(u64_to_user_ptr(exbuf->command), exbuf->size); if (IS_ERR(buf)) { ret = PTR_ERR(buf); goto out_unused_fd; diff --git a/drivers/tty/vt/consolemap.c b/drivers/tty/vt/consolemap.c index 5947b54d92be..2cffa8b3c74b 100644 --- a/drivers/tty/vt/consolemap.c +++ b/drivers/tty/vt/consolemap.c @@ -542,7 +542,7 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list) if (!ct) return 0; - unilist = vmemdup_user(list, array_size(sizeof(struct unipair), ct)); + unilist = kvmemdup_user(list, array_size(sizeof(struct unipair), ct)); if (IS_ERR(unilist)) return PTR_ERR(unilist); diff --git a/include/linux/string.h b/include/linux/string.h index 21bb6d3d88c4..a6f7218124a0 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -11,7 +11,7 @@ extern char *strndup_user(const char __user *, long); extern void *memdup_user(const void __user *, size_t); -extern void *vmemdup_user(const void __user *, size_t); +extern void *kvmemdup_user(const void __user *, size_t); extern void *kvmemdup_user_nul(const void __user *, size_t); extern void *memdup_user_nul(const void __user *, size_t); diff --git a/mm/util.c b/mm/util.c index cf454d57d3e2..f434634b6ba3 100644 --- a/mm/util.c +++ b/mm/util.c @@ -183,7 +183,7 @@ void *memdup_user(const void __user *src, size_t len) EXPORT_SYMBOL(memdup_user); /** - * vmemdup_user - duplicate memory region from user space + * kvmemdup_user - duplicate memory region from user space * * @src: source address in user space * @len: number of bytes to copy @@ -191,7 +191,7 @@ EXPORT_SYMBOL(memdup_user); * Return: an ERR_PTR() on failure. Result may be not * physically contiguous. Use kvfree() to free. */ -void *vmemdup_user(const void __user *src, size_t len) +void *kvmemdup_user(const void __user *src, size_t len) { void *p; @@ -206,7 +206,7 @@ void *vmemdup_user(const void __user *src, size_t len) return p; } -EXPORT_SYMBOL(vmemdup_user); +EXPORT_SYMBOL(kvmemdup_user); /** * kvmemdup_user_nul - duplicate memory region from user space and NUL-terminate diff --git a/sound/core/control.c b/sound/core/control.c index aa0c0cf182af..b712f4d261de 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -1297,7 +1297,7 @@ static int replace_user_tlv(struct snd_kcontrol *kctl, unsigned int __user *buf, if (size > 1024 * 128) /* sane value */ return -EINVAL; - container = vmemdup_user(buf, size); + container = kvmemdup_user(buf, size); if (IS_ERR(container)) return PTR_ERR(container); @@ -1365,7 +1365,7 @@ static int snd_ctl_elem_init_enum_names(struct user_element *ue) if (ue->info.value.enumerated.names_length > 64 * 1024) return -EINVAL; - names = vmemdup_user((const void __user *)user_ptrval, + names = kvmemdup_user((const void __user *)user_ptrval, ue->info.value.enumerated.names_length); if (IS_ERR(names)) return PTR_ERR(names); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 737666db02de..1111780ccefd 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -3814,8 +3814,8 @@ static long kvm_vm_ioctl(struct file *filp, goto out; if (routing.nr) { urouting = argp; - entries = vmemdup_user(urouting->entries, - array_size(sizeof(*entries), + entries = kvmemdup_user(urouting->entries, + array_size(sizeof(*entries), routing.nr)); if (IS_ERR(entries)) { r = PTR_ERR(entries); From patchwork Thu Aug 13 21:04:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11712985 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4D7C514E3 for ; Thu, 13 Aug 2020 21:04:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2DDDD20885 for ; Thu, 13 Aug 2020 21:04:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="SC9NQH21" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726709AbgHMVEZ (ORCPT ); Thu, 13 Aug 2020 17:04:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46834 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726698AbgHMVEX (ORCPT ); Thu, 13 Aug 2020 17:04:23 -0400 Received: from mail-qt1-x841.google.com (mail-qt1-x841.google.com [IPv6:2607:f8b0:4864:20::841]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC6EBC061383 for ; Thu, 13 Aug 2020 14:04:22 -0700 (PDT) Received: by mail-qt1-x841.google.com with SMTP id x12so5509338qtp.1 for ; Thu, 13 Aug 2020 14:04:22 -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=xUKwSa9dEsOBbkoif2MHNtlKwaDfeFIwQ3yS7cCI+po=; b=SC9NQH21+yzXW/Ck0Uss2QSSYbwRPRieMYMOCOgOwC07+6AxSvuXtm44n/0z9bMusU AW2XEMxcM1VXqAEoE62rMIOhmYY97bUskB9MYXwvh45djOL5HMZpHoUFwu+QGAdwvLnz Ze79gjy3eN1UDPFjbndABOdXirSX3d06asTBK8AHQ4oN0nitXCwSwElIdErpoCf5q5sI RSb5Dp7qPRg5fvlIa5zG+Wvm9hZ0JmJupxmu6NEu8vGYIM4FBlfEZ8CDALvZw12DQ+FB djVkXb0bniei+dI0DMNATg3hvpO0zi0mpfFvIJD0z7ksbx8kNgrYE0bg0opdamsweCaC Pt4g== 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=xUKwSa9dEsOBbkoif2MHNtlKwaDfeFIwQ3yS7cCI+po=; b=UpZUCswhNOcGvNJHReZu+X+2TaINhPAR4k6M8o9P9g2bPMXAuSp4gL/C0IDcgDGAoF 1n4QxC3wVSNhT14hkkLKNGHMb8/H8Y+6seSezFV/G+FvTSE/wZOhsVpjCVyw9OBR+HVl AX92oMXMVxK0/gCbKCBk+1f66r2vkF6Si78SrslU8ceXV8CgVfKKjLj1PPBSkPQX4b+x 2aS8pQJSTEJwIWeSCxNEtRRmb20NoKgfbAG0o4fkAwXSoEPSrjbivXb516E0aQRtFqwT k37LvRX9X2sDXTF1qDyHBI68QDrse4Ub+ofNnuKTQ9+tqAU+dwjgySOIBYUYQajTm962 +8Tw== X-Gm-Message-State: AOAM533WtPJsT86ugpV5SMaN5niFi6P1bxwkLpBZgOopEs/sSWqAe9t2 oNtgyIgNKEGvCKwx90Hnuqtssw== X-Google-Smtp-Source: ABdhPJzj5SOw34eSF78uCRhtj2OcPdzC6qoKdoWb+tHmcIpOCNxyUbJrFpEUpqE+bg3c2uy+xPQEGA== X-Received: by 2002:ac8:70cd:: with SMTP id g13mr7393215qtp.53.1597352661965; Thu, 13 Aug 2020 14:04:21 -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 w12sm6240852qkj.116.2020.08.13.14.04.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2020 14:04:21 -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 3/6] proc: allocate count + 1 for our read buffer Date: Thu, 13 Aug 2020 17:04:08 -0400 Message-Id: <20200813210411.905010-4-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 Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org Al suggested that if we allocate enough space to add in the '\0' character at the end of our strings, we could just use scnprintf() in our ->proc_handler functions without having to be fancy about keeping track of space. There are a lot of these handlers, so the follow ups will be separate, but start with allocating the extra byte to handle the null termination of strings. Signed-off-by: Josef Bacik Reviewed-by: Christoph Hellwig --- fs/proc/proc_sysctl.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index 8e19bad83b45..446e7a949025 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c @@ -548,6 +548,7 @@ static ssize_t proc_sys_call_handler(struct file *filp, void __user *ubuf, struct ctl_table *table = PROC_I(inode)->sysctl_entry; void *kbuf; ssize_t error; + size_t orig_count = count; if (IS_ERR(head)) return PTR_ERR(head); @@ -577,9 +578,23 @@ static ssize_t proc_sys_call_handler(struct file *filp, void __user *ubuf, goto out; } } else { - kbuf = kvzalloc(count, GFP_KERNEL); + /* + * To make our lives easier in ->proc_handler, we allocate an + * extra byte to allow us to use scnprintf() for handling the + * buffer output. This works properly because scnprintf() will + * only return the number of bytes that it was able to write + * out, _NOT_ including the NULL byte. This means the handler's + * will only ever return a maximum of count as what they've + * copied. + * + * HOWEVER, we do not assume that ->proc_handlers are without + * bugs, so further down we'll do an extra check to make sure + * that count isn't larger than the orig_count. + */ + kbuf = kvzalloc(count + 1, GFP_KERNEL); if (!kbuf) goto out; + count += 1; } error = BPF_CGROUP_RUN_PROG_SYSCTL(head, table, write, &kbuf, &count, @@ -593,6 +608,13 @@ static ssize_t proc_sys_call_handler(struct file *filp, void __user *ubuf, goto out_free_buf; if (!write) { + /* + * This shouldn't happen, but those are the last words before + * somebody adds a security vulnerability, so just make sure + * that count isn't larger than orig_count. + */ + if (count > orig_count) + count = orig_count; error = -EFAULT; if (copy_to_user(ubuf, kbuf, count)) goto out_free_buf; From patchwork Thu Aug 13 21:04:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11712991 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 55B4213B6 for ; Thu, 13 Aug 2020 21:04:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3C8C520885 for ; Thu, 13 Aug 2020 21:04:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="QijV9x4i" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726809AbgHMVEm (ORCPT ); Thu, 13 Aug 2020 17:04:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46842 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726564AbgHMVEZ (ORCPT ); Thu, 13 Aug 2020 17:04:25 -0400 Received: from mail-qv1-xf44.google.com (mail-qv1-xf44.google.com [IPv6:2607:f8b0:4864:20::f44]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D3769C061757 for ; Thu, 13 Aug 2020 14:04:24 -0700 (PDT) Received: by mail-qv1-xf44.google.com with SMTP id l13so3320567qvt.10 for ; Thu, 13 Aug 2020 14:04:24 -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=ycCIVy361UoLo0c5/AED/UxCAcejG5GKn68oBgGv2HA=; b=QijV9x4iaFVr4ppulFFUZv+PUc7jxU/O9GHaA9x761i20qidkkD1kGUq1KbcByoiYW ycJmmOdd1tlK9SukOuH1QBjIjTLnvROd4EwwbVlug8Kvwcpy5SeqwkRhFKzHJczfRgcI t/mLY1zYoTFj49exE5rWg+hdcxtMLY5vhqudWg5IbYWwSkZ4PrhzpN5PhrbpC8isfxps 46Zej12Yz58j6T9YOd3483AnmjrhXYPHqsZckD5zuSRQtAIREWXt4eWmJ38C7GC0kIuj Bw1tch82CvP93lh9h5nEI9r1fHNWUrheMHmthfiCXSMHEE7fOUys2lrU1xVElVsYrNw+ tChw== 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=ycCIVy361UoLo0c5/AED/UxCAcejG5GKn68oBgGv2HA=; b=qWnmEC+KsYDSW79ibbNgfA7ULbkG011MfTzXlxwNJkxhSOh+8A7TjIa4/iNIpQmqXe GS7q2Y8OVA6CpVgljvrUwWl/Nc90yz040vdzW8IMo0ApwhRIEHj4xiVGurrbxnp4A+xf /jYeOVipfj6TJn8cs/3kpAj3BMGxiERKpQzdtZBpJkw9kc2chyzbEEHB45EwUhzdYuMq jnn6Xel7nMGq7mjvK4VO9molJnL7LGO1QVxCAtXINet5d993/BZWdOa5k1IERBL7PIc7 fUU/2I64YR8pNtMW9a/7yhjzdUEQ+avJte7qvcW0bpNjxaKEgvLSAKa7wcNvuCUsWJ1I RXkg== X-Gm-Message-State: AOAM530L+PteW0USb1ewnBNDc4BqNh7BCFUzfXrogWkYAAm8xsJyyGch 7+vbRXtT5kfTOR9w6wZ5ItBpDg== X-Google-Smtp-Source: ABdhPJy7Ev0oEAzZFQ91/Fm3qWfS688wZCmbhl8ge0Fwp1eNf3XvcIMjaZ7llS65arZ8Ck4HavVc8Q== X-Received: by 2002:ad4:54d4:: with SMTP id j20mr6510667qvx.6.1597352664041; Thu, 13 Aug 2020 14:04:24 -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 q7sm6663428qkf.35.2020.08.13.14.04.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2020 14:04:23 -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 4/6] sysctl: make proc_put_long() use scnprintf Date: Thu, 13 Aug 2020 17:04:09 -0400 Message-Id: <20200813210411.905010-5-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 Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org 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 Reviewed-by: Christoph Hellwig --- 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) { From patchwork Thu Aug 13 21:04:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11712989 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0968414E3 for ; Thu, 13 Aug 2020 21:04:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E1EEF21744 for ; Thu, 13 Aug 2020 21:04:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="ejNsa+jp" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726752AbgHMVEa (ORCPT ); Thu, 13 Aug 2020 17:04:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46846 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726735AbgHMVE1 (ORCPT ); Thu, 13 Aug 2020 17:04:27 -0400 Received: from mail-qk1-x743.google.com (mail-qk1-x743.google.com [IPv6:2607:f8b0:4864:20::743]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B1C99C061384 for ; Thu, 13 Aug 2020 14:04:26 -0700 (PDT) Received: by mail-qk1-x743.google.com with SMTP id b79so6502854qkg.9 for ; Thu, 13 Aug 2020 14:04:26 -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=euMz+i++zZlwdvCx0Dtjbw2IBRQpxbccKC89yJ6freC3qcxJtUYhCHTV8MSvAO0PUb SJjnTh5SWv8gDNNdCXFP/rlS/z3Zu9Nrg41mO0SW15DzhiXf149QkwCaxN64vwUrJJTG Yr3RjXzzonNa4c3mdQyrAOobj9TvLh96GO6YOsIANi4l8hLA1mFJ95LauOS8EP4NlioA MCPut68bJQj0iyy9sTda5uaKJKHA5+mD95tjPp55Nomx1s3vvMzb8UM6osUoVA9uc5Uy 7q0wVyBj6h+3JjOOadyMX6hDO2Pb9VLDbd+W7vd6D48m/95acsL4xSEgOVn9sPkGvfAf ngdw== X-Gm-Message-State: AOAM532b22cFWncvvurUdZ3xM4M6RUyTq7eAyAiw3w1xeF16+0N3hAf7 toUZvl3HmJmg5nsz3l3cjiobGA== X-Google-Smtp-Source: ABdhPJykx6IW8mEtdDEkJz+B1eYT2YTUFbfFsDCkybScvXjr8caKjUwYhlC5o1X3Vm0IZh17dtYxgQ== 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 Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@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 Reviewed-by: Christoph Hellwig --- 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; } From patchwork Thu Aug 13 21:04:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 11712987 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 00D6E13B6 for ; Thu, 13 Aug 2020 21:04:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DC4A822BF5 for ; Thu, 13 Aug 2020 21:04:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=toxicpanda-com.20150623.gappssmtp.com header.i=@toxicpanda-com.20150623.gappssmtp.com header.b="cT3EKhb5" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726761AbgHMVEa (ORCPT ); Thu, 13 Aug 2020 17:04:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46854 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726745AbgHMVE3 (ORCPT ); Thu, 13 Aug 2020 17:04:29 -0400 Received: from mail-qt1-x843.google.com (mail-qt1-x843.google.com [IPv6:2607:f8b0:4864:20::843]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DCA7AC061383 for ; Thu, 13 Aug 2020 14:04:28 -0700 (PDT) Received: by mail-qt1-x843.google.com with SMTP id s16so5484981qtn.7 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=fP9lP5J3iDMYf8rHzghnKH6TXtdMcDE1b3S5bi4nUEU=; b=cT3EKhb5eeN0mTmMlyXvcbBoen4kpRz9MkJyXeAirYXUWdz02tUwkvQXECmNg+TkaD jzU6fsqB4ZGIum35WEjTvUUcDvDvHZIzBBiA99mcqr3/lGUWb2X0BA2O0/fnivLH8p2V NzV95903xJU32+dWivod7qGlYAgyNtu3GJhgERYcqyCXiXKYZQsrbP0PPc8qL1MXoJ+u HmPvz2cLV+Jol1enJaQVaj/DEeEDovYu6GxmNm14KpsdFmjGuYlWtj9gct9fAIvvLBOs yY/WxWHzhr/G+ajuBOVOkYtBmLjs56+vL2Y0V/ycCP5A3KUIjBdJt5NhbmLkAZaIc7H2 C5Hg== 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=fP9lP5J3iDMYf8rHzghnKH6TXtdMcDE1b3S5bi4nUEU=; b=oxnDbeL+J5XtzswDIWS+tmnARCE1hfqWh/8wMAoCjpcjfuVghI+O8YcZP4wceDJwp/ TWSW7QXZhN0PFzndj4alOsaIDfCGtMBxPhafu9QZputmr9MxMzZMKUlMs0p1QMpkn4Nj zcmzYSWt68KzMWXh3xOSRKPeGPCQuVsC3zjdB8uptLKJx/CF/b8KPl7OPofCPQGKLq76 YILQE+FHag64SHEsi3o+4hG/cmxcnw6U2FQ4gwAFuT8CxaooN1RwAwq7fIORV4ktJLsV QL5u8GfPohHBurkiAfM+bgqjImK85bfNRpLs7gKl5GfDjlm55ba0y1T0a/8xbVBfsFwa k+Ww== X-Gm-Message-State: AOAM533dkRun+Gw05cJjZSR+2CVaotzDtSl9VUeynKiv4JcK3CvHBBM5 idtsBAYn2uLz4WTBEDDaqTDyVg== X-Google-Smtp-Source: ABdhPJzswgyzPU1h7n0HxzeOaC1WtFB0NHM2erdCX+zd7HARBrYyuExecLpPjtSgwW9qEwus5zGumw== X-Received: by 2002:ac8:748b:: with SMTP id v11mr7121989qtq.293.1597352667526; Thu, 13 Aug 2020 14:04:27 -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 s30sm8077804qtc.87.2020.08.13.14.04.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2020 14:04:26 -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 6/6] sunrpc: rework proc handlers to take advantage of the new buffer Date: Thu, 13 Aug 2020 17:04:11 -0400 Message-Id: <20200813210411.905010-7-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 Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org Now that we're allocating an extra slot for the NULL terminated string, use scnprintf() and write directly into the buffer. Signed-off-by: Josef Bacik Reviewed-by: Christoph Hellwig --- net/sunrpc/sysctl.c | 10 ++-------- net/sunrpc/xprtrdma/svc_rdma.c | 16 ++-------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c index 999eee1ed61c..31ed530d9846 100644 --- a/net/sunrpc/sysctl.c +++ b/net/sunrpc/sysctl.c @@ -117,14 +117,8 @@ proc_dodebug(struct ctl_table *table, int write, void *buffer, size_t *lenp, if (strcmp(table->procname, "rpc_debug") == 0) rpc_show_tasks(&init_net); } else { - len = sprintf(tmpbuf, "0x%04x", *(unsigned int *) table->data); - if (len > left) - len = left; - memcpy(buffer, tmpbuf, len); - if ((left -= len) > 0) { - *((char *)buffer + len) = '\n'; - left--; - } + len = scnprintf(buffer, *lenp, "0x%04x\n", *(unsigned int *) table->data); + left -= len; } done: diff --git a/net/sunrpc/xprtrdma/svc_rdma.c b/net/sunrpc/xprtrdma/svc_rdma.c index 526da5d4710b..9b3a113598af 100644 --- a/net/sunrpc/xprtrdma/svc_rdma.c +++ b/net/sunrpc/xprtrdma/svc_rdma.c @@ -90,20 +90,8 @@ static int read_reset_stat(struct ctl_table *table, int write, if (write) atomic_set(stat, 0); else { - char str_buf[32]; - int len = snprintf(str_buf, 32, "%d\n", atomic_read(stat)); - if (len >= 32) - return -EFAULT; - len = strlen(str_buf); - if (*ppos > len) { - *lenp = 0; - return 0; - } - len -= *ppos; - if (len > *lenp) - len = *lenp; - if (len) - memcpy(buffer, str_buf, len); + size_t len = scnprintf(buffer, *lenp, "%d\n", + atomic_read(stat)); *lenp = len; *ppos += len; }