PID: 3311 TASK: ffff880137798000 CPU: 0 COMMAND: "yyyyyy"
#0 [ffff88013a603d18] machine_kexec at ffffffff81047b02
#1 [ffff88013a603d68] crash_kexec at ffffffff810d0f33
#2 [ffff88013a603e30] panic at ffffffff81640209
#3 [ffff88013a603ea8] watchdog_timer_fn at ffffffff810f51c5
#4 [ffff88013a603ed8] __run_hrtimer at ffffffff8108bc73
#5 [ffff88013a603f18] hrtimer_interrupt at ffffffff8108c487
#6 [ffff88013a603f80] local_apic_timer_interrupt at ffffffff81040a67
#7 [ffff88013a603f98] smp_apic_timer_interrupt at ffffffff8165563f
#8 [ffff88013a603fb0] apic_timer_interrupt at ffffffff81653fdd
--- <IRQ stack> ---
#9 [ffff88011a039a08] apic_timer_interrupt at ffffffff81653fdd
[exception RIP: lg_local_lock+50]
RIP: ffffffff81090712 RSP: ffff88011a039ab8 RFLAGS: 00000297
RAX: 0000000000000070 RBX: 00007fffa0c577ce RCX: 0000000000000071
RDX: ffff88013a6105f4 RSI: ffff880137832010 RDI: ffffffff81c670d0
RBP: ffff88011a039ab8 R8: 0000000000017000 R9: ffff880137832000
R10: ffff880137832010 R11: 0000000000000007 R12: 00007fffa0c587ce
R13: 0000000000000000 R14: 000000160133654c R15: 0000000000000010
ORIG_RAX: ffffffffffffff10 CS: 0010 SS: 0018
#10 [ffff88011a039ac0] d_path at ffffffff811bdec2
#11 [ffff88011a039b00] uuu_file_path at ffffffffa03b3f10 [xxxxx]
#12 [ffff88011a039b10] ddd_task_path at ffffffffa03b3f8f [xxxxx]
#13 [ffff88011a039b48] default_dir_get_obj at ffffffffa03c27d8 [xxxxx]
#14 [ffff88011a039ba0] bfx_dir_logic at ffffffffa03c3931 [xxxxx]
#15 [ffff88011a039bf0] my_security_inode_permission at ffffffffa03be1cf [xxxxx]
#16 [ffff88011a039c28] __inode_permission at ffffffff811b43ac
#17 [ffff88011a039c48] inode_permission at ffffffff811b4428
#18 [ffff88011a039c58] link_path_walk at ffffffff811b4974
#19 [ffff88011a039cf8] path_openat at ffffffff811b818c
#20 [ffff88011a039d98] do_filp_open at ffffffff811b8e4a
#21 [ffff88011a039e60] open_exec at ffffffff811af633
#22 [ffff88011a039ea8] do_execve_common at ffffffff811b03b0
#23 [ffff88011a039f28] sys_execve at ffffffff811b0b26
#24 [ffff88011a039f50] stub_execve at ffffffff81653989
RIP: 00000030d02bcdc7 RSP: 00007fffa0c53388 RFLAGS: 00000246
RAX: 000000000000003b RBX: 0000000000000028 RCX: ffffffffffffffff
RDX: 00007fffa0c562f8 RSI: 00007fffa0c533c0 RDI: 00000030d037906c
RBP: 0000000000000004 R8: 00007fffa0c533d8 R9: 0000000000000000
R10: 00007fba2b8fea10 R11: 0000000000000246 R12: 0000000000000003
R13: 00000030d037906c R14: 00007fffa0c533c0 R15: 00007fffa0c533c0
ORIG_RAX: 000000000000003b CS: 0033 SS: 002b
分析:
1.在这个path_openat里面的path_init-->lock_rcu_walk()加锁;
2.然后接下来调用该函数调用may_lookup-->inode_permision;
3.被my_security_inode_permission函数做了自己的逻辑处理;
4.myhook函数调用d_path会再次调用lock_rcu_walk()加锁,但该锁不可重入,导致crash。
备注:内核版本3.11.10