On 03/27/15 19:21, Mike Holmes wrote:
ODP agreed that only critical bugs hold the release at the last minuet, this issue is not even a bug at this point - it should be so that users are aware of the issue.

If this really is affecting a critical product a bug should be created with the rational for this to be in 1.0.2 and we can break our rules and work overtime testing it again - last minuet changes require effort.

In this case only local developer tests might be affected - no one has noticed this yet, the fix is available on the list, it is likely to be in master on Monday and will be in 1.0.3 in two weeks, given that I cant see the urgency yet.

I agree we want the fix in, but this has not even been on the list 24 hours which is a second gating item for ODP.

+1 no rush with such changes. That will be in 1.0.3

Maxim.





On 27 March 2015 at 10:33, Bill Fischofer <[email protected] <mailto:[email protected]>> wrote:

    Silent memory corruption is a problem even if specific tests don't
    reveal it.  Due to the pool memory layout, the corruption is
    writing something into some other buffer, which may or may not be
    allocated.  That's always a recipe for sudden and confusing
    failures so I'd view this as a critical bug.

    On Fri, Mar 27, 2015 at 9:11 AM, Stuart Haslam
    <[email protected] <mailto:[email protected]>> wrote:

        It doesn't break non-jumbo tests, in fact all tests pass and I
        didn't *notice* any adverse effects, I found the issue by
        inspection.

        The problem is that when generating non-jumbo packets (which
        most of the tests do) the magic2 marker is written beyond the
        end of a calloc'd block into un-allocated memory. The receiver
        doesn't check magic2 for non-jumbo packets.

        The issue could be trivially avoided with the simpler change
        below, but I wasn't happy with that as we'd still have a
        pointer to a structure that's much larger than the memory
        allocated.

        Stuart.

        diff --git a/test/validation/odp_pktio.c
        b/test/validation/odp_pktio.c
        index e022c33..5ea45e4 100644
        --- a/test/validation/odp_pktio.c
        +++ b/test/validation/odp_pktio.c
        @@ -95,7 +95,8 @@ static int pktio_pkt_set_seq(odp_packet_t pkt)
                CU_ASSERT_FATAL(data != NULL);
                data->head.magic = TEST_SEQ_MAGIC;
        -       data->magic2 = TEST_SEQ_MAGIC;
        +       if (test_jumbo)
        +               data->magic2 = TEST_SEQ_MAGIC;
                data->head.seq   = tstseq;
                odp_packet_copydata_in(pkt, l4_off+ODPH_UDPHDR_LEN,


        On 27 March 2015 at 13:15, Bill Fischofer
        <[email protected] <mailto:[email protected]>>
        wrote:

            If I understand Stuart's patch correctly, he's saying that
            the introduction of jumbo frame support in v1.0.1 broke
            non-jumbo processing. Since that's a critical function I'd
            think we'd want to fix that bug ASAP in v1.0.2.

            On Fri, Mar 27, 2015 at 7:04 AM, Mike Holmes
            <[email protected] <mailto:[email protected]>>
            wrote:



                On 26 March 2015 at 17:14, Bill Fischofer
                <[email protected]
                <mailto:[email protected]>> wrote:

                    Sounds like we should hold v1.0.2 for this bug
                    fix? Maxim: I think this review is properly yours
                    as you did the jumbo frame add for v1.0.1.


                Bill can you describe the use case than for holding,
                if we have a strong case for it then we can hold.
                Normal procedure is that whatever makes the cut is
                there and the release goes out unless there is a
                regression introduced.


                    On Thu, Mar 26, 2015 at 12:52 PM, Stuart Haslam
                    <[email protected]
                    <mailto:[email protected]>> wrote:

                        A magic number, used to ensure jumbo frames
                        are transmitted and received
                        in full, is written to the end of a packet
                        buffer at a fixed offset of
                        9170 bytes. However for non-jumbo tests this
                        is way beyond the end of
                        the allocated buffer.

                        Signed-off-by: Stuart Haslam
                        <[email protected]
                        <mailto:[email protected]>>
                        ---
                         test/validation/odp_pktio.c | 84
                        ++++++++++++++++++++++++++++-----------------
                         1 file changed, 52 insertions(+), 32 deletions(-)

                        diff --git a/test/validation/odp_pktio.c
                        b/test/validation/odp_pktio.c
                        index e022c33..d653da4 100644
                        --- a/test/validation/odp_pktio.c
                        +++ b/test/validation/odp_pktio.c
                        @@ -44,7 +44,6 @@ typedef struct ODP_PACKED {

                         /** structure of test packet UDP payload */
                         typedef struct ODP_PACKED {
                        -  pkt_head_t head;
                                char data[PKT_BUF_JUMBO_MAX_PAYLOAD -
                        sizeof(pkt_head_t) -
                        sizeof(uint32be_t)];
                        uint32be_t magic2;
                        @@ -74,33 +73,47 @@ static void
                        pktio_pkt_set_macs(odp_packet_t pkt,

                         static uint32_t pkt_payload_len(void)
                         {
                        -       return test_jumbo ?
                        sizeof(pkt_test_data_t) : sizeof(pkt_head_t);
                        +  uint32_t len;
                        +
                        +       len = sizeof(pkt_head_t);
                        +
                        +       if (test_jumbo)
                        +  len += sizeof(pkt_test_data_t);
                        +
                        +       return len;
                         }

                         static int pktio_pkt_set_seq(odp_packet_t pkt)
                         {
                                static uint32_t tstseq;
                        -       size_t l4_off;
                        -  pkt_test_data_t *data;
                        -  uint32_t len = pkt_payload_len();
                        -
                        +       size_t off;
                        +  pkt_head_t head;

                        -       l4_off = odp_packet_l4_offset(pkt);
                        -       if (!l4_off) {
                        +       off = odp_packet_l4_offset(pkt);
                        +       if (!off) {
                        CU_FAIL("packet L4 offset not set");
                          return -1;
                                }

                        -       data = calloc(1, len);
                        -  CU_ASSERT_FATAL(data != NULL);
                        +  head.magic = TEST_SEQ_MAGIC;
                        +  head.seq   = tstseq;
                        +
                        +       off += ODPH_UDPHDR_LEN;
                        +  odp_packet_copydata_in(pkt, off,
                        sizeof(head), &head);
                        +
                        +       if (test_jumbo) {
                        +  pkt_test_data_t *data;
                        +
                        +  data = calloc(1, sizeof(*data));
                        +  CU_ASSERT_FATAL(data != NULL);

                        -  data->head.magic = TEST_SEQ_MAGIC;
                        -  data->magic2 = TEST_SEQ_MAGIC;
                        -  data->head.seq  = tstseq;
                        +  data->magic2 = TEST_SEQ_MAGIC;
                        +
                        +  off += sizeof(head);
                        +  odp_packet_copydata_in(pkt, off,
                        sizeof(*data), data);
                        +  free(data);
                        +       }

                        -  odp_packet_copydata_in(pkt,
                        l4_off+ODPH_UDPHDR_LEN,
                        -   len, data);
                        -  free(data);
                        tstseq++;

                                return 0;
                        @@ -108,30 +121,37 @@ static int
                        pktio_pkt_set_seq(odp_packet_t pkt)

                         static uint32_t pktio_pkt_seq(odp_packet_t pkt)
                         {
                        -       size_t l4_off;
                        +       size_t off;
                        uint32_t seq = TEST_SEQ_INVALID;
                        -  pkt_test_data_t *data;
                        -  uint32_t len = pkt_payload_len();
                        +  pkt_head_t head;

                        -       l4_off = odp_packet_l4_offset(pkt);
                        -       if (l4_off == ODP_PACKET_OFFSET_INVALID)
                        +       off = odp_packet_l4_offset(pkt);
                        +       if (off == ODP_PACKET_OFFSET_INVALID)
                          return TEST_SEQ_INVALID;

                        -       data = calloc(1, len);
                        -  CU_ASSERT_FATAL(data != NULL);
                        +       off += ODPH_UDPHDR_LEN;
                        +  odp_packet_copydata_out(pkt, off,
                        sizeof(head), &head);

                        -  odp_packet_copydata_out(pkt,
                        l4_off+ODPH_UDPHDR_LEN,
                        -    len, data);
                        +       if (head.magic != TEST_SEQ_MAGIC)
                        +  return TEST_SEQ_INVALID;

                        -       if (data->head.magic == TEST_SEQ_MAGIC) {
                        -  if (test_jumbo && data->magic2 !=
                        TEST_SEQ_MAGIC) {
                        -  free(data);
                        -  return TEST_SEQ_INVALID;
                        -  }
                        -  seq = data->head.seq;
                        +       seq = head.seq;
                        +
                        +       if (test_jumbo) {
                        +  pkt_test_data_t *data;
                        +
                        +  data = calloc(1, sizeof(*data));
                        +  CU_ASSERT_FATAL(data != NULL);
                        +
                        +  off += sizeof(head);
                        +  odp_packet_copydata_out(pkt, off,
                        sizeof(*data), data);
                        +
                        +  if (data->magic2 != TEST_SEQ_MAGIC)
                        +          seq = TEST_SEQ_INVALID;
                        +
                        +  free(data);
                                }

                        -  free(data);
                                return seq;
                         }

                        --
                        2.1.1


                        _______________________________________________
                        lng-odp mailing list
                        [email protected]
                        <mailto:[email protected]>
                        http://lists.linaro.org/mailman/listinfo/lng-odp



                    _______________________________________________
                    lng-odp mailing list
                    [email protected]
                    <mailto:[email protected]>
                    http://lists.linaro.org/mailman/listinfo/lng-odp




-- Mike Holmes
                Technical Manager - Linaro Networking Group
                Linaro.org <http://www.linaro.org/>***│ *Open source
                software for ARM SoCs







--
Mike Holmes
Technical Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/>***│ *Open source software for ARM SoCs



_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp


_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to