All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] vsprintf: Fix potential unaligned access
@ 2022-01-24 14:42 Andy Shevchenko
  2022-01-24 14:42 ` [PATCH v2 2/2] vsprintf: Move space out of string literals in fourcc_string() Andy Shevchenko
  0 siblings, 1 reply; 6+ messages in thread
From: Andy Shevchenko @ 2022-01-24 14:42 UTC (permalink / raw)
  To: Petr Mladek, linux-kernel
  Cc: Steven Rostedt, Sergey Senozhatsky, Andy Shevchenko,
	Rasmus Villemoes, Sakari Ailus

The %p4cc specifier in some cases might get an unaligned pointer.
Due to this we need to make copy to local variable once to avoid
potential crashes on some architectures due to improper access.

Fixes: af612e43de6d ("lib/vsprintf: Add support for printing V4L2 and DRM fourccs")
Cc: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
---
v2: added Petr's tag
 lib/vsprintf.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 61528094ec87..4e8f3e9acb99 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -49,6 +49,7 @@
 
 #include <asm/page.h>		/* for PAGE_SIZE */
 #include <asm/byteorder.h>	/* cpu_to_le16 */
+#include <asm/unaligned.h>
 
 #include <linux/string_helpers.h>
 #include "kstrtox.h"
@@ -1762,7 +1763,7 @@ char *fourcc_string(char *buf, char *end, const u32 *fourcc,
 	char output[sizeof("0123 little-endian (0x01234567)")];
 	char *p = output;
 	unsigned int i;
-	u32 val;
+	u32 orig, val;
 
 	if (fmt[1] != 'c' || fmt[2] != 'c')
 		return error_string(buf, end, "(%p4?)", spec);
@@ -1770,21 +1771,22 @@ char *fourcc_string(char *buf, char *end, const u32 *fourcc,
 	if (check_pointer(&buf, end, fourcc, spec))
 		return buf;
 
-	val = *fourcc & ~BIT(31);
+	orig = get_unaligned(fourcc);
+	val = orig & ~BIT(31);
 
-	for (i = 0; i < sizeof(*fourcc); i++) {
+	for (i = 0; i < sizeof(u32); i++) {
 		unsigned char c = val >> (i * 8);
 
 		/* Print non-control ASCII characters as-is, dot otherwise */
 		*p++ = isascii(c) && isprint(c) ? c : '.';
 	}
 
-	strcpy(p, *fourcc & BIT(31) ? " big-endian" : " little-endian");
+	strcpy(p, orig & BIT(31) ? " big-endian" : " little-endian");
 	p += strlen(p);
 
 	*p++ = ' ';
 	*p++ = '(';
-	p = special_hex_number(p, output + sizeof(output) - 2, *fourcc, sizeof(u32));
+	p = special_hex_number(p, output + sizeof(output) - 2, orig, sizeof(u32));
 	*p++ = ')';
 	*p = '\0';
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/2] vsprintf: Move space out of string literals in fourcc_string()
  2022-01-24 14:42 [PATCH v2 1/2] vsprintf: Fix potential unaligned access Andy Shevchenko
@ 2022-01-24 14:42 ` Andy Shevchenko
  2022-01-24 19:23   ` kernel test robot
                     ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Andy Shevchenko @ 2022-01-24 14:42 UTC (permalink / raw)
  To: Petr Mladek, linux-kernel
  Cc: Steven Rostedt, Sergey Senozhatsky, Andy Shevchenko,
	Rasmus Villemoes, Sakari Ailus

The literals "big-endian" and "little-endian" may be potentially
occurred in other places. Dropping space allows linker to
"compress" them by using only a single copy.

Rasmus suggested, while at it, replacing strcpy() + strlen() by
p = stpcpy(), which is done here as well.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
v2: added Sakari's tag, replaced APIs as mentioned in the commit (Rasmus)
 lib/vsprintf.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 4e8f3e9acb99..e2a1d89f1a5c 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -1781,8 +1781,8 @@ char *fourcc_string(char *buf, char *end, const u32 *fourcc,
 		*p++ = isascii(c) && isprint(c) ? c : '.';
 	}
 
-	strcpy(p, orig & BIT(31) ? " big-endian" : " little-endian");
-	p += strlen(p);
+	*p++ = ' ';
+	p = stpcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
 
 	*p++ = ' ';
 	*p++ = '(';
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] vsprintf: Move space out of string literals in fourcc_string()
  2022-01-24 14:42 ` [PATCH v2 2/2] vsprintf: Move space out of string literals in fourcc_string() Andy Shevchenko
