test/wpackettest.c:280: error: INTEGER_OVERFLOW_L2
  ([0, +oo] - [0, 1]):unsigned64 by call to `WPACKET_finish`.
Showing all 13 steps of the trace


test/wpackettest.c:277:17: Call
275.       /* Repeat above test but only abandon a sub-packet */
276.       if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))
277.               || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
                       ^
278.               || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))
279.               || !TEST_true(WPACKET_close(&pkt))

crypto/packet.c:272:1: Parameter `lenbytes`
  270.   }
  271.   
  272. > int WPACKET_start_sub_packet_len__(WPACKET *pkt, size_t lenbytes)
  273.   {
  274.       WPACKET_SUB *sub;

crypto/packet.c:289:5: Assignment
  287.       pkt->subs = sub;
  288.       sub->pwritten = pkt->written + lenbytes;
  289.       sub->lenbytes = lenbytes;
             ^
  290.   
  291.       if (lenbytes == 0) {

test/wpackettest.c:279:17: Call
277.               || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
278.               || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))
279.               || !TEST_true(WPACKET_close(&pkt))
                       ^
280.               || !TEST_true(WPACKET_finish(&pkt))
281.               || !TEST_true(WPACKET_get_total_written(&pkt, &written))

crypto/packet.c:240:1: Parameter `pkt->curr`
  238.   }
  239.   
  240. > int WPACKET_close(WPACKET *pkt)
  241.   {
  242.       /*

test/wpackettest.c:280:17: Call
278.               || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))
279.               || !TEST_true(WPACKET_close(&pkt))
280.               || !TEST_true(WPACKET_finish(&pkt))
                       ^
281.               || !TEST_true(WPACKET_get_total_written(&pkt, &written))
282.               || !TEST_mem_eq(buf->data, written, empty, sizeof(empty)))

crypto/packet.c:252:1: Parameter `pkt->curr`
  250.   }
  251.   
  252. > int WPACKET_finish(WPACKET *pkt)
  253.   {
  254.       int ret;

crypto/packet.c:263:11: Call
  261.           return 0;
  262.   
  263.       ret = wpacket_intern_close(pkt, pkt->subs, 1);
                   ^
  264.       if (ret) {
  265.           OPENSSL_free(pkt->subs);

crypto/packet.c:186:1: <LHS trace>
184.    * (i.e. it fills in all the lengths), but doesn't actually close anything.
185.    */
186. > static int wpacket_intern_close(WPACKET *pkt, WPACKET_SUB *sub, int doclose)
187.   {
188.       size_t packlen = pkt->written - sub->pwritten;

crypto/packet.c:186:1: Parameter `pkt->curr`
    184.    * (i.e. it fills in all the lengths), but doesn't actually close anything.
    185.    */
    186. > static int wpacket_intern_close(WPACKET *pkt, WPACKET_SUB *sub, int doclose)
    187.   {
    188.       size_t packlen = pkt->written - sub->pwritten;

crypto/packet.c:186:1: <RHS trace>
184.    * (i.e. it fills in all the lengths), but doesn't actually close anything.
185.    */
186. > static int wpacket_intern_close(WPACKET *pkt, WPACKET_SUB *sub, int doclose)
187.   {
188.       size_t packlen = pkt->written - sub->pwritten;

crypto/packet.c:186:1: Parameter `sub->lenbytes`
    184.    * (i.e. it fills in all the lengths), but doesn't actually close anything.
    185.    */
    186. > static int wpacket_intern_close(WPACKET *pkt, WPACKET_SUB *sub, int doclose)
    187.   {
    188.       size_t packlen = pkt->written - sub->pwritten;

crypto/packet.c:201:13: Binary operation: ([0, +oo] - [0, 1]):unsigned64 by call to `WPACKET_finish` 
    199.   
    200.           /* Deallocate any bytes allocated for the length of the WPACKET */
    201.           if ((pkt->curr - sub->lenbytes) == sub->packet_len) {
                       ^
    202.               pkt->written -= sub->lenbytes;
    203.               pkt->curr -= sub->lenbytes;

static int wpacket_intern_close(WPACKET *pkt, WPACKET_SUB *sub, int doclose)
{
    size_t packlen = pkt->written - sub->pwritten;
    if (packlen == 0
            && (sub->flags & WPACKET_FLAGS_NON_ZERO_LENGTH) != 0)
        return 0;
    if (packlen == 0
            && sub->flags & WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH) {
        if (!doclose)
            return 0;
        if ((pkt->curr - sub->lenbytes) == sub->packet_len) {
            pkt->written -= sub->lenbytes;
            pkt->curr -= sub->lenbytes;
        }
        sub->packet_len = 0;
        sub->lenbytes = 0;
    }
    if (sub->lenbytes > 0
                && !put_value(&GETBUF(pkt)[sub->packet_len], packlen,
                              sub->lenbytes))
            return 0;
    if (doclose) {
        pkt->subs = sub->parent;
        OPENSSL_free(sub);
    }
    return 1;
}
['static int test_WPACKET_set_flags(void)\n{\n    WPACKET pkt;\n    size_t written;\n    if (!TEST_true(WPACKET_init(&pkt, buf))\n            || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_NON_ZERO_LENGTH))\n            || !TEST_false(WPACKET_finish(&pkt))\n            || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))\n            || !TEST_true(WPACKET_finish(&pkt))\n            || !TEST_true(WPACKET_get_total_written(&pkt, &written))\n            || !TEST_mem_eq(buf->data, written, simple1, sizeof(simple1)))\n        return cleanup(&pkt);\n    if (!TEST_true(WPACKET_init(&pkt, buf))\n            || !TEST_true(WPACKET_start_sub_packet(&pkt))\n            || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_NON_ZERO_LENGTH))\n            || !TEST_false(WPACKET_close(&pkt))\n            || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))\n            || !TEST_true(WPACKET_close(&pkt))\n            || !TEST_true(WPACKET_finish(&pkt))\n            || !TEST_true(WPACKET_get_total_written(&pkt, &written))\n            || !TEST_mem_eq(buf->data, written, simple1, sizeof(simple1)))\n        return cleanup(&pkt);\n    if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))\n            || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))\n            || !TEST_true(WPACKET_finish(&pkt))\n            || !TEST_true(WPACKET_get_total_written(&pkt, &written))\n            || !TEST_size_t_eq(written, 0))\n        return cleanup(&pkt);\n    if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))\n            || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))\n            || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))\n            || !TEST_true(WPACKET_close(&pkt))\n            || !TEST_true(WPACKET_finish(&pkt))\n            || !TEST_true(WPACKET_get_total_written(&pkt, &written))\n            || !TEST_mem_eq(buf->data, written, empty, sizeof(empty)))\n        return cleanup(&pkt);\n    if (!TEST_true(WPACKET_init(&pkt, buf))\n            || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))\n            || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))\n            || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))\n            || !TEST_true(WPACKET_close(&pkt))\n            || !TEST_true(WPACKET_finish(&pkt))\n            || !TEST_true(WPACKET_get_total_written(&pkt, &written))\n            || !TEST_mem_eq(buf->data, written, simple2, sizeof(simple2)))\n        return cleanup(&pkt);\n    return 1;\n}', 'int WPACKET_start_sub_packet_len__(WPACKET *pkt, size_t lenbytes)\n{\n    WPACKET_SUB *sub;\n    unsigned char *lenchars;\n    if (!ossl_assert(pkt->subs != NULL))\n        return 0;\n    if ((sub = OPENSSL_zalloc(sizeof(*sub))) == NULL) {\n        SSLerr(SSL_F_WPACKET_START_SUB_PACKET_LEN__, ERR_R_MALLOC_FAILURE);\n        return 0;\n    }\n    sub->parent = pkt->subs;\n    pkt->subs = sub;\n    sub->pwritten = pkt->written + lenbytes;\n    sub->lenbytes = lenbytes;\n    if (lenbytes == 0) {\n        sub->packet_len = 0;\n        return 1;\n    }\n    if (!WPACKET_allocate_bytes(pkt, lenbytes, &lenchars))\n        return 0;\n    sub->packet_len = lenchars - GETBUF(pkt);\n    return 1;\n}', 'int WPACKET_close(WPACKET *pkt)\n{\n    if (pkt->subs == NULL || pkt->subs->parent == NULL)\n        return 0;\n    return wpacket_intern_close(pkt, pkt->subs, 1);\n}', 'int WPACKET_finish(WPACKET *pkt)\n{\n    int ret;\n    if (pkt->subs == NULL || pkt->subs->parent != NULL)\n        return 0;\n    ret = wpacket_intern_close(pkt, pkt->subs, 1);\n    if (ret) {\n        OPENSSL_free(pkt->subs);\n        pkt->subs = NULL;\n    }\n    return ret;\n}', 'static int wpacket_intern_close(WPACKET *pkt, WPACKET_SUB *sub, int doclose)\n{\n    size_t packlen = pkt->written - sub->pwritten;\n    if (packlen == 0\n            && (sub->flags & WPACKET_FLAGS_NON_ZERO_LENGTH) != 0)\n        return 0;\n    if (packlen == 0\n            && sub->flags & WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH) {\n        if (!doclose)\n            return 0;\n        if ((pkt->curr - sub->lenbytes) == sub->packet_len) {\n            pkt->written -= sub->lenbytes;\n            pkt->curr -= sub->lenbytes;\n        }\n        sub->packet_len = 0;\n        sub->lenbytes = 0;\n    }\n    if (sub->lenbytes > 0\n                && !put_value(&GETBUF(pkt)[sub->packet_len], packlen,\n                              sub->lenbytes))\n            return 0;\n    if (doclose) {\n        pkt->subs = sub->parent;\n        OPENSSL_free(sub);\n    }\n    return 1;\n}']