From: Richard Guenther Date: Wed, 20 Jan 2010 13:07:41 +0000 (+0000) Subject: re PR tree-optimization/41826 (invalid read in get_constraint_for_ptr_offset) X-Git-Tag: releases/gcc-4.3.5~213 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=911222c233f5e56adfed2fc63f702caadcf3ef1d;p=thirdparty%2Fgcc.git re PR tree-optimization/41826 (invalid read in get_constraint_for_ptr_offset) 2010-01-20 Richard Guenther PR tree-optimization/41826 * tree-ssa-structalias.c (get_constraint_for_ptr_offset): Avoid access to re-allocated vector fields. From-SVN: r156079 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cecb2e42fcbe..2ba1f5d1bef0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-01-20 Richard Guenther + + PR tree-optimization/41826 + * tree-ssa-structalias.c (get_constraint_for_ptr_offset): Avoid + access to re-allocated vector fields. + 2010-01-18 Uros Bizjak PR target/42774 diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 97c4fb32c73c..cf91502e6102 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -2657,7 +2657,7 @@ static void get_constraint_for_ptr_offset (tree ptr, tree offset, VEC (ce_s, heap) **results) { - struct constraint_expr *c; + struct constraint_expr c; unsigned int j, n; unsigned HOST_WIDE_INT rhsunitoffset, rhsoffset; @@ -2708,13 +2708,13 @@ get_constraint_for_ptr_offset (tree ptr, tree offset, for (j = 0; j < n; j++) { varinfo_t curr; - c = VEC_index (ce_s, *results, j); - curr = get_varinfo (c->var); + c = *VEC_index (ce_s, *results, j); + curr = get_varinfo (c.var); - if (c->type == ADDRESSOF + if (c.type == ADDRESSOF && !curr->is_full_var) { - varinfo_t temp, curr = get_varinfo (c->var); + varinfo_t temp, curr = get_varinfo (c.var); /* Search the sub-field which overlaps with the pointed-to offset. As we deal with positive offsets @@ -2750,15 +2750,17 @@ get_constraint_for_ptr_offset (tree ptr, tree offset, c2.offset = 0; VEC_safe_push (ce_s, heap, *results, &c2); } - c->var = temp->id; - c->offset = 0; + c.var = temp->id; + c.offset = 0; } - else if (c->type == ADDRESSOF + else if (c.type == ADDRESSOF /* If this varinfo represents a full variable just use it. */ && curr->is_full_var) - c->offset = 0; + c.offset = 0; else - c->offset = rhsoffset; + c.offset = rhsoffset; + + VEC_replace (ce_s, *results, j, &c); } }