crypto/bn/bn_gf2m.c:708: error: BUFFER_OVERRUN_L3
  Offset: [1, +oo] Size: [0, 8388607] by call to `bn_correct_top`.
Showing all 9 steps of the trace


crypto/bn/bn_gf2m.c:639:14: Assignment
637.           bdp = b->d;
638.           bdp[0] = 1;
639.           for (i = 1; i < top; i++)
                    ^
640.               bdp[i] = 0;
641.           b->top = top;

crypto/bn/bn_gf2m.c:641:9: Assignment
639.           for (i = 1; i < top; i++)
640.               bdp[i] = 0;
641.           b->top = top;
               ^
642.           if (!bn_wexpand(c, top))
643.             goto err;

crypto/bn/bn_gf2m.c:708:9: Call
706.               }
707.           }
708.           bn_correct_top(b);
               ^
709.       }
710.   # endif

crypto/bn/bn_lib.c:1019:1: <Offset trace>
1017.   }
1018.   
1019. > void bn_correct_top(BIGNUM *a)
1020.   {
1021.       BN_ULONG *ftl;

crypto/bn/bn_lib.c:1019:1: Parameter `a->top`
  1017.   }
  1018.   
  1019. > void bn_correct_top(BIGNUM *a)
  1020.   {
  1021.       BN_ULONG *ftl;

crypto/bn/bn_lib.c:1022:5: Assignment
  1020.   {
  1021.       BN_ULONG *ftl;
  1022.       int tmp_top = a->top;
              ^
  1023.   
  1024.       if (tmp_top > 0) {

crypto/bn/bn_lib.c:1019:1: <Length trace>
1017.   }
1018.   
1019. > void bn_correct_top(BIGNUM *a)
1020.   {
1021.       BN_ULONG *ftl;

crypto/bn/bn_lib.c:1019:1: Parameter `*a->d`
  1017.   }
  1018.   
  1019. > void bn_correct_top(BIGNUM *a)
  1020.   {
  1021.       BN_ULONG *ftl;

crypto/bn/bn_lib.c:1025:14: Array access: Offset: [1, +oo] Size: [0, 8388607] by call to `bn_correct_top` 
  1023.   
  1024.       if (tmp_top > 0) {
  1025.           for (ftl = &(a->d[tmp_top]); tmp_top > 0; tmp_top--) {
                       ^
  1026.               ftl--;
  1027.               if (*ftl != 0)

void bn_correct_top(BIGNUM *a)
{
    BN_ULONG *ftl;
    int tmp_top = a->top;
    if (tmp_top > 0) {
        for (ftl = &(a->d[tmp_top]); tmp_top > 0; tmp_top--) {
            ftl--;
            if (*ftl != 0)
                break;
        }
        a->top = tmp_top;
    }
    bn_pollute(a);
}
['int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)\n{\n    BIGNUM *b, *c = NULL, *u = NULL, *v = NULL, *tmp;\n    int ret = 0;\n    bn_check_top(a);\n    bn_check_top(p);\n    BN_CTX_start(ctx);\n    if ((b = BN_CTX_get(ctx)) == NULL)\n        goto err;\n    if ((c = BN_CTX_get(ctx)) == NULL)\n        goto err;\n    if ((u = BN_CTX_get(ctx)) == NULL)\n        goto err;\n    if ((v = BN_CTX_get(ctx)) == NULL)\n        goto err;\n    if (!BN_GF2m_mod(u, a, p))\n        goto err;\n    if (BN_is_zero(u))\n        goto err;\n    if (!BN_copy(v, p))\n        goto err;\n# if 0\n    if (!BN_one(b))\n        goto err;\n    while (1) {\n        while (!BN_is_odd(u)) {\n            if (BN_is_zero(u))\n                goto err;\n            if (!BN_rshift1(u, u))\n                goto err;\n            if (BN_is_odd(b)) {\n                if (!BN_GF2m_add(b, b, p))\n                    goto err;\n            }\n            if (!BN_rshift1(b, b))\n                goto err;\n        }\n        if (BN_abs_is_word(u, 1))\n            break;\n        if (BN_num_bits(u) < BN_num_bits(v)) {\n            tmp = u;\n            u = v;\n            v = tmp;\n            tmp = b;\n            b = c;\n            c = tmp;\n        }\n        if (!BN_GF2m_add(u, u, v))\n            goto err;\n        if (!BN_GF2m_add(b, b, c))\n            goto err;\n    }\n# else\n    {\n        int i;\n        int ubits = BN_num_bits(u);\n        int vbits = BN_num_bits(v);\n        int top = p->top;\n        BN_ULONG *udp, *bdp, *vdp, *cdp;\n        if (!bn_wexpand(u, top))\n            goto err;\n        udp = u->d;\n        for (i = u->top; i < top; i++)\n            udp[i] = 0;\n        u->top = top;\n        if (!bn_wexpand(b, top))\n          goto err;\n        bdp = b->d;\n        bdp[0] = 1;\n        for (i = 1; i < top; i++)\n            bdp[i] = 0;\n        b->top = top;\n        if (!bn_wexpand(c, top))\n          goto err;\n        cdp = c->d;\n        for (i = 0; i < top; i++)\n            cdp[i] = 0;\n        c->top = top;\n        vdp = v->d;\n        while (1) {\n            while (ubits && !(udp[0] & 1)) {\n                BN_ULONG u0, u1, b0, b1, mask;\n                u0 = udp[0];\n                b0 = bdp[0];\n                mask = (BN_ULONG)0 - (b0 & 1);\n                b0 ^= p->d[0] & mask;\n                for (i = 0; i < top - 1; i++) {\n                    u1 = udp[i + 1];\n                    udp[i] = ((u0 >> 1) | (u1 << (BN_BITS2 - 1))) & BN_MASK2;\n                    u0 = u1;\n                    b1 = bdp[i + 1] ^ (p->d[i + 1] & mask);\n                    bdp[i] = ((b0 >> 1) | (b1 << (BN_BITS2 - 1))) & BN_MASK2;\n                    b0 = b1;\n                }\n                udp[i] = u0 >> 1;\n                bdp[i] = b0 >> 1;\n                ubits--;\n            }\n            if (ubits <= BN_BITS2) {\n                if (udp[0] == 0)\n                    goto err;\n                if (udp[0] == 1)\n                    break;\n            }\n            if (ubits < vbits) {\n                i = ubits;\n                ubits = vbits;\n                vbits = i;\n                tmp = u;\n                u = v;\n                v = tmp;\n                tmp = b;\n                b = c;\n                c = tmp;\n                udp = vdp;\n                vdp = v->d;\n                bdp = cdp;\n                cdp = c->d;\n            }\n            for (i = 0; i < top; i++) {\n                udp[i] ^= vdp[i];\n                bdp[i] ^= cdp[i];\n            }\n            if (ubits == vbits) {\n                BN_ULONG ul;\n                int utop = (ubits - 1) / BN_BITS2;\n                while ((ul = udp[utop]) == 0 && utop)\n                    utop--;\n                ubits = utop * BN_BITS2 + BN_num_bits_word(ul);\n            }\n        }\n        bn_correct_top(b);\n    }\n# endif\n    if (!BN_copy(r, b))\n        goto err;\n    bn_check_top(r);\n    ret = 1;\n err:\n# ifdef BN_DEBUG\n    bn_correct_top(c);\n    bn_correct_top(u);\n    bn_correct_top(v);\n# endif\n    BN_CTX_end(ctx);\n    return ret;\n}', 'void bn_correct_top(BIGNUM *a)\n{\n    BN_ULONG *ftl;\n    int tmp_top = a->top;\n    if (tmp_top > 0) {\n        for (ftl = &(a->d[tmp_top]); tmp_top > 0; tmp_top--) {\n            ftl--;\n            if (*ftl != 0)\n                break;\n        }\n        a->top = tmp_top;\n    }\n    bn_pollute(a);\n}']