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.

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