@@ -462,8 +462,75 @@ enum {
462462
463463#define XELEM_CNT (x ) (sizeof ((x))/sizeof (*(x)))
464464
465- #define WC_SAFE_SUM_WORD32 (in1, in2, out ) ((in2) <= 0xffffffffU - (in1) ? \
466- ((out) = (in1) + (in2), 1 ) : ((out) = 0xffffffffU , 0 ))
465+ #ifdef NO_INLINE
466+ #define WC_WUR_INT (x ) (x)
467+ #else
468+ static WC_INLINE WARN_UNUSED_RESULT int WC_WUR_INT (int x) { return x; }
469+ #endif
470+
471+ #ifdef WORD64_AVAILABLE
472+ #define WC_MAX_UINT_OF (x ) \
473+ ((((word64)1 << ((sizeof (x) * (word64)CHAR_BIT) - \
474+ (word64)1 )) - (word64)1 ) \
475+ | \
476+ ((word64)1 << ((sizeof (x) * (word64)CHAR_BIT) - (word64)1 )))
477+ #define WC_MAX_SINT_OF (x ) \
478+ ((sword64)((((word64)1 << ((sizeof (x) * (word64)CHAR_BIT) - \
479+ (word64)2 )) - (word64)1 ) \
480+ | \
481+ ((word64)1 << ((sizeof (x) * (word64)CHAR_BIT) - \
482+ (word64)2 ))))
483+ #define WC_MIN_SINT_OF (x ) \
484+ ((sword64)((word64)1 << ((sizeof (x) * (word64)CHAR_BIT) - \
485+ (word64)1 )))
486+ #else
487+ #define WC_MAX_UINT_OF (x ) \
488+ ((((word32)1 << ((sizeof (x) * (word32)CHAR_BIT) - \
489+ (word32)1 )) - (word32)1 ) \
490+ | \
491+ ((word32)1 << ((sizeof (x) * (word32)CHAR_BIT) - (word32)1 )))
492+ #define WC_MAX_SINT_OF (x ) \
493+ ((sword32)((((word32)1 << ((sizeof (x) * (word32)CHAR_BIT) - \
494+ (word32)2 )) - (word32)1 ) \
495+ | \
496+ ((word32)1 << ((sizeof (x) * (word32)CHAR_BIT) - \
497+ (word32)2 ))))
498+ #define WC_MIN_SINT_OF (x ) \
499+ ((sword32)((word32)1 << ((sizeof (x) * (word32)CHAR_BIT) - \
500+ (word32)1 )))
501+ #endif
502+
503+ #define WC_SAFE_SUM_UNSIGNED_NO_WUR (type, in1, in2, out ) \
504+ ((in2) <= (WC_MAX_UINT_OF(type) - (in1)) ? \
505+ ((out) = (in1) + (in2), 1 ) : \
506+ ((out) = WC_MAX_UINT_OF(type), 0 ))
507+
508+ #define WC_SAFE_SUM_UNSIGNED (type, in1, in2, out ) \
509+ WC_WUR_INT (WC_SAFE_SUM_UNSIGNED_NO_WUR(type, in1, in2, out))
510+
511+ #if defined(HAVE_SELFTEST) || (defined(HAVE_FIPS) && FIPS_VERSION3_LE(6,0,0))
512+ #define WC_SAFE_SUM_WORD32 (in1, in2, out ) \
513+ WC_SAFE_SUM_UNSIGNED_NO_WUR (word32, in1, in2, out)
514+ #else
515+ #define WC_SAFE_SUM_WORD32 (in1, in2, out ) \
516+ WC_SAFE_SUM_UNSIGNED (word32, in1, in2, out)
517+ #endif
518+
519+ #define WC_SAFE_SUM_SIGNED_NO_WUR (type, in1, in2, out ) \
520+ ((((in1) > 0 ) && ((in2) > 0 )) ? \
521+ ((in2) <= WC_MAX_SINT_OF(type) - (in1) ? \
522+ ((out) = (in1) + (in2), 1 ) : \
523+ ((out) = (type)WC_MAX_SINT_OF(type), 0 )) \
524+ : \
525+ ((((in1) < 0 ) && ((in2) < 0 )) ? \
526+ ((in2) >= WC_MIN_SINT_OF(type) - (in1) ? \
527+ ((out) = (in1) + (in2), 1 ) : \
528+ ((out) = (type)WC_MIN_SINT_OF(type), 0 )) \
529+ : \
530+ ((out) = (in1) + (in2), 1 )))
531+
532+ #define WC_SAFE_SUM_SIGNED (type, in1, in2, out ) \
533+ WC_WUR_INT (WC_SAFE_SUM_SIGNED_NO_WUR(type, in1, in2, out))
467534
468535#if defined(HAVE_IO_POOL)
469536 WOLFSSL_API void * XMALLOC (size_t n, void * heap, int type);
0 commit comments