Summary: | Fatal trap 12: rctl_enforce() at rctl_enforce | ||
---|---|---|---|
Product: | Base System | Reporter: | Jimmy Olgeni <olgeni> |
Component: | kern | Assignee: | Mateusz Guzik <mjg> |
Status: | Closed FIXED | ||
Severity: | Affects Only Me | CC: | mjg |
Priority: | --- | ||
Version: | 10.2-STABLE | ||
Hardware: | amd64 | ||
OS: | Any |
Description
Jimmy Olgeni
![]() ![]() This looks like a use-after-free I mentioned some time ago. do_fork makes newproc runnable and fork1 does not pin it in any way, thus by the time do_fork returns the process could have already exited. Interestingly do_fork itself has this problem. Here faulting address 0xa8 matches what would be linked list access in a struct racct if read pointer was null. Pointer in question is nullified on process exit and initialized on fork. I'll ponder a reasonable fix. (In reply to Mateusz Guzik from comment #1) Quick data point: I never saw this again so far (following -STABLE). Got something related today: FreeBSD olgeni 10.3-PRERELEASE FreeBSD 10.3-PRERELEASE #4 r296610: Thu Mar 10 11:09:56 CET 2016 root@olgeni:/usr/obj/usr/src/sys/KERNEL amd64 #0 doadump (textdump=1) at pcpu.h:219 #1 0xffffffff8096f557 in kern_reboot (howto=260) at /usr/src/sys/kern/kern_shutdown.c:486 #2 0xffffffff8096f955 in vpanic (fmt=<value optimized out>, ap=<value optimized out>) at /usr/src/sys/kern/kern_shutdown.c:889 #3 0xffffffff8096f7e3 in panic (fmt=0x0) at /usr/src/sys/kern/kern_shutdown.c:818 #4 0xffffffff80da757b in trap_fatal (frame=<value optimized out>, eva=<value optimized out>) at /usr/src/sys/amd64/amd64/trap.c:858 #5 0xffffffff80da787d in trap_pfault (frame=0xfffffe046a799860, usermode=<value optimized out>) at /usr/src/sys/amd64/amd64/trap.c:681 #6 0xffffffff80da6efa in trap (frame=0xfffffe046a799860) at /usr/src/sys/amd64/amd64/trap.c:447 #7 0xffffffff80d8c8e2 in calltrap () at /usr/src/sys/amd64/amd64/exception.S:236 #8 0xffffffff8096637c in rctl_enforce (p=0xfffff80412f379e0, resource=6, amount=0) at /usr/src/sys/kern/kern_rctl.c:350 #9 0xffffffff80964f1a in racct_proc_fork_done (child=0xfffff80412f379e0) at /usr/src/sys/kern/kern_racct.c:967 #10 0xffffffff8093785b in fork1 (td=<value optimized out>, flags=<value optimized out>, pages=Cannot access memory at address 0x4 ) at /usr/src/sys/kern/kern_fork.c:964 #11 0xffffffff809378ff in sys_vfork (td=0xfffff80101576960, uap=<value optimized out>) at /usr/src/sys/kern/kern_fork.c:153 #12 0xffffffff80da7f4f in amd64_syscall (td=0xfffff80101576960, traced=0) at subr_syscall.c:141 #13 0xffffffff80d8cbcb in Xfast_syscall () at /usr/src/sys/amd64/amd64/exception.S:396 #14 0x00000008017fa65d in ?? () Previous frame inner to this frame (corrupt stack?) Current language: auto; currently minimal Had a look with kgdb - it stops in "LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next)": #1 0xffffffff8096f557 in kern_reboot (howto=260) at /usr/src/sys/kern/kern_shutdown.c:486 486 doadump(TRUE); #2 0xffffffff8096f955 in vpanic (fmt=<value optimized out>, ap=<value optimized out>) at /usr/src/sys/kern/kern_shutdown.c:889 889 kern_reboot(bootopt); #3 0xffffffff8096f7e3 in panic (fmt=0x0) at /usr/src/sys/kern/kern_shutdown.c:818 818 vpanic(fmt, ap); #4 0xffffffff80da757b in trap_fatal (frame=<value optimized out>, eva=<value optimized out>) at /usr/src/sys/amd64/amd64/trap.c:858 858 panic("%s", trap_msg[type]); #5 0xffffffff80da787d in trap_pfault (frame=0xfffffe046a799860, usermode=<value optimized out>) at /usr/src/sys/amd64/amd64/trap.c:681 681 trap_fatal(frame, eva); #6 0xffffffff80da6efa in trap (frame=0xfffffe046a799860) at /usr/src/sys/amd64/amd64/trap.c:447 447 (void) trap_pfault(frame, FALSE); #7 0xffffffff80d8c8e2 in calltrap () at /usr/src/sys/amd64/amd64/exception.S:236 236 call trap Current language: auto; currently asm #8 0xffffffff8096637c in rctl_enforce (p=0xfffff80412f379e0, resource=6, amount=0) at /usr/src/sys/kern/kern_rctl.c:350 350 LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) { Current language: auto; currently minimal #9 0xffffffff80964f1a in racct_proc_fork_done (child=0xfffff80412f379e0) at /usr/src/sys/kern/kern_racct.c:967 967 rctl_enforce(child, RACCT_NPROC, 0); #10 0xffffffff8093785b in fork1 (td=<value optimized out>, flags=<value optimized out>, pages=Cannot access memory at address 0x4 ) at /usr/src/sys/kern/kern_fork.c:964 964 racct_proc_fork_done(newproc); #11 0xffffffff809378ff in sys_vfork (td=0xfffff80101576960, uap=<value optimized out>) at /usr/src/sys/kern/kern_fork.c:153 153 error = fork1(td, flags, 0, &p2, NULL, 0); #12 0xffffffff80da7f4f in amd64_syscall (td=0xfffff80101576960, traced=0) at subr_syscall.c:141 141 error = (sa->callp->sy_call)(td, sa->args); #13 0xffffffff80d8cbcb in Xfast_syscall () at /usr/src/sys/amd64/amd64/exception.S:396 396 call amd64_syscall Current language: auto; currently asm #14 0x00000008017fa65d in ?? () batch change: For bugs that match the following - Status Is In progress AND - Untouched since 2018-01-01. AND - Affects Base System OR Documentation DO: Reset to open status. Note: I did a quick pass but if you are getting this email it might be worthwhile to double check to see if this bug ought to be closed. I never saw this again since 2016 on both 10 and 11, so I guess this can be closed unless something else comes up. |