From patchwork Fri Jun 14 13:46:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeffrey Layton X-Patchwork-Id: 10995363 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 648BE76 for ; Fri, 14 Jun 2019 13:46:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5312A205FD for ; Fri, 14 Jun 2019 13:46:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4697A284CE; Fri, 14 Jun 2019 13:46:31 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9ED49205FD for ; Fri, 14 Jun 2019 13:46:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728419AbfFNNq3 (ORCPT ); Fri, 14 Jun 2019 09:46:29 -0400 Received: from mail.kernel.org ([198.145.29.99]:41970 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727382AbfFNNq3 (ORCPT ); Fri, 14 Jun 2019 09:46:29 -0400 Received: from tleilax.poochiereds.net (cpe-71-70-156-158.nc.res.rr.com [71.70.156.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 84E2420866; Fri, 14 Jun 2019 13:46:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1560519988; bh=ovlMXpgqsXCpaXo/AE1irJuB72ZjGB9Ts9Jdd8XX7QA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ex5+GmNDFdK9NX2Pn2xteg6AnMZoqwlgZyMfigth+PWyvvTj5q0bygpbhHXU8jhPz wEGOTw52RJi+ll4LMADHrHtSRoeiJhdjlHCfTRx32SvO3fZol38UaK8KPpGAFoP+Fv ISffvuSfNNYN2zYQFl6HHFyNobiS2K5GzT4/S8aQ= From: Jeff Layton To: linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org Cc: akpm@linux-foundation.org, idryomov@gmail.com, zyan@redhat.com, sage@redhat.com, agruenba@redhat.com Subject: [PATCH 1/3] lib/vsprintf: add snprintf_noterm Date: Fri, 14 Jun 2019 09:46:23 -0400 Message-Id: <20190614134625.6870-2-jlayton@kernel.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190614134625.6870-1-jlayton@kernel.org> References: <20190614134625.6870-1-jlayton@kernel.org> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The getxattr interface returns a length after filling out the value buffer, and the convention with xattrs is to not NULL terminate string data. CephFS implements some virtual xattrs by using snprintf to fill the buffer, but that always NULL terminates the string. If userland sends down a buffer that is just the right length to hold the text without termination then we end up truncating the value. Factor the formatting piece of vsnprintf into a separate helper function, and have vsnprintf call that and then do the NULL termination afterward. Then add a snprintf_noterm function that calls the new helper to populate the string but skips the termination. Signed-off-by: Jeff Layton --- include/linux/kernel.h | 2 + lib/vsprintf.c | 145 ++++++++++++++++++++++++++++------------- 2 files changed, 103 insertions(+), 44 deletions(-) diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 2d14e21c16c0..2f305a347482 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -462,6 +462,8 @@ extern int num_to_str(char *buf, int size, extern __printf(2, 3) int sprintf(char *buf, const char * fmt, ...); extern __printf(2, 0) int vsprintf(char *buf, const char *, va_list); extern __printf(3, 4) +int snprintf_noterm(char *buf, size_t size, const char *fmt, ...); +extern __printf(3, 4) int snprintf(char *buf, size_t size, const char *fmt, ...); extern __printf(3, 0) int vsnprintf(char *buf, size_t size, const char *fmt, va_list args); diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 791b6fa36905..ad5f4990eda3 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -2296,53 +2296,24 @@ set_precision(struct printf_spec *spec, int prec) } /** - * vsnprintf - Format a string and place it in a buffer + * vsnprintf_noterm - Format a string and place it in a buffer without NULL + * terminating it * @buf: The buffer to place the result into - * @size: The size of the buffer, including the trailing null space + * @end: The end of the buffer * @fmt: The format string to use * @args: Arguments for the format string * - * This function generally follows C99 vsnprintf, but has some - * extensions and a few limitations: - * - * - ``%n`` is unsupported - * - ``%p*`` is handled by pointer() - * - * See pointer() or Documentation/core-api/printk-formats.rst for more - * extensive description. - * - * **Please update the documentation in both places when making changes** - * - * The return value is the number of characters which would - * be generated for the given input, excluding the trailing - * '\0', as per ISO C99. If you want to have the exact - * number of characters written into @buf as return value - * (not including the trailing '\0'), use vscnprintf(). If the - * return is greater than or equal to @size, the resulting - * string is truncated. - * - * If you're not already dealing with a va_list consider using snprintf(). + * See the documentation over vsnprintf. This function does NOT add any NULL + * termination to the buffer. The caller must do that if necessary. */ -int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) +static int vsnprintf_noterm(char *buf, char *end, const char *fmt, + va_list args) { unsigned long long num; - char *str, *end; + char *str; struct printf_spec spec = {0}; - /* Reject out-of-range values early. Large positive sizes are - used for unknown buffer sizes. */ - if (WARN_ON_ONCE(size > INT_MAX)) - return 0; - str = buf; - end = buf + size; - - /* Make sure end is always >= buf */ - if (end < buf) { - end = ((void *)-1); - size = end - buf; - } - while (*fmt) { const char *old_fmt = fmt; int read = format_decode(fmt, &spec); @@ -2462,18 +2433,69 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) str = number(str, end, num, spec); } } - out: + /* the trailing null byte doesn't count towards the total */ + return str-buf; +} +EXPORT_SYMBOL(vsnprintf_noterm); + +/** + * vsnprintf - Format a string and place it in a buffer + * @buf: The buffer to place the result into + * @size: The size of the buffer, including the trailing null space + * @fmt: The format string to use + * @args: Arguments for the format string + * + * This function generally follows C99 vsnprintf, but has some + * extensions and a few limitations: + * + * - ``%n`` is unsupported + * - ``%p*`` is handled by pointer() + * + * See pointer() or Documentation/core-api/printk-formats.rst for more + * extensive description. + * + * **Please update the documentation in both places when making changes** + * + * The return value is the number of characters which would + * be generated for the given input, excluding the trailing + * '\0', as per ISO C99. If you want to have the exact + * number of characters written into @buf as return value + * (not including the trailing '\0'), use vscnprintf(). If the + * return is greater than or equal to @size, the resulting + * string is truncated. + * + * If you're not already dealing with a va_list consider using snprintf(). + */ +int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) +{ + int ret; + char *end; + + /* Reject out-of-range values early. Large positive sizes are + used for unknown buffer sizes. */ + if (WARN_ON_ONCE(size > INT_MAX)) + return 0; + + end = buf + size; + + /* Make sure end is always >= buf */ + if (end < buf) { + end = ((void *)-1); + size = end - buf; + } + + ret = vsnprintf_noterm(buf, end, fmt, args); + + /* NULL terminate the result */ if (size > 0) { - if (str < end) - *str = '\0'; + if (ret < size) + buf[ret] = '\0'; else - end[-1] = '\0'; + buf[size - 1] = '\0'; } - /* the trailing null byte doesn't count towards the total */ - return str-buf; - + return ret; } EXPORT_SYMBOL(vsnprintf); @@ -2506,6 +2528,41 @@ int vscnprintf(char *buf, size_t size, const char *fmt, va_list args) } EXPORT_SYMBOL(vscnprintf); +/** + * snprintf_noterm - Format a string and place it in a buffer + * @buf: The buffer to place the result into + * @size: The size of the buffer, including the trailing null space + * @fmt: The format string to use + * @...: Arguments for the format string + * + * Same as snprintf, but don't NULL terminate the result. + */ +int snprintf_noterm(char *buf, size_t size, const char *fmt, ...) +{ + va_list args; + int ret; + char *end; + + /* Reject out-of-range values early. Large positive sizes are + used for unknown buffer sizes. */ + if (WARN_ON_ONCE(size > INT_MAX)) + return 0; + + /* Make sure end is always >= buf */ + end = buf + size; + if (end < buf) { + end = ((void *)-1); + size = end - buf; + } + + va_start(args, fmt); + ret = vsnprintf_noterm(buf, end, fmt, args); + va_end(args); + + return ret; +} +EXPORT_SYMBOL(snprintf_noterm); + /** * snprintf - Format a string and place it in a buffer * @buf: The buffer to place the result into From patchwork Fri Jun 14 13:46:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeffrey Layton X-Patchwork-Id: 10995367 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9799C1395 for ; Fri, 14 Jun 2019 13:46:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 883B1205FD for ; Fri, 14 Jun 2019 13:46:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7BE3B2833E; Fri, 14 Jun 2019 13:46:44 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E5B9427F90 for ; Fri, 14 Jun 2019 13:46:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728516AbfFNNqk (ORCPT ); Fri, 14 Jun 2019 09:46:40 -0400 Received: from mail.kernel.org ([198.145.29.99]:41982 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728413AbfFNNqa (ORCPT ); Fri, 14 Jun 2019 09:46:30 -0400 Received: from tleilax.poochiereds.net (cpe-71-70-156-158.nc.res.rr.com [71.70.156.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8F59A2173C; Fri, 14 Jun 2019 13:46:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1560519989; bh=sL/15lE2CkcpsfLA/Y/ogwWSKvknIF4LPwsicElD/Cc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=L21uOtE8a+XtwCd+cr3GUKY55QPh+Yd8DncwuG95JcD288nh60fWgfsOwgl53PAdB zSS6NT2ZCrnb+C8upZYfCvKMNc8Dhcyea3erWRT0WnbUtJ++dLv6ZjAQho0KnIlA3Y /76OTcdlX3W97baE2bRNOYMJ3/ZksxDAz3I/CE7o= From: Jeff Layton To: linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org Cc: akpm@linux-foundation.org, idryomov@gmail.com, zyan@redhat.com, sage@redhat.com, agruenba@redhat.com Subject: [PATCH 2/3] ceph: don't NULL terminate virtual xattr strings Date: Fri, 14 Jun 2019 09:46:24 -0400 Message-Id: <20190614134625.6870-3-jlayton@kernel.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190614134625.6870-1-jlayton@kernel.org> References: <20190614134625.6870-1-jlayton@kernel.org> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The convention with xattrs is to not NULL terminate string data in the value. Have ceph use snprintf_noterm to populate virtual xattrs. Signed-off-by: Jeff Layton --- fs/ceph/xattr.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index 6621d27e64f5..a1cd9613be98 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c @@ -71,13 +71,13 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, down_read(&osdc->lock); pool_name = ceph_pg_pool_name_by_id(osdc->osdmap, pool); if (pool_name) { - len = snprintf(buf, sizeof(buf), + len = snprintf_noterm(buf, sizeof(buf), "stripe_unit=%u stripe_count=%u object_size=%u pool=", ci->i_layout.stripe_unit, ci->i_layout.stripe_count, ci->i_layout.object_size); total_len = len + strlen(pool_name); } else { - len = snprintf(buf, sizeof(buf), + len = snprintf_noterm(buf, sizeof(buf), "stripe_unit=%u stripe_count=%u object_size=%u pool=%lld", ci->i_layout.stripe_unit, ci->i_layout.stripe_count, ci->i_layout.object_size, (unsigned long long)pool); @@ -115,19 +115,19 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, static size_t ceph_vxattrcb_layout_stripe_unit(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%u", ci->i_layout.stripe_unit); + return snprintf_noterm(val, size, "%u", ci->i_layout.stripe_unit); } static size_t ceph_vxattrcb_layout_stripe_count(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%u", ci->i_layout.stripe_count); + return snprintf_noterm(val, size, "%u", ci->i_layout.stripe_count); } static size_t ceph_vxattrcb_layout_object_size(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%u", ci->i_layout.object_size); + return snprintf_noterm(val, size, "%u", ci->i_layout.object_size); } static size_t ceph_vxattrcb_layout_pool(struct ceph_inode_info *ci, @@ -142,9 +142,10 @@ static size_t ceph_vxattrcb_layout_pool(struct ceph_inode_info *ci, down_read(&osdc->lock); pool_name = ceph_pg_pool_name_by_id(osdc->osdmap, pool); if (pool_name) - ret = snprintf(val, size, "%s", pool_name); + ret = snprintf_noterm(val, size, "%s", pool_name); else - ret = snprintf(val, size, "%lld", (unsigned long long)pool); + ret = snprintf_noterm(val, size, "%lld", + (unsigned long long)pool); up_read(&osdc->lock); return ret; } @@ -155,7 +156,7 @@ static size_t ceph_vxattrcb_layout_pool_namespace(struct ceph_inode_info *ci, int ret = 0; struct ceph_string *ns = ceph_try_get_string(ci->i_layout.pool_ns); if (ns) { - ret = snprintf(val, size, "%.*s", (int)ns->len, ns->str); + ret = snprintf_noterm(val, size, "%.*s", (int)ns->len, ns->str); ceph_put_string(ns); } return ret; @@ -166,49 +167,50 @@ static size_t ceph_vxattrcb_layout_pool_namespace(struct ceph_inode_info *ci, static size_t ceph_vxattrcb_dir_entries(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%lld", ci->i_files + ci->i_subdirs); + return snprintf_noterm(val, size, "%lld", ci->i_files + ci->i_subdirs); } static size_t ceph_vxattrcb_dir_files(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%lld", ci->i_files); + return snprintf_noterm(val, size, "%lld", ci->i_files); } static size_t ceph_vxattrcb_dir_subdirs(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%lld", ci->i_subdirs); + return snprintf_noterm(val, size, "%lld", ci->i_subdirs); } static size_t ceph_vxattrcb_dir_rentries(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%lld", ci->i_rfiles + ci->i_rsubdirs); + return snprintf_noterm(val, size, "%lld", + ci->i_rfiles + ci->i_rsubdirs); } static size_t ceph_vxattrcb_dir_rfiles(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%lld", ci->i_rfiles); + return snprintf_noterm(val, size, "%lld", ci->i_rfiles); } static size_t ceph_vxattrcb_dir_rsubdirs(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%lld", ci->i_rsubdirs); + return snprintf_noterm(val, size, "%lld", ci->i_rsubdirs); } static size_t ceph_vxattrcb_dir_rbytes(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%lld", ci->i_rbytes); + return snprintf_noterm(val, size, "%lld", ci->i_rbytes); } static size_t ceph_vxattrcb_dir_rctime(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%lld.%09ld", ci->i_rctime.tv_sec, + return snprintf_noterm(val, size, "%lld.%09ld", ci->i_rctime.tv_sec, ci->i_rctime.tv_nsec); } @@ -221,7 +223,7 @@ static bool ceph_vxattrcb_dir_pin_exists(struct ceph_inode_info *ci) static size_t ceph_vxattrcb_dir_pin(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%d", (int)ci->i_dir_pin); + return snprintf_noterm(val, size, "%d", (int)ci->i_dir_pin); } /* quotas */ @@ -241,20 +243,20 @@ static bool ceph_vxattrcb_quota_exists(struct ceph_inode_info *ci) static size_t ceph_vxattrcb_quota(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "max_bytes=%llu max_files=%llu", + return snprintf_noterm(val, size, "max_bytes=%llu max_files=%llu", ci->i_max_bytes, ci->i_max_files); } static size_t ceph_vxattrcb_quota_max_bytes(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%llu", ci->i_max_bytes); + return snprintf_noterm(val, size, "%llu", ci->i_max_bytes); } static size_t ceph_vxattrcb_quota_max_files(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%llu", ci->i_max_files); + return snprintf_noterm(val, size, "%llu", ci->i_max_files); } /* snapshots */ @@ -266,7 +268,7 @@ static bool ceph_vxattrcb_snap_btime_exists(struct ceph_inode_info *ci) static size_t ceph_vxattrcb_snap_btime(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%lld.%09ld", ci->i_snap_btime.tv_sec, + return snprintf_noterm(val, size, "%lld.%09ld", ci->i_snap_btime.tv_sec, ci->i_snap_btime.tv_nsec); } From patchwork Fri Jun 14 13:46:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeffrey Layton X-Patchwork-Id: 10995365 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3D0A11395 for ; Fri, 14 Jun 2019 13:46:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2DA0127F90 for ; Fri, 14 Jun 2019 13:46:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1EDE6284DA; Fri, 14 Jun 2019 13:46:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CE7AE27F90 for ; Fri, 14 Jun 2019 13:46:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728486AbfFNNqd (ORCPT ); Fri, 14 Jun 2019 09:46:33 -0400 Received: from mail.kernel.org ([198.145.29.99]:41998 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728467AbfFNNqb (ORCPT ); Fri, 14 Jun 2019 09:46:31 -0400 Received: from tleilax.poochiereds.net (cpe-71-70-156-158.nc.res.rr.com [71.70.156.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 99FE821744; Fri, 14 Jun 2019 13:46:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1560519990; bh=5B3ZAjA7gOsgPJfhSPrsXHeb6ZPgy7neIaABFDQJVWI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PEF60wV5RZE/wH/xodj6n79XiNZOV5arIxxiyGabEGOSpHi7CGGBaeIBKrnYVi9go ZUZe+lb3cDwJZm3yYaGbkRaY3TYbd1Mq28nFlZp7HXDYhB+ymmZtLtyd2zQaduN50p 3vbdiTjDT+zB/lUtHyCI6t2XinzwhhvGPMXRcMko= From: Jeff Layton To: linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org Cc: akpm@linux-foundation.org, idryomov@gmail.com, zyan@redhat.com, sage@redhat.com, agruenba@redhat.com Subject: [PATCH 3/3] ceph: return -ERANGE if virtual xattr value didn't fit in buffer Date: Fri, 14 Jun 2019 09:46:25 -0400 Message-Id: <20190614134625.6870-4-jlayton@kernel.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190614134625.6870-1-jlayton@kernel.org> References: <20190614134625.6870-1-jlayton@kernel.org> MIME-Version: 1.0 Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The getxattr manpage states that we should return ERANGE if the destination buffer size is too small to hold the value. Signed-off-by: Jeff Layton --- fs/ceph/xattr.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index a1cd9613be98..e3246c27f2da 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c @@ -805,8 +805,11 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value, if (err) return err; err = -ENODATA; - if (!(vxattr->exists_cb && !vxattr->exists_cb(ci))) + if (!(vxattr->exists_cb && !vxattr->exists_cb(ci))) { err = vxattr->getxattr_cb(ci, value, size); + if (size && size < err) + err = -ERANGE; + } return err; }