]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
mcheck: integrate mcheck into dlmalloc.c
authorEugene Uriev <eugeneuriev@gmail.com>
Sun, 31 Mar 2024 20:03:22 +0000 (23:03 +0300)
committerTom Rini <trini@konsulko.com>
Fri, 12 Apr 2024 22:23:06 +0000 (16:23 -0600)
This changes are probable worth to be generalized in a
separate .h-file so, making it able to cover
libc-mallocs and others, without too much copy-paste.

But the malloc<=>mALLOc substitutions interfere
with an elegant way to do this.

Signed-off-by: Eugene Uriev <eugeneuriev@gmail.com>
common/dlmalloc.c

index 0813e7e8b10ddaa80b67f0d23a075376c8f87d6a..8de15d71932576e77cba32b61d1672bea39ae3ca 100644 (file)
@@ -2225,6 +2225,73 @@ void cfree(mem) Void_t *mem;
 #endif
 
 
+#ifdef MCHECK_HEAP_PROTECTION
+ #include "mcheck_core.inc.h"
+ #if !__STD_C
+  #error "must have __STD_C"
+ #endif
+
+Void_t *mALLOc(size_t bytes)
+{
+       size_t fullsz = mcheck_alloc_prehook(bytes);
+       void *p = mALLOc_impl(fullsz);
+
+       if (!p)
+               return p;
+       return mcheck_alloc_posthook(p, bytes);
+}
+
+void fREe(Void_t *mem) { fREe_impl(mcheck_free_prehook(mem)); }
+
+Void_t *rEALLOc(Void_t *oldmem, size_t bytes)
+{
+       if (bytes == 0) {
+               if (oldmem)
+                       fREe(oldmem);
+               return NULL;
+       }
+
+       if (oldmem == NULL)
+               return mALLOc(bytes);
+
+       void *p = mcheck_reallocfree_prehook(oldmem);
+       size_t newsz = mcheck_alloc_prehook(bytes);
+
+       p = rEALLOc_impl(p, newsz);
+       if (!p)
+               return p;
+       return mcheck_alloc_noclean_posthook(p, bytes);
+}
+
+Void_t *mEMALIGn(size_t alignment, size_t bytes)
+{
+       return NULL;
+}
+
+// pvALLOc, vALLOc - redirect to mEMALIGn, defined here, so they need no wrapping.
+
+Void_t *cALLOc(size_t n, size_t elem_size)
+{
+       // NB: here is no overflow check.
+       size_t fullsz = mcheck_alloc_prehook(n * elem_size);
+       void *p = cALLOc_impl(1, fullsz);
+
+       if (!p)
+               return p;
+       return mcheck_alloc_noclean_posthook(p, n * elem_size);
+}
+
+// mcheck API {
+int mcheck(mcheck_abortfunc_t f)
+{
+       mcheck_initialize(f, 0);
+       return 0;
+}
+
+enum mcheck_status mprobe(void *__ptr) { return mcheck_mprobe(__ptr); }
+// mcheck API }
+#endif
+
 
 /*