This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] gcc/ubsan.c: Extend 'pretty_name' space to avoid memory overflow
- From: Marek Polacek <polacek at redhat dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Chen Gang <gang dot chen dot 5i5j at gmail dot com>, Jeff Law <law at redhat dot com>, "Joseph S. Myers" <joseph at codesourcery dot com>, rth at redhat dot com, gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 17 Nov 2014 09:15:31 +0100
- Subject: Re: [PATCH] gcc/ubsan.c: Extend 'pretty_name' space to avoid memory overflow
- Authentication-results: sourceware.org; auth=none
- References: <546927DA dot 4000804 at gmail dot com> <20141117071632 dot GC14744 at redhat dot com> <20141117073819 dot GB4079 at tucnak dot redhat dot com>
On Mon, Nov 17, 2014 at 08:38:19AM +0100, Jakub Jelinek wrote:
> On Mon, Nov 17, 2014 at 08:16:32AM +0100, Marek Polacek wrote:
> > On Mon, Nov 17, 2014 at 06:40:26AM +0800, Chen Gang wrote:
> > > According to the next code, 'pretty_name' may need additional bytes more
> > > than 16. For simplify thinking and being extensible in future, extent it
> > > to 256 bytes, directly.
> >
> > I think + 128 bytes should be enough for everyone.
>
> I disagree.
> Consider:
> typedef char A[1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1];
> A a;
>
> int foo (int j)
> {
> a[j][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] = 1;
> }
> You need 1159 bytes in that case. Easily to construct testcase that needs
> arbitrary amount.
Ah, I haven't looked at the UBSAN_PRINT_ARRAY case.
> I think easiest would be to rewrite the code so that it uses pretty_printer
> to construct the string, grep asan.c for asan_pp . Or obstacks, but you don't
> have a printer to print integers into it easily.
> if (dom && TREE_CODE (TYPE_MAX_VALUE (dom)) == INTEGER_CST)
> pos += sprintf (&pretty_name[pos], HOST_WIDE_INT_PRINT_DEC,
> tree_to_uhwi (TYPE_MAX_VALUE (dom)) + 1);
> else
> /* ??? We can't determine the variable name; print VLA unspec. */
> pretty_name[pos++] = '*';
> looks wrong anyway, as not all integers fit into uhwi.
> Guess you could use wide_int to add 1 there and pp_wide_int.
Ok.
Marek