Page MenuHomeFreeBSD

D22790.id.diff
No OneTemporary

D22790.id.diff

Index: head/share/man/man9/malloc.9
===================================================================
--- head/share/man/man9/malloc.9
+++ head/share/man/man9/malloc.9
@@ -49,6 +49,8 @@
.Fn mallocarray "size_t nmemb" "size_t size" "struct malloc_type *type" "int flags"
.Ft void
.Fn free "void *addr" "struct malloc_type *type"
+.Ft void
+.Fn zfree "void *addr" "struct malloc_type *type"
.Ft void *
.Fn realloc "void *addr" "size_t size" "struct malloc_type *type" "int flags"
.Ft void *
@@ -105,6 +107,19 @@
then
.Fn free
does nothing.
+.Pp
+Like
+.Fn free ,
+the
+.Fn zfree
+function releases memory at address
+.Fa addr
+that was previously allocated by
+.Fn malloc
+for re-use.
+However,
+.Fn zfree
+will zero the memory before it is released.
.Pp
The
.Fn realloc
Index: head/sys/kern/kern_malloc.c
===================================================================
--- head/sys/kern/kern_malloc.c
+++ head/sys/kern/kern_malloc.c
@@ -820,6 +820,48 @@
malloc_type_freed(mtp, size);
}
+/*
+ * zfree:
+ *
+ * Zero then free a block of memory allocated by malloc.
+ *
+ * This routine may not block.
+ */
+void
+zfree(void *addr, struct malloc_type *mtp)
+{
+ uma_zone_t zone;
+ uma_slab_t slab;
+ u_long size;
+
+#ifdef MALLOC_DEBUG
+ if (free_dbg(&addr, mtp) != 0)
+ return;
+#endif
+ /* free(NULL, ...) does nothing */
+ if (addr == NULL)
+ return;
+
+ vtozoneslab((vm_offset_t)addr & (~UMA_SLAB_MASK), &zone, &slab);
+ if (slab == NULL)
+ panic("free: address %p(%p) has not been allocated.\n",
+ addr, (void *)((u_long)addr & (~UMA_SLAB_MASK)));
+
+ if (__predict_true(!malloc_large_slab(slab))) {
+ size = zone->uz_size;
+#ifdef INVARIANTS
+ free_save_type(addr, mtp, size);
+#endif
+ explicit_bzero(addr, size);
+ uma_zfree_arg(zone, addr, slab);
+ } else {
+ size = malloc_large_size(slab);
+ explicit_bzero(addr, size);
+ free_large(addr, size);
+ }
+ malloc_type_freed(mtp, size);
+}
+
void
free_domain(void *addr, struct malloc_type *mtp)
{
Index: head/sys/sys/malloc.h
===================================================================
--- head/sys/sys/malloc.h
+++ head/sys/sys/malloc.h
@@ -179,6 +179,7 @@
unsigned long alignment, vm_paddr_t boundary)
__malloc_like __result_use_check __alloc_size(1) __alloc_align(7);
void free(void *addr, struct malloc_type *type);
+void zfree(void *addr, struct malloc_type *type);
void free_domain(void *addr, struct malloc_type *type);
void *malloc(size_t size, struct malloc_type *type, int flags) __malloc_like
__result_use_check __alloc_size(1);

File Metadata

Mime Type
text/plain
Expires
Wed, May 20, 6:27 AM (3 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33338680
Default Alt Text
D22790.id.diff (2 KB)

Event Timeline