From 56bc7721ecdaa63f078fad27f9a4be3e7bd88170 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Thu, 29 Dec 2022 15:37:22 +0100 Subject: [PATCH] Add overflow check helpers --- babl/babl-util.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ babl/babl-util.h | 6 ++++++ 2 files changed, 61 insertions(+) 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); -- 2.30.2