crypto/ec/ecp_smpl.c:1697: error: INTEGER_OVERFLOW_L2
  ([0, +oo] - 1):unsigned64.
Showing all 3 steps of the trace


crypto/ec/ecp_smpl.c:1542:2: <LHS trace>
1540.   	BN_CTX *new_ctx = NULL;
1541.   	BIGNUM *tmp0, *tmp1;
1542.   	size_t pow2 = 0;
         ^
1543.   	BIGNUM **heap = NULL;
1544.   	size_t i;

crypto/ec/ecp_smpl.c:1542:2: Assignment
1540.   	BN_CTX *new_ctx = NULL;
1541.   	BIGNUM *tmp0, *tmp1;
1542.   	size_t pow2 = 0;
         ^
1543.   	BIGNUM **heap = NULL;
1544.   	size_t i;

crypto/ec/ecp_smpl.c:1697:8: Binary operation: ([0, +oo] - 1):unsigned64
1695.   		{
1696.   		/* heap[pow2/2] .. heap[pow2-1] have not been allocated locally! */
1697.   		for (i = pow2/2 - 1; i > 0; i--)
               ^
1698.   			{
1699.   			if (heap[i] != NULL)

int ec_GFp_simple_points_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], BN_CTX *ctx)
	{
	BN_CTX *new_ctx = NULL;
	BIGNUM *tmp0, *tmp1;
	size_t pow2 = 0;
	BIGNUM **heap = NULL;
	size_t i;
	int ret = 0;
	if (num == 0)
		return 1;
	if (ctx == NULL)
		{
		ctx = new_ctx = BN_CTX_new();
		if (ctx == NULL)
			return 0;
		}
	BN_CTX_start(ctx);
	tmp0 = BN_CTX_get(ctx);
	tmp1 = BN_CTX_get(ctx);
	if (tmp0  == NULL || tmp1 == NULL) goto err;
	pow2 = 1;
	while (num > pow2)
		pow2 <<= 1;
	pow2 <<= 1;
	heap = OPENSSL_malloc(pow2 * sizeof heap[0]);
	if (heap == NULL) goto err;
	heap[0] = NULL;
	for (i = pow2/2 - 1; i > 0; i--)
		heap[i] = NULL;
	for (i = 0; i < num; i++)
		heap[pow2/2 + i] = &points[i]->Z;
	for (i = pow2/2 + num; i < pow2; i++)
		heap[i] = NULL;
	for (i = pow2/2 - 1; i > 0; i--)
		{
		heap[i] = BN_new();
		if (heap[i] == NULL) goto err;
		if (heap[2*i] != NULL)
			{
			if ((heap[2*i + 1] == NULL) || BN_is_zero(heap[2*i + 1]))
				{
				if (!BN_copy(heap[i], heap[2*i])) goto err;
				}
			else
				{
				if (BN_is_zero(heap[2*i]))
					{
					if (!BN_copy(heap[i], heap[2*i + 1])) goto err;
					}
				else
					{
					if (!group->meth->field_mul(group, heap[i],
						heap[2*i], heap[2*i + 1], ctx)) goto err;
					}
				}
			}
		}
	if (!BN_is_zero(heap[1]))
		{
		if (!BN_mod_inverse(heap[1], heap[1], &group->field, ctx))
			{
			ECerr(EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE, ERR_R_BN_LIB);
			goto err;
			}
		}
	if (group->meth->field_encode != 0)
		{
		if (!group->meth->field_encode(group, heap[1], heap[1], ctx)) goto err;
		if (!group->meth->field_encode(group, heap[1], heap[1], ctx)) goto err;
		}
	for (i = 2; i < pow2/2 + num; i += 2)
		{
		if ((heap[i + 1] != NULL) && !BN_is_zero(heap[i + 1]))
			{
			if (!group->meth->field_mul(group, tmp0, heap[i/2], heap[i + 1], ctx)) goto err;
			if (!group->meth->field_mul(group, tmp1, heap[i/2], heap[i], ctx)) goto err;
			if (!BN_copy(heap[i], tmp0)) goto err;
			if (!BN_copy(heap[i + 1], tmp1)) goto err;
			}
		else
			{
			if (!BN_copy(heap[i], heap[i/2])) goto err;
			}
		}
	for (i = 0; i < num; i++)
		{
		EC_POINT *p = points[i];
		if (!BN_is_zero(&p->Z))
			{
			if (!group->meth->field_sqr(group, tmp1, &p->Z, ctx)) goto err;
			if (!group->meth->field_mul(group, &p->X, &p->X, tmp1, ctx)) goto err;
			if (!group->meth->field_mul(group, tmp1, tmp1, &p->Z, ctx)) goto err;
			if (!group->meth->field_mul(group, &p->Y, &p->Y, tmp1, ctx)) goto err;
			if (group->meth->field_set_to_one != 0)
				{
				if (!group->meth->field_set_to_one(group, &p->Z, ctx)) goto err;
				}
			else
				{
				if (!BN_one(&p->Z)) goto err;
				}
			p->Z_is_one = 1;
			}
		}
	ret = 1;
 err:
	BN_CTX_end(ctx);
	if (new_ctx != NULL)
		BN_CTX_free(new_ctx);
	if (heap != NULL)
		{
		for (i = pow2/2 - 1; i > 0; i--)
			{
			if (heap[i] != NULL)
				BN_clear_free(heap[i]);
			}
		OPENSSL_free(heap);
		}
	return ret;
	}
