[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH libvirt-python 11/17] Import gnulib's xalloc_oversized macro



From: "Daniel P. Berrange" <berrange redhat com>

Signed-off-by: Daniel P. Berrange <berrange redhat com>
---
 libvirt-override.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/libvirt-override.c b/libvirt-override.c
index 246a15b..acd06a6 100644
--- a/libvirt-override.c
+++ b/libvirt-override.c
@@ -20,6 +20,7 @@
 #include <Python.h>
 #include <libvirt/libvirt.h>
 #include <libvirt/virterror.h>
+#include <stddef.h>
 #include "typewrappers.h"
 #include "build/libvirt.h"
 
@@ -35,6 +36,21 @@ extern void initcygvirtmod(void);
 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
 #endif
 
+/* Return 1 if an array of N objects, each of size S, cannot exist due
+   to size arithmetic overflow.  S must be positive and N must be
+   nonnegative.  This is a macro, not a function, so that it
+   works correctly even when SIZE_MAX < N.
+
+   By gnulib convention, SIZE_MAX represents overflow in size
+   calculations, so the conservative dividend to use here is
+   SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
+   However, malloc (SIZE_MAX) fails on all known hosts where
+   sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
+   exactly-SIZE_MAX allocations on such hosts; this avoids a test and
+   branch when S is known to be 1.  */
+#define xalloc_oversized(n, s) \
+    ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
+
 #if 0
 # define DEBUG_ERROR 1
 #endif
-- 
1.8.3.1


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]