Loading...
libkern/c++/priority_queue.cpp xnu-7195.141.2 xnu-8020.121.3
--- xnu/xnu-7195.141.2/libkern/c++/priority_queue.cpp
+++ xnu/xnu-8020.121.3/libkern/c++/priority_queue.cpp
@@ -29,6 +29,9 @@
 #if KERNEL
 #include <kern/priority_queue.h>
 #include <mach/vm_param.h>
+#if CONFIG_KERNEL_TBI && KASAN_TBI
+#include <san/kasan.h>
+#endif /* CONFIG_KERNEL_TBI && KASAN_TBI */
 
 #ifdef __LP64__
 static_assert(PRIORITY_QUEUE_ENTRY_CHILD_BITS >= VM_KERNEL_POINTER_SIGNIFICANT_BITS,
@@ -128,12 +131,18 @@
 	static inline void
 	pack_child(entry_t e, const entry_t child)
 	{
+#if CONFIG_KERNEL_TBI && KASAN_TBI
+		e->tag = kasan_tbi_get_tag((long)child);
+#endif /* CONFIG_KERNEL_TBI && KASAN_TBI */
 		e->child = (long)child;
 	}
 
 	static inline entry_t
 	unpack_child(entry_t e)
 	{
+#if CONFIG_KERNEL_TBI && KASAN_TBI
+		return (entry_t)(kasan_tbi_tag_ptr(e->child, e->tag));
+#endif /* CONFIG_KERNEL_TBI && KASAN_TBI */
 		return (entry_t)e->child;
 	}
 
@@ -340,11 +349,17 @@
 			remove_root(que, elt);
 			elt->next = elt->prev = NULL;
 			elt->child = 0;
+#if CONFIG_KERNEL_TBI && KASAN_TBI
+			elt->tag = 0;
+#endif /* CONFIG_KERNEL_TBI && KASAN_TBI */
 			return true;
 		} else {
 			remove_non_root(que, elt);
 			elt->next = elt->prev = NULL;
 			elt->child = 0;
+#if CONFIG_KERNEL_TBI && KASAN_TBI
+			elt->tag = 0;
+#endif
 			return false;
 		}
 	}