@ 2022-01-24 19:23   ` kernel test robot
  2022-01-24 19:23     ` kernel test robot
  2022-01-24 19:23   ` kernel test robot
  2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2022-01-24 19:23 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 6050 bytes --]

Hi Andy,

I love your patch! Yet something to improve:

[auto build test ERROR on linux/master]
[also build test ERROR on linus/master v5.17-rc1 next-20220124]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Andy-Shevchenko/vsprintf-Fix-potential-unaligned-access/20220124-224420
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 2c271fe77d52a0555161926c232cd5bc07178b39
config: arc-randconfig-r026-20220124 (https://download.01.org/0day-ci/archive/20220125/202201250147.uYccwqwy-lkp(a)intel.com/config)
compiler: arceb-elf-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/f1895edcabdc5dae0528ffff9c3cb665a937223d
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Andy-Shevchenko/vsprintf-Fix-potential-unaligned-access/20220124-224420
        git checkout f1895edcabdc5dae0528ffff9c3cb665a937223d
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arc SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All error/warnings (new ones prefixed by >>):

   lib/vsprintf.c: In function 'va_format':
   lib/vsprintf.c:1695:9: warning: function 'va_format' might be a candidate for 'gnu_printf' format attribute [-Wsuggest-attribute=format]
    1695 |         buf += vsnprintf(buf, end > buf ? end - buf : 0, va_fmt->fmt, va);
         |         ^~~
   lib/vsprintf.c: In function 'fourcc_string':
>> lib/vsprintf.c:1794:13: error: implicit declaration of function 'stpcpy'; did you mean 'strcpy'? [-Werror=implicit-function-declaration]
    1794 |         p = stpcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
         |             ^~~~~~
         |             strcpy
>> lib/vsprintf.c:1794:11: warning: assignment to 'char *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
    1794 |         p = stpcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
         |           ^
   cc1: some warnings being treated as errors


vim +1794 lib/vsprintf.c

  1685	
  1686	static char *va_format(char *buf, char *end, struct va_format *va_fmt,
  1687			       struct printf_spec spec, const char *fmt)
  1688	{
  1689		va_list va;
  1690	
  1691		if (check_pointer(&buf, end, va_fmt, spec))
  1692			return buf;
  1693	
  1694		va_copy(va, *va_fmt->va);
> 1695		buf += vsnprintf(buf, end > buf ? end - buf : 0, va_fmt->fmt, va);
  1696		va_end(va);
  1697	
  1698		return buf;
  1699	}
  1700	
  1701	static noinline_for_stack
  1702	char *uuid_string(char *buf, char *end, const u8 *addr,
  1703			  struct printf_spec spec, const char *fmt)
  1704	{
  1705		char uuid[UUID_STRING_LEN + 1];
  1706		char *p = uuid;
  1707		int i;
  1708		const u8 *index = uuid_index;
  1709		bool uc = false;
  1710	
  1711		if (check_pointer(&buf, end, addr, spec))
  1712			return buf;
  1713	
  1714		switch (*(++fmt)) {
  1715		case 'L':
  1716			uc = true;
  1717			fallthrough;
  1718		case 'l':
  1719			index = guid_index;
  1720			break;
  1721		case 'B':
  1722			uc = true;
  1723			break;
  1724		}
  1725	
  1726		for (i = 0; i < 16; i++) {
  1727			if (uc)
  1728				p = hex_byte_pack_upper(p, addr[index[i]]);
  1729			else
  1730				p = hex_byte_pack(p, addr[index[i]]);
  1731			switch (i) {
  1732			case 3:
  1733			case 5:
  1734			case 7:
  1735			case 9:
  1736				*p++ = '-';
  1737				break;
  1738			}
  1739		}
  1740	
  1741		*p = 0;
  1742	
  1743		return string_nocheck(buf, end, uuid, spec);
  1744	}
  1745	
  1746	static noinline_for_stack
  1747	char *netdev_bits(char *buf, char *end, const void *addr,
  1748			  struct printf_spec spec,  const char *fmt)
  1749	{
  1750		unsigned long long num;
  1751		int size;
  1752	
  1753		if (check_pointer(&buf, end, addr, spec))
  1754			return buf;
  1755	
  1756		switch (fmt[1]) {
  1757		case 'F':
  1758			num = *(const netdev_features_t *)addr;
  1759			size = sizeof(netdev_features_t);
  1760			break;
  1761		default:
  1762			return error_string(buf, end, "(%pN?)", spec);
  1763		}
  1764	
  1765		return special_hex_number(buf, end, num, size);
  1766	}
  1767	
  1768	static noinline_for_stack
  1769	char *fourcc_string(char *buf, char *end, const u32 *fourcc,
  1770			    struct printf_spec spec, const char *fmt)
  1771	{
  1772		char output[sizeof("0123 little-endian (0x01234567)")];
  1773		char *p = output;
  1774		unsigned int i;
  1775		u32 orig, val;
  1776	
  1777		if (fmt[1] != 'c' || fmt[2] != 'c')
  1778			return error_string(buf, end, "(%p4?)", spec);
  1779	
  1780		if (check_pointer(&buf, end, fourcc, spec))
  1781			return buf;
  1782	
  1783		orig = get_unaligned(fourcc);
  1784		val = orig & ~BIT(31);
  1785	
  1786		for (i = 0; i < sizeof(u32); i++) {
  1787			unsigned char c = val >> (i * 8);
  1788	
  1789			/* Print non-control ASCII characters as-is, dot otherwise */
  1790			*p++ = isascii(c) && isprint(c) ? c : '.';
  1791		}
  1792	
  1793		*p++ = ' ';
> 1794		p = stpcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
  1795	
  1796		*p++ = ' ';
  1797		*p++ = '(';
  1798		p = special_hex_number(p, output + sizeof(output) - 2, orig, sizeof(u32));
  1799		*p++ = ')';
  1800		*p = '\0';
  1801	
  1802		return string(buf, end, output, spec);
  1803	}
  1804	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] vsprintf: Move space out of string literals in fourcc_string()
  2022-01-24 14:42 ` [PATCH v2 2/2] vsprintf: Move space out of string literals in fourcc_string() Andy Shevchenko
