2022-01-14 07:58:14

by Sergei Trofimovich

[permalink] [raw]
Subject: [PATCH] objtool: check: give big enough buffer for pv_ops

On gcc-12 build fails flagging possible buffer overflow:

check.c: In function 'validate_call':
check.c:2865:58: error: '%d' directive output may be truncated writing between 1 and 10 bytes into a region of size 9 [-Werror=format-truncation=]
2865 | snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
| ^~

I think it's a valid warning:

static char pvname[16];
int idx;
...
idx = (rel->addend / sizeof(void *));
snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);

we have only 7 chars for %d while it could take up to 9.

CC: Josh Poimboeuf <[email protected]>
CC: Peter Zijlstra <[email protected]>
---
tools/objtool/check.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 8c1931eab5f1..0fae132ea59f 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2852,7 +2852,7 @@ static inline bool func_uaccess_safe(struct symbol *func)

static inline const char *call_dest_name(struct instruction *insn)
{
- static char pvname[16];
+ static char pvname[32];
struct reloc *rel;
int idx;

--
2.34.1



2022-01-14 08:53:13

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [PATCH] objtool: check: give big enough buffer for pv_ops

On Fri, Jan 14, 2022 at 07:57:56AM +0000, Sergei Trofimovich wrote:
> On gcc-12 build fails flagging possible buffer overflow:
>
> check.c: In function 'validate_call':
> check.c:2865:58: error: '%d' directive output may be truncated writing between 1 and 10 bytes into a region of size 9 [-Werror=format-truncation=]
> 2865 | snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
> | ^~
>
> I think it's a valid warning:
>
> static char pvname[16];
> int idx;
> ...
> idx = (rel->addend / sizeof(void *));
> snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
>
> we have only 7 chars for %d while it could take up to 9.

Right, very unlikely to have that many pv_ops, but it doesn't hurt to
fix this.

Thanks!

2022-01-22 00:20:31

by Josh Poimboeuf

[permalink] [raw]
Subject: Re: [PATCH] objtool: check: give big enough buffer for pv_ops

On Fri, Jan 14, 2022 at 09:53:07AM +0100, Peter Zijlstra wrote:
> On Fri, Jan 14, 2022 at 07:57:56AM +0000, Sergei Trofimovich wrote:
> > On gcc-12 build fails flagging possible buffer overflow:
> >
> > check.c: In function 'validate_call':
> > check.c:2865:58: error: '%d' directive output may be truncated writing between 1 and 10 bytes into a region of size 9 [-Werror=format-truncation=]
> > 2865 | snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
> > | ^~
> >
> > I think it's a valid warning:
> >
> > static char pvname[16];
> > int idx;
> > ...
> > idx = (rel->addend / sizeof(void *));
> > snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
> >
> > we have only 7 chars for %d while it could take up to 9.
>
> Right, very unlikely to have that many pv_ops, but it doesn't hurt to
> fix this.
>
> Thanks!

Alternatively, 'idx' could just be unsigned char, since pv_ops only has
about ~80 entries max, but either way works for me. I'll queue it up.

--
Josh

2022-01-22 00:20:31

by Josh Poimboeuf

[permalink] [raw]
Subject: Re: [PATCH] objtool: check: give big enough buffer for pv_ops

On Thu, Jan 20, 2022 at 02:58:13PM -0800, Josh Poimboeuf wrote:
> On Fri, Jan 14, 2022 at 09:53:07AM +0100, Peter Zijlstra wrote:
> > On Fri, Jan 14, 2022 at 07:57:56AM +0000, Sergei Trofimovich wrote:
> > > On gcc-12 build fails flagging possible buffer overflow:
> > >
> > > check.c: In function 'validate_call':
> > > check.c:2865:58: error: '%d' directive output may be truncated writing between 1 and 10 bytes into a region of size 9 [-Werror=format-truncation=]
> > > 2865 | snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
> > > | ^~
> > >
> > > I think it's a valid warning:
> > >
> > > static char pvname[16];
> > > int idx;
> > > ...
> > > idx = (rel->addend / sizeof(void *));
> > > snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
> > >
> > > we have only 7 chars for %d while it could take up to 9.
> >
> > Right, very unlikely to have that many pv_ops, but it doesn't hurt to
> > fix this.
> >
> > Thanks!
>
> Alternatively, 'idx' could just be unsigned char, since pv_ops only has
> about ~80 entries max, but either way works for me. I'll queue it up.

Sergei, can you send a v2 with a valid Signed-off-by tag?

--
Josh

2022-01-22 00:25:43

by Sergei Trofimovich

[permalink] [raw]
Subject: [PATCH v2] objtool: check: give big enough buffer for pv_ops

On gcc-12 build fails flagging possible buffer overflow:

check.c: In function 'validate_call':
check.c:2865:58: error: '%d' directive output may be truncated writing between 1 and 10 bytes into a region of size 9 [-Werror=format-truncation=]
2865 | snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
| ^~

I think it's a valid warning:

static char pvname[16];
int idx;
...
idx = (rel->addend / sizeof(void *));
snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);

