Add overflow check helpers
authorLuca Bacci <luca.bacci982@gmail.com>
Thu, 29 Dec 2022 14:37:22 +0000 (15:37 +0100)
committerØyvind "pippin" Kolås <pippin@gimp.org>
Tue, 3 Jan 2023 10:33:37 +0000 (10:33 +0000)
babl/babl-util.c
babl/babl-util.h

index a4f482f5d4e923b5c628ccca67492a6279c866a2..66a9290f8990aef94c5568d528602bb14d154268 100644 (file)
@@ -17,6 +17,9 @@
  */
 
 #include "config.h"
+#include <stdarg.h>
+#include <limits.h>
+#include <assert.h>
 #include <stdio.h>
 #include <math.h>
 #include <sys/types.h>
@@ -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)
index ad094e1a110e1e5784bcae77735f24447ebd3739..6c965408e53e18af84d90f53efbd86b198ca19e9 100644 (file)
@@ -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);