@ 2022-01-24 19:23     ` kernel test robot
  2022-01-24 19:23     ` kernel test robot
  2022-01-24 19:23   ` kernel test robot
  2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2022-01-24 19:23 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: llvm, kbuild-all

Hi Andy,

I love your patch! Yet something to improve:

[auto build test ERROR on linux/master]
[also build test ERROR on linus/master v5.17-rc1 next-20220124]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Andy-Shevchenko/vsprintf-Fix-potential-unaligned-access/20220124-224420
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 2c271fe77d52a0555161926c232cd5bc07178b39
config: riscv-randconfig-r042-20220124 (https://download.01.org/0day-ci/archive/20220125/202201250142.DtHQRlOS-lkp@intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 2e58a18910867ba6795066e044293e6daf89edf5)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # https://github.com/0day-ci/linux/commit/f1895edcabdc5dae0528ffff9c3cb665a937223d
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Andy-Shevchenko/vsprintf-Fix-potential-unaligned-access/20220124-224420
        git checkout f1895edcabdc5dae0528ffff9c3cb665a937223d
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> lib/vsprintf.c:1794:6: error: implicitly declaring library function 'stpcpy' with type 'char *(char *, const char *)' [-Werror,-Wimplicit-function-declaration]
           p = stpcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
               ^
   lib/vsprintf.c:1794:6: note: include the header <string.h> or explicitly provide a declaration for 'stpcpy'
   1 error generated.


vim +1794 lib/vsprintf.c

  1767	
  1768	static noinline_for_stack
  1769	char *fourcc_string(char *buf, char *end, const u32 *fourcc,
  1770			    struct printf_spec spec, const char *fmt)
  1771	{
  1772		char output[sizeof("0123 little-endian (0x01234567)")];
  1773		char *p = output;
  1774		unsigned int i;
  1775		u32 orig, val;
  1776	
  1777		if (fmt[1] != 'c' || fmt[2] != 'c')
  1778			return error_string(buf, end, "(%p4?)", spec);
  1779	
  1780		if (check_pointer(&buf, end, fourcc, spec))
  1781			return buf;
  1782	
  1783		orig = get_unaligned(fourcc);
  1784		val = orig & ~BIT(31);
  1785	
  1786		for (i = 0; i < sizeof(u32); i++) {
  1787			unsigned char c = val >> (i * 8);
  1788	
  1789			/* Print non-control ASCII characters as-is, dot otherwise */
  1790			*p++ = isascii(c) && isprint(c) ? c : '.';
  1791		}
  1792	
  1793		*p++ = ' ';
> 1794		p = stpcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
  1795	
  1796		*p++ = ' ';
  1797		*p++ = '(';
  1798		p = special_hex_number(p, output + sizeof(output) - 2, orig, sizeof(u32));
  1799		*p++ = ')';
  1800		*p = '\0';
  1801	
  1802		return string(buf, end, output, spec);
  1803	}
  1804	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] vsprintf: Move space out of string literals in fourcc_string()
@ 2022-01-24 19:23     ` kernel test robot
  0 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2022-01-24 19:23 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 3554 bytes --]

