The macro does the two checks together so that it's obvious what we're
checking as doing it in place is really unpleasant.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/internal.h | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/internal.h b/src/internal.h
index 01860efad9..20aa9b1d41 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -43,6 +43,17 @@
#define VIR_INT_MULTIPLY_OVERFLOW(a,b) (G_UNLIKELY ((b) > 0 && (a) >
G_MAXINT / (b)))
+/**
+ * VIR_MULTIPLY_ADD_IS_OVERFLOW:
+ * @limit: maximum value of data type
+ * @value: current value
+ * @multiply: number @value is going to be multiplied by
+ * @add: number that will be added to @value after multiplication
+ */
+#define VIR_MULTIPLY_ADD_IS_OVERFLOW(limit, value, multiply, add) \
+ (G_UNLIKELY(((multiply) > 0 && (value) > (limit) / (multiply)) || \
+ ((limit) - ((value) * (multiply)) < (add))))
+
/* The library itself is allowed to use deprecated functions /
* variables, so effectively undefine the deprecated attribute
* which would otherwise be defined in libvirt.h.
--
2.46.0