Merge remote-tracking branch 'public/pr/2142' into development
diff --git a/include/mbedtls/ecp.h b/include/mbedtls/ecp.h
index 448549c..5db8752 100644
--- a/include/mbedtls/ecp.h
+++ b/include/mbedtls/ecp.h
@@ -233,7 +233,9 @@
                               unsigned ops );
 
 /* Utility macro for checking and updating ops budget */
-#define MBEDTLS_ECP_BUDGET( ops )   MBEDTLS_MPI_CHK( mbedtls_ecp_check_budget( grp, rs_ctx, ops ) );
+#define MBEDTLS_ECP_BUDGET( ops )   \
+    MBEDTLS_MPI_CHK( mbedtls_ecp_check_budget( grp, rs_ctx, \
+                                               (unsigned) (ops) ) );
 
 #else /* MBEDTLS_ECP_RESTARTABLE */
 
diff --git a/library/ecp.c b/library/ecp.c
index b193ad4..de5725c 100644
--- a/library/ecp.c
+++ b/library/ecp.c
@@ -248,9 +248,16 @@
         else if( grp->pbits >= 384 )
             ops *= 2;
 
-        /* avoid infinite loops: always allow first step */
-        if( rs_ctx->ops_done != 0 && rs_ctx->ops_done + ops > ecp_max_ops )
+        /* Avoid infinite loops: always allow first step.
+         * Because of that, however, it's not generally true
+         * that ops_done <= ecp_max_ops, so the check
+         * ops_done > ecp_max_ops below is mandatory. */
+        if( ( rs_ctx->ops_done != 0 ) &&
+            ( rs_ctx->ops_done > ecp_max_ops ||
+              ops > ecp_max_ops - rs_ctx->ops_done ) )
+        {
             return( MBEDTLS_ERR_ECP_IN_PROGRESS );
+        }
 
         /* update running count */
         rs_ctx->ops_done += ops;