记录一次很憨皮的linux oops
我是调试自己加的代码时候出现的,这个opps很简单,主要是自己写代码时候不认真导致的。
1 [ 1030.637990] BUG: unable to handle page fault for address: ffffffffc157b910 2 [ 1030.637997] #PF: supervisor read access in kernel mode 3 [ 1030.638001] #PF: error_code(0x0000) - not-present page 4 [ 1030.638004] PGD 7da0e067 P4D 7da0e067 PUD 7da10067 PMD 0 5 [ 1030.638013] Oops: 0000 [#1] SMP PTI 6 [ 1030.638019] CPU: 1 PID: 6383 Comm: cat Tainted: G OE 5.3.18 #1 7 [ 1030.638022] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 04/13/2018 8 [ 1030.638034] RIP: 0010:MatchFireWallRule+0x53/0xc0 [wrapfs] 9 [ 1030.638040] Code: 00 48 83 c7 01 01 c2 0f be 07 84 c0 75 ed 89 d0 25 ff ff ff 7f 48 8d 14 c5 80 c4 86 c0 49 c7 45 00 00 00 00 00 41 c6 45 08 00 <48> 8b 1a b8 fe ff ff ff 48 85 db 74 48 48 83 eb 40 75 14 eb 40 48 10 [ 1030.638044] RSP: 0018:ffffbb71c09c78b0 EFLAGS: 00010202 11 [ 1030.638048] RAX: 00000000001a1e92 RBX: ffffbb71c09c7ac9 RCX: 0000000000000000 12 [ 1030.638051] RDX: ffffffffc157b910 RSI: ffffbb71c09c79e0 RDI: ffff8f2e9c9e2233 13 [ 1030.638054] RBP: ffffbb71c09c78c8 R08: ffffbb71c09c7890 R09: ffffbb71c09c7888 14 [ 1030.638057] R10: ffff8f2eb473a840 R11: ffffbb71c09c7884 R12: ffffbb71c09c79e0 15 [ 1030.638060] R13: ffffbb71c09c78d8 R14: ffff8f2e99ce5500 R15: 0000000000000000 16 [ 1030.638064] FS: 00007f9256d05540(0000) GS:ffff8f2eb8440000(0000) knlGS:0000000000000000 17 [ 1030.638068] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 18 [ 1030.638071] CR2: ffffffffc157b910 CR3: 000000000c458005 CR4: 00000000003606e0 19 [ 1030.638162] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 20 [ 1030.638166] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 21 [ 1030.638169] Call Trace: 22 [ 1030.638183] isolation_open+0x94/0x1d0 [wrapfs] 23 [ 1030.638194] ? get_page_from_freelist+0x145b/0x1470 24 [ 1030.638200] ? prep_new_page+0x130/0x160 25 [ 1030.638206] ? get_page_from_freelist+0x145b/0x1470 26 [ 1030.638213] ? xas_load+0xc/0x80 27 [ 1030.638221] ? pagecache_get_page+0x2c/0x2b0 28 [ 1030.638227] ? prep_new_page+0x90/0x160 29 [ 1030.638234] ? sched_clock+0x9/0x10 30 [ 1030.638238] ? sched_clock+0x9/0x10 31 [ 1030.638243] ? sched_clock_cpu+0x11/0xb0 32 [ 1030.638251] ? log_store.constprop.30+0x226/0x270 33 [ 1030.638257] ? _cond_resched+0x19/0x40 34 [ 1030.638262] ? dput+0x36/0x2f0 35 [ 1030.638269] ? dquot_file_open+0x17/0x40 36 [ 1030.638274] ? ext4_file_open+0x91/0x200 37 [ 1030.638279] ? ext4_file_read_iter+0xf0/0xf0 38 [ 1030.638286] ? wrapfs_dir_open+0x2c0/0x2c0 [wrapfs] 39 [ 1030.638292] ? wrapfs_dir_open+0x2c0/0x2c0 [wrapfs] 40 [ 1030.638297] wrapfs_open+0xf2/0x170 [wrapfs] 41 [ 1030.638304] do_dentry_open+0x1f8/0x3a0 42 [ 1030.638310] vfs_open+0x2f/0x40 43 [ 1030.638315] path_openat+0x2fb/0x1700 44 [ 1030.638361] ? unlock_page_memcg+0x12/0x20 45 [ 1030.638367] ? page_add_file_rmap+0x5e/0x150 46 [ 1030.638374] ? filemap_map_pages+0x18f/0x380 47 [ 1030.638380] do_filp_open+0x9b/0x110 48 [ 1030.638386] ? cp_new_stat+0x152/0x180 49 [ 1030.638392] ? __check_object_size+0xdb/0x1b0 50 [ 1030.638399] ? __alloc_fd+0x46/0x170 51 [ 1030.638405] do_sys_open+0x1ba/0x2e0 52 [ 1030.638411] ? do_sys_open+0x1ba/0x2e0 53 [ 1030.638498] ? __audit_syscall_exit+0x1e8/0x2a0 54 [ 1030.638516] __x64_sys_openat+0x20/0x30 55 [ 1030.638525] do_syscall_64+0x5a/0x130 56 [ 1030.638534] entry_SYSCALL_64_after_hwframe+0x44/0xa9 57 [ 1030.638540] RIP: 0033:0x7f9256817d9e 58 [ 1030.638547] Code: 25 00 00 41 00 3d 00 00 41 00 74 48 48 8d 05 71 0b 2e 00 8b 00 85 c0 75 69 89 f2 b8 01 01 00 00 48 89 fe bf 9c ff ff ff 0f 05 <48> 3d 00 f0 ff ff 0f 87 a6 00 00 00 48 8b 4c 24 28 64 48 33 0c 25 59 [ 1030.638551] RSP: 002b:00007ffe1d88d250 EFLAGS: 00000246 ORIG_RAX: 0000000000000101 60 [ 1030.638557] RAX: ffffffffffffffda RBX: 0000000000000001 RCX: 00007f9256817d9e 61 [ 1030.638560] RDX: 0000000000000000 RSI: 00007ffe1d88f2a3 RDI: 00000000ffffff9c 62 [ 1030.638563] RBP: 000055614b69eb80 R08: 0000000000000000 R09: 0000000000000000 63 [ 1030.638565] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 64 [ 1030.638568] R13: 00007ffe1d88d520 R14: 00007ffe1d88d528 R15: 0000000000020000 65 [ 1030.638573] Modules linked in: wrapfs(OE) vmw_vsock_vmci_transport vsock snd_ens1371 snd_ac97_codec gameport ac97_bus intel_rapl_msr snd_pcm intel_rapl_common crct10dif_pclmul crc32_pclmul ghash_clmulni_intel aesni_intel aes_x86_64 crypto_simd cryptd snd_seq_midi vmw_balloon snd_seq_midi_event glue_helper snd_rawmidi intel_rapl_perf vmwgfx snd_seq joydev input_leds serio_raw snd_seq_device ttm snd_timer drm_kms_helper drm snd soundcore vmw_vmci fb_sys_fops syscopyarea sysfillrect sysimgblt mac_hid binfmt_misc sch_fq_codel parport_pc ppdev lp parport ip_tables x_tables autofs4 vmw_pvscsi vmxnet3 hid_generic usbhid hid psmouse mptspi mptscsih mptbase ahci e1000 libahci scsi_transport_spi i2c_piix4 pata_acpi [last unloaded: wrapfs] 66 [ 1030.638635] CR2: ffffffffc157b910 67 [ 1030.638641] ---[ end trace c142af6a1de7a962 ]--- 68 [ 1030.638650] RIP: 0010:MatchFireWallRule+0x53/0xc0 [wrapfs] 69 [ 1030.638655] Code: 00 48 83 c7 01 01 c2 0f be 07 84 c0 75 ed 89 d0 25 ff ff ff 7f 48 8d 14 c5 80 c4 86 c0 49 c7 45 00 00 00 00 00 41 c6 45 08 00 <48> 8b 1a b8 fe ff ff ff 48 85 db 74 48 48 83 eb 40 75 14 eb 40 48 70 [ 1030.638658] RSP: 0018:ffffbb71c09c78b0 EFLAGS: 00010202 71 [ 1030.638662] RAX: 00000000001a1e92 RBX: ffffbb71c09c7ac9 RCX: 0000000000000000 72 [ 1030.638665] RDX: ffffffffc157b910 RSI: ffffbb71c09c79e0 RDI: ffff8f2e9c9e2233 73 [ 1030.638667] RBP: ffffbb71c09c78c8 R08: ffffbb71c09c7890 R09: ffffbb71c09c7888 74 [ 1030.638670] R10: ffff8f2eb473a840 R11: ffffbb71c09c7884 R12: ffffbb71c09c79e0 75 [ 1030.638672] R13: ffffbb71c09c78d8 R14: ffff8f2e99ce5500 R15: 0000000000000000 76 [ 1030.638677] FS: 00007f9256d05540(0000) GS:ffff8f2eb8440000(0000) knlGS:0000000000000000 77 [ 1030.638680] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 78 [ 1030.638683] CR2: ffffffffc157b910 CR3: 000000000c458005 CR4: 00000000003606e0 79 [ 1030.638761] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 80 [ 1030.638764] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
看到opps不要慌,内核栈回溯都出现了,就慢慢排查
首先看到这里 : isolation_open+0x94/0x1d0 [wrapfs]
发现wrapfs驱动有问题,那咋整,肯定是这样
objdump -S wrapfs.ko > wrapfs.s
先反汇编下来,慢慢找到对应那一行代码
拷贝wrapfs.s 里面的 isolation_open 反汇编的函数
1 int isolation_open(struct inode *inode, struct file *file) 2 { 3 39c0: e8 00 00 00 00 callq 39c5 <isolation_open+0x5> 4 39c5: 55 push %rbp 5 39c6: 48 89 e5 mov %rsp,%rbp 6 39c9: 41 56 push %r14 7 39cb: 41 55 push %r13 8 39cd: 41 54 push %r12 9 39cf: 53 push %rbx 10 39d0: 65 4c 8b 24 25 00 00 mov %gs:0x0,%r12 11 39d7: 00 00 12 39d9: 48 81 ec 10 03 00 00 sub $0x310,%rsp 13 char combine_path[256]; 14 char *path_ptr; 15 struct wrapfs_file_info *fileinfo; 16 FileRule Rule; 17 struct file *filep; 18 struct file *lower_file = wrapfs_lower_file(file); 19 39e0: 4c 8b ae c8 00 00 00 mov 0xc8(%rsi),%r13 20 { 21 39e7: 65 48 8b 04 25 28 00 mov %gs:0x28,%rax 22 39ee: 00 00 23 39f0: 48 89 45 d8 mov %rax,-0x28(%rbp) 24 39f4: 31 c0 xor %eax,%eax 25 low_path[0] = 0; 26 combine_path[0] = 0; 27 28 fileinfo = (struct wrapfs_file_info *)file->private_data; 29 30 if (current->fs == NULL) { 31 39f6: 49 83 bc 24 b0 0a 00 cmpq $0x0,0xab0(%r12) 32 39fd: 00 00 33 39ff: 4d 8b 75 00 mov 0x0(%r13),%r14 34 low_path[0] = 0; 35 3a03: c6 85 d8 fd ff ff 00 movb $0x0,-0x228(%rbp) 36 combine_path[0] = 0; 37 3a0a: c6 85 d8 fe ff ff 00 movb $0x0,-0x128(%rbp) 38 if (current->fs == NULL) { 39 3a11: 0f 84 49 01 00 00 je 3b60 <isolation_open+0x1a0> 40 pr_info("current->fs == NULL, current task name:%s\n", current->comm); 41 goto out_err; 42 } 43 44 path_ptr = file_path(lower_file, low_path, 256); 45 3a17: 48 8d b5 d8 fd ff ff lea -0x228(%rbp),%rsi 46 3a1e: ba 00 01 00 00 mov $0x100,%edx 47 3a23: 4c 89 f7 mov %r14,%rdi 48 3a26: e8 00 00 00 00 callq 3a2b <isolation_open+0x6b> 49 50 if (!path_ptr) { 51 3a2b: 48 85 c0 test %rax,%rax 52 path_ptr = file_path(lower_file, low_path, 256); 53 3a2e: 48 89 c3 mov %rax,%rbx 54 if (!path_ptr) { 55 3a31: 0f 84 46 01 00 00 je 3b7d <isolation_open+0x1bd> 56 } 57 58 // 59 // 从防火墙中匹配 60 // 61 err = MatchFireWallRule(current->comm, low_path, &Rule); 62 3a37: 49 81 c4 70 0a 00 00 add $0xa70,%r12 63 3a3e: 48 8d 95 d0 fc ff ff lea -0x330(%rbp),%rdx 64 3a45: 48 8d b5 d8 fd ff ff lea -0x228(%rbp),%rsi 65 3a4c: 4c 89 e7 mov %r12,%rdi 66 3a4f: e8 00 00 00 00 callq 3a54 <isolation_open+0x94> 67 68 fileinfo->flag = Rule.flag; 69 3a54: 8b 95 d0 fc ff ff mov -0x330(%rbp),%edx 70 fileinfo->WriteBack = Rule.WriteBack; 71 72 73 if (IS_ERR_VALUE((void *)err)) { 74 3a5a: 3d 00 f0 ff ff cmp $0xfffff000,%eax 75 fileinfo->flag = Rule.flag; 76 3a5f: 41 89 55 10 mov %edx,0x10(%r13) 77 fileinfo->WriteBack = Rule.WriteBack; 78 3a63: 8b 95 d4 fc ff ff mov -0x32c(%rbp),%edx 79 3a69: 41 89 55 14 mov %edx,0x14(%r13) 80 if (IS_ERR_VALUE((void *)err)) { 81 3a6d: 0f 87 a8 00 00 00 ja 3b1b <isolation_open+0x15b> 82 goto out_err; 83 } 84 85 86 pr_info("taks : %s, open file : %s\n", current->comm, path_ptr); 87 3a73: 48 89 da mov %rbx,%rdx 88 3a76: 4c 89 e6 mov %r12,%rsi 89 3a79: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 90 3a80: e8 00 00 00 00 callq 3a85 <isolation_open+0xc5> 91 if (strlcat(p, q, p_size) >= p_size) 92 3a85: 48 8d 85 d0 fc ff ff lea -0x330(%rbp),%rax 93 3a8c: 48 8d bd d8 fe ff ff lea -0x128(%rbp),%rdi 94 3a93: ba 00 01 00 00 mov $0x100,%edx 95 3a98: 48 8d 70 08 lea 0x8(%rax),%rsi 96 3a9c: e8 00 00 00 00 callq 3aa1 <isolation_open+0xe1> 97 3aa1: 48 3d ff 00 00 00 cmp $0xff,%rax 98 3aa7: 0f 87 a7 00 00 00 ja 3b54 <isolation_open+0x194> 99 3aad: 48 8d bd d8 fe ff ff lea -0x128(%rbp),%rdi 100 3ab4: ba 00 01 00 00 mov $0x100,%edx 101 3ab9: 48 89 de mov %rbx,%rsi 102 3abc: e8 00 00 00 00 callq 3ac1 <isolation_open+0x101> 103 3ac1: 48 3d ff 00 00 00 cmp $0xff,%rax 104 3ac7: 0f 87 87 00 00 00 ja 3b54 <isolation_open+0x194> 105 // 拷贝映射后的路径 106 // 107 strcat(combine_path, Rule.MapPath); 108 strcat(combine_path, path_ptr); 109 110 pr_info("taks : %s, full file : %s\n", current->comm, combine_path); 111 3acd: 48 8d 95 d8 fe ff ff lea -0x128(%rbp),%rdx 112 3ad4: 4c 89 e6 mov %r12,%rsi 113 3ad7: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 114 3ade: e8 00 00 00 00 callq 3ae3 <isolation_open+0x123> 115 116 filep = must_create_mkfile( combine_path, 117 3ae3: 48 8d bd d8 fe ff ff lea -0x128(%rbp),%rdi 118 3aea: ba ff 01 00 00 mov $0x1ff,%edx 119 3aef: be 42 02 00 00 mov $0x242,%esi 120 3af4: e8 00 00 00 00 callq 3af9 <isolation_open+0x139> 121 //O_TRUNC | O_RDWR | O_CREAT | file->f_flags, 122 O_TRUNC | O_RDWR | O_CREAT, 123 S_IRWXG | S_IRWXU | S_IRWXO); 124 if (IS_ERR(filep)) { 125 3af9: 48 3d 00 f0 ff ff cmp $0xfffffffffffff000,%rax 126 filep = must_create_mkfile( combine_path, 127 3aff: 48 89 c3 mov %rax,%rbx 128 if (IS_ERR(filep)) { 129 3b02: 77 36 ja 3b3a <isolation_open+0x17a> 130 pr_info("taks : %s, open file :%s fail!!!\n", current->comm, combine_path); 131 err = PTR_ERR(filep); 132 goto out_err; 133 } 134 135 lower_file->f_mode |= (FMODE_WRITE | FMODE_CAN_WRITE | FMODE_READ | FMODE_CAN_READ); 136 3b04: 41 81 4e 44 03 00 06 orl $0x60003,0x44(%r14) 137 3b0b: 00 138 fileinfo->wrapfs_file = filep; 139 140 err = copy_file(filep, lower_file); 141 3b0c: 4c 89 f6 mov %r14,%rsi 142 fileinfo->wrapfs_file = filep; 143 3b0f: 49 89 45 08 mov %rax,0x8(%r13) 144 err = copy_file(filep, lower_file); 145 3b13: 48 89 c7 mov %rax,%rdi 146 3b16: e8 65 f9 ff ff callq 3480 <copy_file> 147 148 out_err: 149 return err; 150 151 }
先进行简单计算: isolation_open+0x94, isolation_open = 0x39c0
那么: isolation_open+0x94 = 0x3a54
这个0x3a54恰好是callq 3a54 <isolation_open+0x94> 这的下面一行,说明调用个函数,应该调用了
MatchFireWallRule(current->comm, low_path, &Rule);这个函数,好继续分析这个函数,
[ 1030.638034] RIP: 0010:MatchFireWallRule+0x53/0xc0 [wrapfs]
最后暴露问题是这个函数:
MatchFireWallRule+0x53
1 extern int MatchFireWallRule(char *ProcessName, char *Path, PFileRule Rule) 2 { 3 32f0: e8 00 00 00 00 callq 32f5 <MatchFireWallRule+0x5> 4 32f5: 55 push %rbp 5 32f6: 48 89 e5 mov %rsp,%rbp 6 32f9: 41 55 push %r13 7 32fb: 41 54 push %r12 8 32fd: 53 push %rbx 9 while (*str) { 10 32fe: 0f be 07 movsbl (%rdi),%eax 11 { 12 3301: 49 89 d5 mov %rdx,%r13 //rdx -> Rule, rdi -> ProcessName, rsi -> Path 13 3304: 49 89 f4 mov %rsi,%r12 14 3307: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 15 while (*str) { 16 330e: 84 c0 test %al,%al 17 3310: 74 24 je 3336 <MatchFireWallRule+0x46> 18 unsigned int hash = 0; 19 3312: 31 d2 xor %edx,%edx 20 hash = hash * seed + (*str++); 21 3314: 69 d2 83 00 00 00 imul $0x83,%edx,%edx 22 331a: 48 83 c7 01 add $0x1,%rdi 23 331e: 01 c2 add %eax,%edx 24 while (*str) { 25 3320: 0f be 07 movsbl (%rdi),%eax 26 3323: 84 c0 test %al,%al 27 3325: 75 ed jne 3314 <MatchFireWallRule+0x24> 28 3327: 89 d0 mov %edx,%eax 29 3329: 25 ff ff ff 7f and $0x7fffffff,%eax 30 332e: 48 8d 14 c5 00 00 00 lea 0x0(,%rax,8),%rdx 31 3335: 00 32 // ProcessName hash 33 // 34 hash1 = BKDRHash(ProcessName); 35 head1 = &FireWallByProcess[hash1]; 36 37 Rule->flag = FILE_RULE_NOTWORK; 38 3336: 49 c7 45 00 00 00 00 movq $0x0,0x0(%r13) 39 333d: 00 40 Rule->WriteBack = FIREWALL_NOT_WRITE_BACK; 41 333e: 41 c6 45 08 00 movb $0x0,0x8(%r13) 42 3343: 48 8b 1a mov (%rdx),%rbx 43 int status = -ENOENT; 44 3346: b8 fe ff ff ff mov $0xfffffffe,%eax 45 // 46 // 打开RCU Lock 开始读,完事 47 // 48 rcu_read_lock(); 49 50 hlist_for_each_entry_rcu(pFireWallRule, head1, ProcessNameHashNode) { 51 334b: 48 85 db test %rbx,%rbx 52 334e: 74 48 je 3398 <MatchFireWallRule+0xa8> 53 3350: 48 83 eb 40 sub $0x40,%rbx 54 3354: 75 14 jne 336a <MatchFireWallRule+0x7a> 55 3356: eb 40 jmp 3398 <MatchFireWallRule+0xa8> 56 3358: 48 8b 43 40 mov 0x40(%rbx),%rax 57 335c: 48 85 c0 test %rax,%rax 58 335f: 74 3e je 339f <MatchFireWallRule+0xaf> 59 3361: 48 83 e8 40 sub $0x40,%rax 60 3365: 48 89 c3 mov %rax,%rbx 61 3368: 74 35 je 339f <MatchFireWallRule+0xaf> 62 if (Match(Path, pFireWallRule->FileType)) { 63 336a: 48 8d 73 24 lea 0x24(%rbx),%rsi 64 336e: 4c 89 e7 mov %r12,%rdi 65 3371: e8 00 00 00 00 callq 3376 <MatchFireWallRule+0x86> 66 3376: 85 c0 test %eax,%eax 67 3378: 74 de je 3358 <MatchFireWallRule+0x68> 68 status = 0; 69 Rule->flag = FILE_RULE_WORK; 70 337a: 41 c7 45 00 01 00 00 movl $0x1,0x0(%r13) 71 3381: 00 72 Rule->WriteBack = pFireWallRule->WriteBack; 73 3382: 8b 43 3c mov 0x3c(%rbx),%eax 74 return __underlying_strcat(p, q); 75 3385: 49 8d 7d 08 lea 0x8(%r13),%rdi 76 3389: 41 89 45 04 mov %eax,0x4(%r13) 77 338d: 48 8b 73 30 mov 0x30(%rbx),%rsi 78 3391: e8 00 00 00 00 callq 3396 <MatchFireWallRule+0xa6> 79 status = 0; 80 3396: 31 c0 xor %eax,%eax 81 // 82 out : 83 rcu_read_unlock(); 84 85 return status; 86 }
1 // 2 // 这个字符串hash不知道效果怎么样,听说不错,"针不戳" 3 // 4 static unsigned int BKDRHash(char *str) 5 { 6 unsigned int seed = 131; // 31 131 1313 13131 131313 etc.. 7 unsigned int hash = 0; 8 9 while (*str) { 10 hash = hash * seed + (*str++); 11 } 12 // 13 // 此处自己挖了个坑,最后结果忘记 and ((1 << HASH_TABLE_BITS) - 1)),造成溢出,参见 oops1 和 oops2 14 // 15 return ((hash) //((1 << HASH_TABLE_BITS) - 1)); 16 } 17 extern int MatchFireWallRule(char *ProcessName, char *Path, PFileRule Rule) 18 { 19 int hash1; 20 struct hlist_head *head1; 21 int status = -ENOENT; 22 PFireWallRule pFireWallRule = NULL; 23 // 24 // ProcessName hash 25 // 26 hash1 = BKDRHash(ProcessName); 27 head1 = &FireWallByProcess[hash1]; 28 29 Rule->flag = FILE_RULE_NOTWORK; 30 Rule->WriteBack = FIREWALL_NOT_WRITE_BACK; 31 Rule->MapPath[0] = 0; 32 33 // 34 // 打开RCU Lock 开始读,完事 35 // 36 rcu_read_lock(); 37 38 hlist_for_each_entry_rcu(pFireWallRule, head1, ProcessNameHashNode) { 39 // 40 // mark for debug 41 // pr_err("Match pre: processName : %s, path : %s, filetype: %s\n", ProcessName, Path, pFireWallRule->FileType); 42 // 43 if (Match(Path, pFireWallRule->FileType)) { 44 // 45 // mark for debug 46 // pr_err("Match OK: path : %s, filetype: %s\n", Path, pFireWallRule->FileType); 47 // 48 status = 0; 49 Rule->flag = FILE_RULE_WORK; 50 Rule->WriteBack = pFireWallRule->WriteBack; 51 strcat(Rule->MapPath, pFireWallRule->MapPath); 52 goto out; 53 } 54 } 55 // 56 // 关闭 RCU Lock ,回家,返回 57 // 58 out : 59 rcu_read_unlock(); 60 61 return status; 62 }
配合反汇编和源代码,好像gcc把BKDRHash给inline了,
哎呦,突然发现,我忘了给hash 取模 了,妈的,超出hash 表范围了,取模后好了,
所有说这就很憨