we have only 7 chars for %d while it could take up to 9.

CC: Josh Poimboeuf <[email protected]>
CC: Peter Zijlstra <[email protected]>
Signed-off-by: Sergei Trofimovich <[email protected]>
---
Change since v1: added missing S-O-B.
tools/objtool/check.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index c2d2ab9a2861..f5bed94e4558 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2854,7 +2854,7 @@ static inline bool func_uaccess_safe(struct symbol *func)

static inline const char *call_dest_name(struct instruction *insn)
{
- static char pvname[16];
+ static char pvname[32];
struct reloc *rel;
int idx;

--
2.34.1

Subject: [tip: objtool/urgent] objtool: Fix truncated string warning

The following commit has been merged into the objtool/urgent branch of tip:

Commit-ID: 82880283d7fcd0a1d20964a56d6d1a5cc0df0713
Gitweb: https://git.kernel.org/tip/82880283d7fcd0a1d20964a56d6d1a5cc0df0713
Author: Sergei Trofimovich <[email protected]>
AuthorDate: Thu, 20 Jan 2022 23:37:48
Committer: Josh Poimboeuf <[email protected]>
CommitterDate: Mon, 24 Jan 2022 10:09:06 -08:00

objtool: Fix truncated string warning

On GCC 12, the build fails due to a possible truncated string:

check.c: In function 'validate_call':
check.c:2865:58: error: '%d' directive output may be truncated writing between 1 and 10 bytes into a region of size 9 [-Werror=format-truncation=]
2865 | snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
| ^~

In theory it's a valid bug:

static char pvname[16];
int idx;
...
idx = (rel->addend / sizeof(void *));
snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);

There are only 7 chars for %d while it could take up to 9, so the
printed "pv_ops[%d]" string could get truncated.

In reality the bug should never happen, because pv_ops only has ~80
entries, so 7 chars for the integer is more than enough. Still, it's
worth fixing. Bump the buffer size by 2 bytes to silence the warning.

[ jpoimboe: changed size to 19; massaged changelog ]

Fixes: db2b0c5d7b6f ("objtool: Support pv_opsindirect calls for noinstr")
Reported-by: Adam Borowski <[email protected]>
Reported-by: Martin Liška <[email protected]>
Signed-off-by: Sergei Trofimovich <[email protected]>
Signed-off-by: Josh Poimboeuf <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
---
tools/objtool/check.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index c2d2ab9..7c33ec6 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2854,7 +2854,7 @@ static inline bool func_uaccess_safe(struct symbol *func)

static inline const char *call_dest_name(struct instruction *insn)
{
- static char pvname[16];
+ static char pvname[19];
struct reloc *rel;
int idx;