Hi Alexander,
thanks for your explanations.
On 19.04.2012 17:36, Alexander Warg wrote:
Yes, you missed the rights assigned to the capabilities. Two capabilities are equal if they are exactly equal. This means they must point to the same object and have exactly the same rights.
Ok, in that case I think the documentation is misleading, citation:
"Test if two capabilities point to the same object."
Nevertheless, I already recognized the rights being encountered in the comparison when looking at the kernel-source. From my understanding the two least significant bits of the kobject_iface pointer are used for that. But they're equal in my situation, as well as the kernel-object the capabilities point to. Nevertheless, the kobject_iface pointer differs between both. When using the original source and adding the following prints to Task::sys_caps_equal:
printf("cap a: kobject=%lx rights=%x obj()=%lx\n", c_a.obj()->kobject_start_addr(), c_a.rights(), c_a.obj()); printf("cap b: kobject=%lx rights=%x obj()=%lx\n", c_b.obj()->kobject_start_addr(), c_b.rights(), c_b.obj()); printf("a == b ? %x\n", (c_a == c_b));
I get for instance the following output:
cap a: kobject=fd9b4ec0 rights=3 obj()=fd9b4efc cap b: kobject=fd9b4ec0 rights=3 obj()=fd9b4ec0 a == b ? 0
Can you please shed light on this behaviour? In what situation do I have differing kobject_iface objects (with the same rights) that represent actually the same kobject?
The patch uses a debugging feature of the Kobject class and additionally removes the rights check. Note, the object pointers in two capabilities may also differ if they point to the same kernel object but have different rights!
Sorry, I didn't recognized "kobject_start_addr()" being a debugging feature. The patch just circumnavigated my actual problem. I didn't wanted you to apply it mainline ;-).
Regards Stefan