Date: Sat, 24 Mar 2001 03:52:24 -0800 (PST) From: chervarium@nove.bg To: freebsd-gnats-submit@FreeBSD.org Subject: i386/26049: bug in modular vn code causes a fatal trap 12 Message-ID: <200103241152.f2OBqOh33828@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 26049
>Category: i386
>Synopsis: bug in modular vn code causes a fatal trap 12
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sat Mar 24 04:00:02 PST 2001
>Closed-Date:
>Last-Modified:
>Originator: Atanas Bachvaroff
>Release: FreeBSD 4.3-BETA
>Organization:
NOVE Holding
>Environment:
none available (sorry, didn't get all information needed on the floppy disk)
>Description:
incorrectly modularised vn driver causes a fatal trap 12 due to when module is unloaded, it's entry in cdevsw[] array is left unchanged. afterward, any lstat-ting /dev/vn0 result in unresolved page fault and crash. last in chain function devsw from /usr/src/sys/kerc/kern_conf.c returns invalid (struct cdevsw *) pointer to vn_isdisk from vfs_subr.c, and that pointer is accessed (i'm not describing the whole functions chain, everyone can see it in the sources):
if (!devsw(vp->v_rdev)) {
if (errp != NULL)
*errp = ENXIO;
return (0);
}
if (!(devsw(vp->v_rdev)->d_flags & D_DISK)) {
if (errp != NULL)
*errp = ENOTBLK;
return (0);
}
(watch the second major if statement)
this problem may be found in other modular disk drivers. patch available (posted in the "Fix to the problem if known" part)...
>How-To-Repeat:
almost any loading of vn, using it and unloading it, followed by lstat syscall to "/dev/vn0" result in activating the bug and fatal trap 12 (page fault exception on x86 in protected mode with paging bit in %cr0 = 1 ;)...
>Fix:
--- /usr/src/sys/dev/vn/vn.c Mon May 15 19:50:33 2000
+++ /usr/src/sys/dev/vn/vn.c Sat Mar 24 12:09:07 2001
@@ -776,6 +776,7 @@
vnclear(vn);
free(vn, M_DEVBUF);
}
+ cdevsw_remove(&vn_cdevsw);
break;
default:
break;
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200103241152.f2OBqOh33828>
