From: Luca Bacci Date: Thu, 29 Dec 2022 14:37:22 +0000 (+0100) Subject: Add overflow check helpers X-Git-Tag: archive/raspbian/1%0.1.106-3+rpi1^2~15^2^2~40 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=56bc7721ecdaa63f078fad27f9a4be3e7bd88170;p=babl.git Add overflow check helpers --- diff --git a/babl/babl-util.c b/babl/babl-util.c index a4f482f..66a9290 100644 --- a/babl/babl-util.c +++ b/babl/babl-util.c @@ -17,6 +17,9 @@ */ #include "config.h" +#include +#include +#include #include #include #include @@ -106,6 +109,58 @@ babl_rel_avg_error (const double *imgA, return error; } +size_t +add_check_overflow (size_t numbers_count, ...) +{ + size_t result = 0; + va_list args; + + assert (numbers_count > 0); + + va_start (args, numbers_count); + while (numbers_count--) + { + size_t addendum = va_arg (args, size_t); + + if ((SIZE_MAX - result) < addendum) + { + result = 0; + break; + } + + result += addendum; + } + va_end (args); + + return result; +} + +size_t +mul_check_overflow (size_t numbers_count, ...) +{ + size_t result = 1; + va_list args; + + assert (numbers_count > 0); + + va_start (args, numbers_count); + while (numbers_count--) + { + size_t factor = va_arg (args, size_t); + + if ((SIZE_MAX / result) < factor) + { + result = 0; + break; + } + + result *= factor; + } + va_end (args); + + return result; +} + FILE * _babl_fopen (const char *path, const char *mode) diff --git a/babl/babl-util.h b/babl/babl-util.h index ad094e1..6c96540 100644 --- a/babl/babl-util.h +++ b/babl/babl-util.h @@ -38,6 +38,12 @@ babl_rel_avg_error (const double *imgA, const double *imgB, long samples); +size_t +add_check_overflow (size_t numbers_count, ...); + +size_t +mul_check_overflow (size_t numbers_count, ...); + FILE * _babl_fopen (const char *path, const char *mode);