Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

breakage in kern_event.c



Rev 1.90 seems to have introduced the following panic - easily reproducible by executing "cd /usr/tests/kernel/kqueue ; atf-run t_proc2"

Here's the result:
kernel/kqueue/t_proc2 (67/699): 1 test cases
    proc2: uvm_fault(0xfffffe803f52d178, 0x0, 1) -> e
fatal page fault in supervisor mode
trap type 6 code 0 rip 0xffffffff809350b1 cs 0x8 rflags 0x202 cr2 0x40 ilevel 0 rsp 0xfffffe800386cc60
curlwp 0xfffffe803fa4f5a0 pid 6224.1 lowest kstack 0xfffffe80038692c0
panic: trap
cpu0: Begin traceback...
vpanic() at netbsd:vpanic+0x140
snprintf() at netbsd:snprintf
trap() at netbsd:trap+0xc6b
--- trap (number 6) ---
kqueue_register() at netbsd:kqueue_register+0x45a
filt_proc() at netbsd:filt_proc+0x154
knote() at netbsd:knote+0x40
fork1() at netbsd:fork1+0x670
sys_fork() at netbsd:sys_fork+0x32
syscall() at netbsd:syscall+0x1d8
--- syscall (number 2) ---
7b4a186ddf5a:
cpu0: End traceback...


A quick check shows that rev 1.90 replaced

 #ifdef DIAGNOSTIC
 				printf("%s: event not supported for file type"
 				    " %d\n", __func__, fp ? fp->f_type : -1);
 #endif

with

 #ifdef DIAGNOSTIC
 				printf("%s: event not supported for file type"
 				    " %d (error %d)\n", __func__,
 				    ((file_t *)kn->kn_obj)->f_type, error);
 #endif

The intent seems tobe to use the "real" fp value for finding and printing the file type.

However, it appears that kn->kn_obj is earlier initialized to fp, so if fp could be NULL, then kn->kn_obj can also be NULL. (See line 978)

The revised code no longer makes a check for NULL, so instead of just printing file type -1, it panics when dereferencing the pointer.

:(




+------------------+--------------------------+----------------------------+
| Paul Goyette     | PGP Key fingerprint:     | E-mail addresses:          |
| (Retired)        | FA29 0E3B 35AF E8AE 6651 | paul at whooppee dot com   |
| Kernel Developer | 0786 F758 55DE 53BA 7731 | pgoyette at netbsd dot org |
+------------------+--------------------------+----------------------------+


Home | Main Index | Thread Index | Old Index