Hi Andy,

I love your patch! Yet something to improve:

[auto build test ERROR on linux/master]
[also build test ERROR on linus/master v5.17-rc1 next-20220124]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Andy-Shevchenko/vsprintf-Fix-potential-unaligned-access/20220124-224420
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 2c271fe77d52a0555161926c232cd5bc07178b39
config: riscv-randconfig-r042-20220124 (https://download.01.org/0day-ci/archive/20220125/202201250142.DtHQRlOS-lkp(a)intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 2e58a18910867ba6795066e044293e6daf89edf5)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # https://github.com/0day-ci/linux/commit/f1895edcabdc5dae0528ffff9c3cb665a937223d
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Andy-Shevchenko/vsprintf-Fix-potential-unaligned-access/20220124-224420
        git checkout f1895edcabdc5dae0528ffff9c3cb665a937223d
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> lib/vsprintf.c:1794:6: error: implicitly declaring library function 'stpcpy' with type 'char *(char *, const char *)' [-Werror,-Wimplicit-function-declaration]
           p = stpcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
               ^
   lib/vsprintf.c:1794:6: note: include the header <string.h> or explicitly provide a declaration for 'stpcpy'
   1 error generated.


vim +1794 lib/vsprintf.c

  1767	
  1768	static noinline_for_stack
  1769	char *fourcc_string(char *buf, char *end, const u32 *fourcc,
  1770			    struct printf_spec spec, const char *fmt)
  1771	{
  1772		char output[sizeof("0123 little-endian (0x01234567)")];
  1773		char *p = output;
  1774		unsigned int i;
  1775		u32 orig, val;
  1776	
  1777		if (fmt[1] != 'c' || fmt[2] != 'c')
  1778			return error_string(buf, end, "(%p4?)", spec);
  1779	
  1780		if (check_pointer(&buf, end, fourcc, spec))
  1781			return buf;
  1782	
  1783		orig = get_unaligned(fourcc);
  1784		val = orig & ~BIT(31);
  1785	
  1786		for (i = 0; i < sizeof(u32); i++) {
  1787			unsigned char c = val >> (i * 8);
  1788	
  1789			/* Print non-control ASCII characters as-is, dot otherwise */
  1790			*p++ = isascii(c) && isprint(c) ? c : '.';
  1791		}
  1792	
  1793		*p++ = ' ';
> 1794		p = stpcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
  1795	
  1796		*p++ = ' ';
  1797		*p++ = '(';
  1798		p = special_hex_number(p, output + sizeof(output) - 2, orig, sizeof(u32));
  1799		*p++ = ')';
  1800		*p = '\0';
  1801	
  1802		return string(buf, end, output, spec);
  1803	}
  1804	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] vsprintf: Move space out of string literals in fourcc_string()
  2022-01-24 14:42 ` [PATCH v2 2/2] vsprintf: Move space out of string literals in fourcc_string() Andy Shevchenko
  2022-01-24 19:23   ` kernel test robot
  2022-01-24 19:23     ` kernel test robot
@ 2022-01-24 19:23   ` kernel test robot
  2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2022-01-24 19:23 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 5908 bytes --]

