The routine XORs the given pointer with a random value producing an ID (32 or 64 bit, depending on the arch). Since it's a valuable information -- only CAP_SYS_ADMIN is allowed to obtain it. Based-on-patch-from: Pavel Emelyanov Signed-off-by: Cyrill Gorcunov CC: Glauber Costa CC: Andi Kleen CC: Tejun Heo CC: Matt Helsley CC: Pekka Enberg CC: Eric Dumazet CC: Vasiliy Kulikov CC: Andrew Morton --- include/linux/mm.h | 10 ++++++++++ mm/Kconfig | 16 ++++++++++++++++ mm/util.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) Index: linux-2.6.git/include/linux/mm.h =================================================================== --- linux-2.6.git.orig/include/linux/mm.h +++ linux-2.6.git/include/linux/mm.h @@ -1640,5 +1640,15 @@ extern void copy_user_huge_page(struct p unsigned int pages_per_huge_page); #endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLBFS */ +enum { + GEN_OBJ_ID_TYPES, +}; + +#ifdef CONFIG_GENERIC_OBJECT_IDS +unsigned long gen_obj_id(void *ptr, int type); +#else +static inline unsigned long gen_obj_id(void *ptr, int type) { return 0; } +#endif + #endif /* __KERNEL__ */ #endif /* _LINUX_MM_H */ Index: linux-2.6.git/mm/Kconfig =================================================================== --- linux-2.6.git.orig/mm/Kconfig +++ linux-2.6.git/mm/Kconfig @@ -373,3 +373,19 @@ config CLEANCACHE in a negligible performance hit. If unsure, say Y to enable cleancache + +config GENERIC_OBJECT_IDS + bool "Enable generic object ids infrastructure" + depends on CHECKPOINT_RESTORE + default n + help + Turn on the functionality that can generate IDs for kernel + objects, which are exported to userspace via /proc filesystem. + + It is useful if you need to examinate kernel objects and test + if they are shared between several tasks. These IDs should never + be used for anything but the "sameness" test. Besides, the IDs are + dynamic and valid only while object is alive, once it get freed or + kernel is rebooted -- the IDs will be changed. + + If unsure, say N here. Index: linux-2.6.git/mm/util.c =================================================================== --- linux-2.6.git.orig/mm/util.c +++ linux-2.6.git/mm/util.c @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include #include "internal.h" @@ -307,3 +309,50 @@ EXPORT_TRACEPOINT_SYMBOL(kmalloc_node); EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc_node); EXPORT_TRACEPOINT_SYMBOL(kfree); EXPORT_TRACEPOINT_SYMBOL(kmem_cache_free); + +#ifdef CONFIG_GENERIC_OBJECT_IDS +static unsigned long gen_obj_cookie[GEN_OBJ_ID_TYPES] __read_mostly; + +unsigned long gen_obj_id(void *ptr, int type) +{ + if (!capable(CAP_SYS_ADMIN) || !ptr) + return 0; + + BUG_ON(type >= GEN_OBJ_ID_TYPES); + + /* + * Note the simple XOR is used here not in a sake + * of security by any means, but rather to break + * an "impression" that such IDs means something + * other than a number which can be used for comparison + * with another number generated by this helper only. + */ + return ((unsigned long)ptr) ^ gen_obj_cookie[type]; +} + +static __init int gen_obj_cookie_init(void) +{ +#if BITS_PER_LONG == 64 + const unsigned long emergency_cookie = 0xefcdab8967452301; +#else + const unsigned long emergency_cookie = 0x98badcf9; +#endif + int i; + + for (i = 0; i < GEN_OBJ_ID_TYPES; i++) { + get_random_bytes(&gen_obj_cookie[i], + sizeof(unsigned long)); + /* + * In 'impossible' case of random-bytes = 0 + * we still would have non-zero value. + */ + gen_obj_cookie[i] = + (gen_obj_cookie[i] & __PAGE_OFFSET) + + (emergency_cookie & ~__PAGE_OFFSET); + } + + return 0; +} + +late_initcall(gen_obj_cookie_init); +#endif -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/