On Wed, Dec 21, 2016 at 9:26 AM, Maxim Uvarov <maxim.uva...@linaro.org> wrote:
> On debian jessie gcc unable to compile current code
> with error:
> odp_packet.c: In function 'odp_packet_trunc_head':
> odp_packet.c:314:46: error: array subscript is above array bounds 
> [-Werror=array-bounds]
> to->buf_hdr.seg[i].len = from->buf_hdr.seg[num + i].len;
>
> The problem is that it breaks compilation only on .len line:
> for (i = 0; i < num; i++) {
>         to->buf_hdr.seg[i].hdr = from->buf_hdr.seg[num + i].hdr;
>         to->buf_hdr.seg[i].data = from->buf_hdr.seg[num + i].data;
>         to->buf_hdr.seg[i].len = from->buf_hdr.seg[num + i].len;
> }
>
> If that line is commented out compilation passes. If lines are reordered
> than compilation also passes. Because there is no warning on .hdr and .data
> it looks like compiler error. Additional check for preconfigured value
> is workaround to that situation.

If reordering solves the problem then why is that not the preferred
solution since that doesn't add any pathlength? These statements are
independent so it shouldn't matter. I would put a comment in
referencing the bug to give future maintainers a caution about this.

>
> Signed-off-by: Maxim Uvarov <maxim.uva...@linaro.org>
> ---
>  platform/linux-generic/odp_packet.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/platform/linux-generic/odp_packet.c 
> b/platform/linux-generic/odp_packet.c
> index 0d3fd05..f3e0a12 100644
> --- a/platform/linux-generic/odp_packet.c
> +++ b/platform/linux-generic/odp_packet.c
> @@ -309,6 +309,8 @@ static inline void copy_num_segs(odp_packet_hdr_t *to, 
> odp_packet_hdr_t *from,
>         int i;
>
>         for (i = 0; i < num; i++) {
> +               if (odp_unlikely((num + i) >= CONFIG_PACKET_MAX_SEGS))
> +                       ODP_ABORT("packet segmenation error\n");
>                 to->buf_hdr.seg[i].hdr  = from->buf_hdr.seg[num + i].hdr;
>                 to->buf_hdr.seg[i].data = from->buf_hdr.seg[num + i].data;
>                 to->buf_hdr.seg[i].len  = from->buf_hdr.seg[num + i].len;
> --
> 2.7.1.250.gff4ea60
>

Reply via email to