Hi Andy,

I love your patch! Perhaps something to improve:

[auto build test WARNING on linux/master]
[also build test WARNING on linus/master v5.17-rc1 next-20220124]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Andy-Shevchenko/vsprintf-Fix-potential-unaligned-access/20220124-224420
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 2c271fe77d52a0555161926c232cd5bc07178b39
config: arm-randconfig-r022-20220124 (https://download.01.org/0day-ci/archive/20220125/202201250258.qVWkKB2I-lkp(a)intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/f1895edcabdc5dae0528ffff9c3cb665a937223d
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Andy-Shevchenko/vsprintf-Fix-potential-unaligned-access/20220124-224420
        git checkout f1895edcabdc5dae0528ffff9c3cb665a937223d
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arm SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   lib/vsprintf.c: In function 'va_format':
   lib/vsprintf.c:1695:9: warning: function 'va_format' might be a candidate for 'gnu_printf' format attribute [-Wsuggest-attribute=format]
    1695 |         buf += vsnprintf(buf, end > buf ? end - buf : 0, va_fmt->fmt, va);
         |         ^~~
   lib/vsprintf.c: In function 'fourcc_string':
   lib/vsprintf.c:1794:13: error: implicit declaration of function 'stpcpy' [-Werror=implicit-function-declaration]
    1794 |         p = stpcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
         |             ^~~~~~
>> lib/vsprintf.c:1794:13: warning: incompatible implicit declaration of built-in function 'stpcpy' [-Wbuiltin-declaration-mismatch]
   cc1: some warnings being treated as errors


vim +/stpcpy +1794 lib/vsprintf.c

  1685	
  1686	static char *va_format(char *buf, char *end, struct va_format *va_fmt,
  1687			       struct printf_spec spec, const char *fmt)
  1688	{
  1689		va_list va;
  1690	
  1691		if (check_pointer(&buf, end, va_fmt, spec))
  1692			return buf;
  1693	
  1694		va_copy(va, *va_fmt->va);
> 1695		buf += vsnprintf(buf, end > buf ? end - buf : 0, va_fmt->fmt, va);
  1696		va_end(va);
  1697	
  1698		return buf;
  1699	}
  1700	
  1701	static noinline_for_stack
  1702	char *uuid_string(char *buf, char *end, const u8 *addr,
  1703			  struct printf_spec spec, const char *fmt)
  1704	{
  1705		char uuid[UUID_STRING_LEN + 1];
  1706		char *p = uuid;
  1707		int i;
  1708		const u8 *index = uuid_index;
  1709		bool uc = false;
  1710	
  1711		if (check_pointer(&buf, end, addr, spec))
  1712			return buf;
  1713	
  1714		switch (*(++fmt)) {
  1715		case 'L':
  1716			uc = true;
  1717			fallthrough;
  1718		case 'l':
  1719			index = guid_index;
  1720			break;
  1721		case 'B':
  1722			uc = true;
  1723			break;
  1724		}
  1725	
  1726		for (i = 0; i < 16; i++) {
  1727			if (uc)
  1728				p = hex_byte_pack_upper(p, addr[index[i]]);
  1729			else
  1730				p = hex_byte_pack(p, addr[index[i]]);
  1731			switch (i) {
  1732			case 3:
  1733			case 5:
  1734			case 7:
  1735			case 9:
  1736				*p++ = '-';
  1737				break;
  1738			}
  1739		}
  1740	
  1741		*p = 0;
  1742	
  1743		return string_nocheck(buf, end, uuid, spec);
  1744	}
  1745	
  1746	static noinline_for_stack
  1747	char *netdev_bits(char *buf, char *end, const void *addr,
  1748			  struct printf_spec spec,  const char *fmt)
  1749	{
  1750		unsigned long long num;
  1751		int size;
  1752	
  1753		if (check_pointer(&buf, end, addr, spec))
  1754			return buf;
  1755	
  1756		switch (fmt[1]) {
  1757		case 'F':
  1758			num = *(const netdev_features_t *)addr;
  1759			size = sizeof(netdev_features_t);
  1760			break;
  1761		default:
  1762			return error_string(buf, end, "(%pN?)", spec);
  1763		}
  1764	
  1765		return special_hex_number(buf, end, num, size);
  1766	}
  1767	
  1768	static noinline_for_stack
  1769	char *fourcc_string(char *buf, char *end, const u32 *fourcc,
  1770			    struct printf_spec spec, const char *fmt)
  1771	{
  1772		char output[sizeof("0123 little-endian (0x01234567)")];
  1773		char *p = output;
  1774		unsigned int i;
  1775		u32 orig, val;
  1776	
  1777		if (fmt[1] != 'c' || fmt[2] != 'c')
  1778			return error_string(buf, end, "(%p4?)", spec);
  1779	
  1780		if (check_pointer(&buf, end, fourcc, spec))
  1781			return buf;
  1782	
  1783		orig = get_unaligned(fourcc);
  1784		val = orig & ~BIT(31);
  1785	
  1786		for (i = 0; i < sizeof(u32); i++) {
  1787			unsigned char c = val >> (i * 8);
  1788	
  1789			/* Print non-control ASCII characters as-is, dot otherwise */
  1790			*p++ = isascii(c) && isprint(c) ? c : '.';
  1791		}
  1792	
  1793		*p++ = ' ';
> 1794		p = stpcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
  1795	
  1796		*p++ = ' ';
  1797		*p++ = '(';
  1798		p = special_hex_number(p, output + sizeof(output) - 2, orig, sizeof(u32));
  1799		*p++ = ')';
  1800		*p = '\0';
  1801	
  1802		return string(buf, end, output, spec);
  1803	}
  1804	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-01-24 19:24 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-24 14:42 [PATCH v2 1/2] vsprintf: Fix potential unaligned access Andy Shevchenko
2022-01-24 14:42 ` [PATCH v2 2/2] vsprintf: Move space out of string literals in fourcc_string() Andy Shevchenko
2022-01-24 19:23   ` kernel test robot
2022-01-24 19:23   ` kernel test robot
2022-01-24 19:23     ` kernel test robot
2022-01-24 19:23   ` kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.