ssl/statem/statem_lib.c:391: error: INTEGER_OVERFLOW_L2
  ([0, +oo] - [`pkt->written`, `pkt->written` + 3]):unsigned64 by call to `ssl_add_cert_chain`.
Showing all 18 steps of the trace


ssl/statem/statem_lib.c:390:10: Call
388.   unsigned long ssl3_output_cert_chain(SSL *s, WPACKET *pkt, CERT_PKEY *cpk)
389.   {
390.       if (!WPACKET_start_sub_packet_u24(pkt)
                ^
391.               || !ssl_add_cert_chain(s, pkt, cpk)
392.               || !WPACKET_close(pkt)) {

ssl/packet.c:251:1: Parameter `pkt->buf->length`
  249.   }
  250.   
  251. > int WPACKET_start_sub_packet_len__(WPACKET *pkt, size_t lenbytes)
  252.   {
  253.       WPACKET_SUB *sub;

ssl/statem/statem_lib.c:391:17: Call
389.   {
390.       if (!WPACKET_start_sub_packet_u24(pkt)
391.               || !ssl_add_cert_chain(s, pkt, cpk)
                       ^
392.               || !WPACKET_close(pkt)) {
393.           SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN, ERR_R_INTERNAL_ERROR);

ssl/ssl_cert.c:764:1: Parameter `pkt->written`
  762.   
  763.   /* Add certificate chain to internal SSL BUF_MEM structure */
  764. > int ssl_add_cert_chain(SSL *s, WPACKET *pkt, CERT_PKEY *cpk)
  765.   {
  766.       int i, chain_count;

ssl/ssl_cert.c:842:14: Call
  840.               return 0;
  841.           }
  842.           if (!ssl_add_cert_to_buf(pkt, x))
                      ^
  843.               return 0;
  844.           for (i = 0; i < sk_X509_num(extra_certs); i++) {

ssl/ssl_cert.c:744:1: Parameter `pkt->written`
    742.   
    743.   /* Add a certificate to the WPACKET */
    744. > static int ssl_add_cert_to_buf(WPACKET *pkt, X509 *x)
    745.   {
    746.       int len;

ssl/ssl_cert.c:754:10: Call
    752.           return 0;
    753.       }
    754.       if (!WPACKET_sub_allocate_bytes_u24(pkt, len, &outbytes)
                    ^
    755.               || i2d_X509(x, &outbytes) != len) {
    756.           SSLerr(SSL_F_SSL_ADD_CERT_TO_BUF, ERR_R_INTERNAL_ERROR);

ssl/packet.c:25:1: Parameter `pkt->written`
      23.   }
      24.   
      25. > int WPACKET_sub_allocate_bytes__(WPACKET *pkt, size_t len,
      26.                                    unsigned char **allocbytes, size_t lenbytes)
      27.   {

ssl/packet.c:28:10: Call
      26.                                    unsigned char **allocbytes, size_t lenbytes)
      27.   {
      28.       if (!WPACKET_start_sub_packet_len__(pkt, lenbytes)
                     ^
      29.               || !WPACKET_allocate_bytes(pkt, len, allocbytes)
      30.               || !WPACKET_close(pkt))

ssl/packet.c:251:1: Parameter `pkt->written`
        249.   }
        250.   
        251. > int WPACKET_start_sub_packet_len__(WPACKET *pkt, size_t lenbytes)
        252.   {
        253.       WPACKET_SUB *sub;

ssl/packet.c:275:10: Call
        273.       }
        274.   
        275.       if (!WPACKET_allocate_bytes(pkt, lenbytes, &lenchars))
                        ^
        276.           return 0;
        277.       /* Convert to an offset in case the underlying BUF_MEM gets realloc'd */

ssl/packet.c:15:1: Parameter `pkt->written`
          13.   #define DEFAULT_BUF_SIZE    256
          14.   
          15. > int WPACKET_allocate_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)
          16.   {
          17.       if (!WPACKET_reserve_bytes(pkt, len, allocbytes))

ssl/packet.c:17:10: Call
          15.   int WPACKET_allocate_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)
          16.   {
          17.       if (!WPACKET_reserve_bytes(pkt, len, allocbytes))
                         ^
          18.           return 0;
          19.   

ssl/packet.c:39:1: <LHS trace>
37.                        ? (p)->staticbuf : (unsigned char *)(p)->buf->data)
38.   
39. > int WPACKET_reserve_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)
40.   {
41.       /* Internal API, so should not fail */

ssl/packet.c:39:1: Parameter `pkt->buf->length`
            37.                        ? (p)->staticbuf : (unsigned char *)(p)->buf->data)
            38.   
            39. > int WPACKET_reserve_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)
            40.   {
            41.       /* Internal API, so should not fail */

ssl/packet.c:39:1: <RHS trace>
37.                        ? (p)->staticbuf : (unsigned char *)(p)->buf->data)
38.   
39. > int WPACKET_reserve_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)
40.   {
41.       /* Internal API, so should not fail */

ssl/packet.c:39:1: Parameter `len`
            37.                        ? (p)->staticbuf : (unsigned char *)(p)->buf->data)
            38.   
            39. > int WPACKET_reserve_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)
            40.   {
            41.       /* Internal API, so should not fail */

ssl/packet.c:49:36: Binary operation: ([0, +oo] - [pkt->written, pkt->written + 3]):unsigned64 by call to `ssl_add_cert_chain` 
            47.           return 0;
            48.   
            49.       if (pkt->staticbuf == NULL && (pkt->buf->length - pkt->written < len)) {
                                                     ^
            50.           size_t newlen;
            51.           size_t reflen;

int WPACKET_reserve_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)
{
    assert(pkt->subs != NULL && len != 0);
    if (pkt->subs == NULL || len == 0)
        return 0;
    if (pkt->maxsize - pkt->written < len)
        return 0;
    if (pkt->staticbuf == NULL && (pkt->buf->length - pkt->written < len)) {
        size_t newlen;
        size_t reflen;
        reflen = (len > pkt->buf->length) ? len : pkt->buf->length;
        if (reflen > SIZE_MAX / 2) {
            newlen = SIZE_MAX;
        } else {
            newlen = reflen * 2;
            if (newlen < DEFAULT_BUF_SIZE)
                newlen = DEFAULT_BUF_SIZE;
        }
        if (BUF_MEM_grow(pkt->buf, newlen) == 0)
            return 0;
    }
    *allocbytes = GETBUF(pkt) + pkt->curr;
    return 1;
}
['unsigned long ssl3_output_cert_chain(SSL *s, WPACKET *pkt, CERT_PKEY *cpk)\n{\n    if (!WPACKET_start_sub_packet_u24(pkt)\n            || !ssl_add_cert_chain(s, pkt, cpk)\n            || !WPACKET_close(pkt)) {\n        SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN, ERR_R_INTERNAL_ERROR);\n        return 0;\n    }\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    assert(pkt->subs != NULL);\n    if (pkt->subs == NULL)\n        return 0;\n    sub = OPENSSL_zalloc(sizeof(*sub));\n    if (sub == NULL)\n        return 0;\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 ssl_add_cert_chain(SSL *s, WPACKET *pkt, CERT_PKEY *cpk)\n{\n    int i, chain_count;\n    X509 *x;\n    STACK_OF(X509) *extra_certs;\n    STACK_OF(X509) *chain = NULL;\n    X509_STORE *chain_store;\n    if (cpk == NULL || cpk->x509 == NULL)\n        return 1;\n    x = cpk->x509;\n    if (cpk->chain)\n        extra_certs = cpk->chain;\n    else\n        extra_certs = s->ctx->extra_certs;\n    if ((s->mode & SSL_MODE_NO_AUTO_CHAIN) || extra_certs)\n        chain_store = NULL;\n    else if (s->cert->chain_store)\n        chain_store = s->cert->chain_store;\n    else\n        chain_store = s->ctx->cert_store;\n    if (chain_store) {\n        X509_STORE_CTX *xs_ctx = X509_STORE_CTX_new();\n        if (xs_ctx == NULL) {\n            SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, ERR_R_MALLOC_FAILURE);\n            return (0);\n        }\n        if (!X509_STORE_CTX_init(xs_ctx, chain_store, x, NULL)) {\n            X509_STORE_CTX_free(xs_ctx);\n            SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, ERR_R_X509_LIB);\n            return (0);\n        }\n        (void)X509_verify_cert(xs_ctx);\n        ERR_clear_error();\n        chain = X509_STORE_CTX_get0_chain(xs_ctx);\n        i = ssl_security_cert_chain(s, chain, NULL, 0);\n        if (i != 1) {\n#if 0\n            SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, SSL_R_EE_KEY_TOO_SMALL);\n            SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, SSL_R_CA_KEY_TOO_SMALL);\n            SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, SSL_R_CA_MD_TOO_WEAK);\n#endif\n            X509_STORE_CTX_free(xs_ctx);\n            SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, i);\n            return 0;\n        }\n        chain_count = sk_X509_num(chain);\n        for (i = 0; i < chain_count; i++) {\n            x = sk_X509_value(chain, i);\n            if (!ssl_add_cert_to_buf(pkt, x)) {\n                X509_STORE_CTX_free(xs_ctx);\n                return 0;\n            }\n        }\n        X509_STORE_CTX_free(xs_ctx);\n    } else {\n        i = ssl_security_cert_chain(s, extra_certs, x, 0);\n        if (i != 1) {\n            SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, i);\n            return 0;\n        }\n        if (!ssl_add_cert_to_buf(pkt, x))\n            return 0;\n        for (i = 0; i < sk_X509_num(extra_certs); i++) {\n            x = sk_X509_value(extra_certs, i);\n            if (!ssl_add_cert_to_buf(pkt, x))\n                return 0;\n        }\n    }\n    return 1;\n}', 'static int ssl_add_cert_to_buf(WPACKET *pkt, X509 *x)\n{\n    int len;\n    unsigned char *outbytes;\n    len = i2d_X509(x, NULL);\n    if (len < 0) {\n        SSLerr(SSL_F_SSL_ADD_CERT_TO_BUF, ERR_R_BUF_LIB);\n        return 0;\n    }\n    if (!WPACKET_sub_allocate_bytes_u24(pkt, len, &outbytes)\n            || i2d_X509(x, &outbytes) != len) {\n        SSLerr(SSL_F_SSL_ADD_CERT_TO_BUF, ERR_R_INTERNAL_ERROR);\n        return 0;\n    }\n    return 1;\n}', 'int WPACKET_sub_allocate_bytes__(WPACKET *pkt, size_t len,\n                                 unsigned char **allocbytes, size_t lenbytes)\n{\n    if (!WPACKET_start_sub_packet_len__(pkt, lenbytes)\n            || !WPACKET_allocate_bytes(pkt, len, allocbytes)\n            || !WPACKET_close(pkt))\n        return 0;\n    return 1;\n}', 'int WPACKET_allocate_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)\n{\n    if (!WPACKET_reserve_bytes(pkt, len, allocbytes))\n        return 0;\n    pkt->written += len;\n    pkt->curr += len;\n    return 1;\n}', 'int WPACKET_reserve_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)\n{\n    assert(pkt->subs != NULL && len != 0);\n    if (pkt->subs == NULL || len == 0)\n        return 0;\n    if (pkt->maxsize - pkt->written < len)\n        return 0;\n    if (pkt->staticbuf == NULL && (pkt->buf->length - pkt->written < len)) {\n        size_t newlen;\n        size_t reflen;\n        reflen = (len > pkt->buf->length) ? len : pkt->buf->length;\n        if (reflen > SIZE_MAX / 2) {\n            newlen = SIZE_MAX;\n        } else {\n            newlen = reflen * 2;\n            if (newlen < DEFAULT_BUF_SIZE)\n                newlen = DEFAULT_BUF_SIZE;\n        }\n        if (BUF_MEM_grow(pkt->buf, newlen) == 0)\n            return 0;\n    }\n    *allocbytes = GETBUF(pkt) + pkt->curr;\n    return 1;\n}']