Import 'reallocarray' from OpenBSD.
authorDan Cross <crossd@gmail.com>
Tue, 24 Nov 2015 02:57:01 +0000 (21:57 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 24 Nov 2015 20:10:05 +0000 (15:10 -0500)
Add this new function: a safe version of 'realloc' that avoids
integer overflow when computing the new size of the thing to
allocate.

Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/kmalloc.h
kern/src/Kbuild
kern/src/kreallocarray.c [new file with mode: 0644]

index 3e6de29..268cf29 100644 (file)
@@ -21,6 +21,7 @@ void* kzmalloc(size_t size, int flags);
 void *kmalloc_align(size_t size, int flags, size_t align);
 void *kzmalloc_align(size_t size, int flags, size_t align);
 void *krealloc(void *buf, size_t size, int flags);
+void *kreallocarray(void *buf, size_t nmemb, size_t size, int flags);
 int kmalloc_refcnt(void *buf);
 void kmalloc_incref(void *buf);
 void kfree(void *buf);
index abb08fe..5e380e3 100644 (file)
@@ -39,6 +39,7 @@ obj-y                                         += init.o
 obj-y                                          += kdebug.o
 obj-y                                          += kfs.o
 obj-y                                          += kmalloc.o
+obj-y                                          += kreallocarray.o
 obj-y                                          += ktest/
 obj-y                                          += kthread.o
 obj-y                                          += manager.o
diff --git a/kern/src/kreallocarray.c b/kern/src/kreallocarray.c
new file mode 100644 (file)
index 0000000..e89238a
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <ros/common.h>
+#include <kmalloc.h>
+
+/*
+ * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
+ * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
+ */
+enum {
+       SIZE_MAX = ~(size_t)0,
+       MUL_NO_OVERFLOW = ((size_t)1 << (sizeof(size_t) * 4))
+};
+
+void *reallocarray(void *optr, size_t nmemb, size_t size, int flags)
+{
+       if (((nmemb >= MUL_NO_OVERFLOW) || (size >= MUL_NO_OVERFLOW)) &&
+           (nmemb > 0) && ((SIZE_MAX / nmemb) < size)) {
+               return NULL;
+       }
+       return krealloc(optr, size * nmemb, flags);
+}