aboutsummaryrefslogtreecommitdiff
path: root/lib/alloc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/alloc')
-rw-r--r--lib/alloc/bufalloc.c23
-rw-r--r--lib/alloc/bufalloc_noterm.c28
2 files changed, 29 insertions, 22 deletions
diff --git a/lib/alloc/bufalloc.c b/lib/alloc/bufalloc.c
index dcb0a93..c688ab1 100644
--- a/lib/alloc/bufalloc.c
+++ b/lib/alloc/bufalloc.c
@@ -1,31 +1,10 @@
-#include <errno.h>
-#if __has_include(<stdckdint.h>)
-# include <stdckdint.h>
-# ifdef __APPLE__
-# warning "stdckdint.h now available on Mac; remove manual ckd_*() code"
-# endif
-#elifdef __GNUC__
-# define ckd_add(r, a, b) ((bool)__builtin_add_overflow(a, b, r))
-# define ckd_mul(r, a, b) ((bool)__builtin_mul_overflow(a, b, r))
-#else
-# define ckd_add(r, a, b) (*(r) = (a) + (b))
-# define ckd_mul(r, a, b) (*(r) = (a) * (b))
-# warning "ckd_*() not supported on the current platform"
-#endif
-#include <stdlib.h>
-
#include "alloc.h"
#include "errors.h"
void *
bufalloc(void *p, size_t n, size_t m)
{
- if (ckd_mul(&n, n, m)) {
- errno = EOVERFLOW;
- err(__func__);
- }
-
- if (!(p = realloc(p, n)))
+ if ((p = bufalloc_noterm(p, n, m)) == nullptr)
err(__func__);
return p;
}
diff --git a/lib/alloc/bufalloc_noterm.c b/lib/alloc/bufalloc_noterm.c
new file mode 100644
index 0000000..8258521
--- /dev/null
+++ b/lib/alloc/bufalloc_noterm.c
@@ -0,0 +1,28 @@
+#include <errno.h>
+#if __has_include(<stdckdint.h>)
+# include <stdckdint.h>
+# ifdef __APPLE__
+# warning "stdckdint.h now available on Mac; remove manual ckd_*() code"
+# endif
+#elifdef __GNUC__
+# define ckd_add(r, a, b) ((bool)__builtin_add_overflow(a, b, r))
+# define ckd_mul(r, a, b) ((bool)__builtin_mul_overflow(a, b, r))
+#else
+# define ckd_add(r, a, b) (*(r) = (a) + (b))
+# define ckd_mul(r, a, b) (*(r) = (a) * (b))
+# warning "ckd_*() not supported on the current platform"
+#endif
+#include <stdlib.h>
+
+#include "alloc.h"
+
+void *
+bufalloc_noterm(void *p, size_t n, size_t m)
+{
+ if (ckd_mul(&n, n, m)) {
+ errno = EOVERFLOW;
+ return nullptr;
+ }
+
+ return realloc(p, n);
+}