['int ec_GFp_simple_points_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], BN_CTX *ctx)\n\t{\n\tBN_CTX *new_ctx = NULL;\n\tBIGNUM *tmp0, *tmp1;\n\tsize_t pow2 = 0;\n\tBIGNUM **heap = NULL;\n\tsize_t i;\n\tint ret = 0;\n\tif (num == 0)\n\t\treturn 1;\n\tif (ctx == NULL)\n\t\t{\n\t\tctx = new_ctx = BN_CTX_new();\n\t\tif (ctx == NULL)\n\t\t\treturn 0;\n\t\t}\n\tBN_CTX_start(ctx);\n\ttmp0 = BN_CTX_get(ctx);\n\ttmp1 = BN_CTX_get(ctx);\n\tif (tmp0  == NULL || tmp1 == NULL) goto err;\n\tpow2 = 1;\n\twhile (num > pow2)\n\t\tpow2 <<= 1;\n\tpow2 <<= 1;\n\theap = OPENSSL_malloc(pow2 * sizeof heap[0]);\n\tif (heap == NULL) goto err;\n\theap[0] = NULL;\n\tfor (i = pow2/2 - 1; i > 0; i--)\n\t\theap[i] = NULL;\n\tfor (i = 0; i < num; i++)\n\t\theap[pow2/2 + i] = &points[i]->Z;\n\tfor (i = pow2/2 + num; i < pow2; i++)\n\t\theap[i] = NULL;\n\tfor (i = pow2/2 - 1; i > 0; i--)\n\t\t{\n\t\theap[i] = BN_new();\n\t\tif (heap[i] == NULL) goto err;\n\t\tif (heap[2*i] != NULL)\n\t\t\t{\n\t\t\tif ((heap[2*i + 1] == NULL) || BN_is_zero(heap[2*i + 1]))\n\t\t\t\t{\n\t\t\t\tif (!BN_copy(heap[i], heap[2*i])) goto err;\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t{\n\t\t\t\tif (BN_is_zero(heap[2*i]))\n\t\t\t\t\t{\n\t\t\t\t\tif (!BN_copy(heap[i], heap[2*i + 1])) goto err;\n\t\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\tif (!group->meth->field_mul(group, heap[i],\n\t\t\t\t\t\theap[2*i], heap[2*i + 1], ctx)) goto err;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tif (!BN_is_zero(heap[1]))\n\t\t{\n\t\tif (!BN_mod_inverse(heap[1], heap[1], &group->field, ctx))\n\t\t\t{\n\t\t\tECerr(EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE, ERR_R_BN_LIB);\n\t\t\tgoto err;\n\t\t\t}\n\t\t}\n\tif (group->meth->field_encode != 0)\n\t\t{\n\t\tif (!group->meth->field_encode(group, heap[1], heap[1], ctx)) goto err;\n\t\tif (!group->meth->field_encode(group, heap[1], heap[1], ctx)) goto err;\n\t\t}\n\tfor (i = 2; i < pow2/2 + num; i += 2)\n\t\t{\n\t\tif ((heap[i + 1] != NULL) && !BN_is_zero(heap[i + 1]))\n\t\t\t{\n\t\t\tif (!group->meth->field_mul(group, tmp0, heap[i/2], heap[i + 1], ctx)) goto err;\n\t\t\tif (!group->meth->field_mul(group, tmp1, heap[i/2], heap[i], ctx)) goto err;\n\t\t\tif (!BN_copy(heap[i], tmp0)) goto err;\n\t\t\tif (!BN_copy(heap[i + 1], tmp1)) goto err;\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tif (!BN_copy(heap[i], heap[i/2])) goto err;\n\t\t\t}\n\t\t}\n\tfor (i = 0; i < num; i++)\n\t\t{\n\t\tEC_POINT *p = points[i];\n\t\tif (!BN_is_zero(&p->Z))\n\t\t\t{\n\t\t\tif (!group->meth->field_sqr(group, tmp1, &p->Z, ctx)) goto err;\n\t\t\tif (!group->meth->field_mul(group, &p->X, &p->X, tmp1, ctx)) goto err;\n\t\t\tif (!group->meth->field_mul(group, tmp1, tmp1, &p->Z, ctx)) goto err;\n\t\t\tif (!group->meth->field_mul(group, &p->Y, &p->Y, tmp1, ctx)) goto err;\n\t\t\tif (group->meth->field_set_to_one != 0)\n\t\t\t\t{\n\t\t\t\tif (!group->meth->field_set_to_one(group, &p->Z, ctx)) goto err;\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t{\n\t\t\t\tif (!BN_one(&p->Z)) goto err;\n\t\t\t\t}\n\t\t\tp->Z_is_one = 1;\n\t\t\t}\n\t\t}\n\tret = 1;\n err:\n\tBN_CTX_end(ctx);\n\tif (new_ctx != NULL)\n\t\tBN_CTX_free(new_ctx);\n\tif (heap != NULL)\n\t\t{\n\t\tfor (i = pow2/2 - 1; i > 0; i--)\n\t\t\t{\n\t\t\tif (heap[i] != NULL)\n\t\t\t\tBN_clear_free(heap[i]);\n\t\t\t}\n\t\tOPENSSL_free(heap);\n\t\t}\n\treturn ret;\n\t}']