[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-bugs
Subject:    i386/10273: Kernel crash with multiport serial enabled and misconfigured master port
From:       sab () yin ! vegamuse ! org
Date:       1999-02-26 8:30:17
[Download RAW message or body]


>Number:         10273
>Category:       i386
>Synopsis:       Kernel crash with multiport serial enabled and misconfigured master port
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Feb 26 10:10:03 PST 1999
>Closed-Date:
>Last-Modified:
>Originator:     Stephen Kiernan
>Release:        FreeBSD 4.0-CURRENT i386
>Organization:
>Environment:

	BOCA 6-port multiport serial card

>Description:

	When multiport serial card is enabled in the kernel
	(options COM_MULTIPORT) and the master port is setup incorrectly
	(read: not configured), the kernel will panic on boot when it
	tries setting up one of the multiport card serial ports.
	There is a section of the sioattach code in i386/isa/sio.c which
	assumes that find_isadev will return a non-NULL pointer to a
	struct isa_device.  What will happen if the master port is not
	configured is find_isadev will return NULL and then the aforementioned
	section of code will access the id_irq structure member.  This causes
	the kernel to panic due to a NULL pointer reference.

>How-To-Repeat:

	Enabled multiport serial with multiport card installed.

	options COM_MULTIPORT

	Do not configure the master port with an irq

	Build the kernel and reboot.

	Watch the kernel try to set up the first multiport serial port and
	panic.

>Fix:
	
--- sio.c.orig	Fri Feb 26 02:48:27 1999
+++ sio.c	Fri Feb 26 02:58:09 1999
@@ -1027,13 +1027,15 @@
 
 #ifdef COM_MULTIPORT
 	if (COM_ISMULTIPORT(isdp)) {
+		struct isa_device	*idev;
 		com->multiport = TRUE;
 		printf(" (multiport");
 		if (unit == COM_MPMASTER(isdp))
 			printf(" master");
 		printf(")");
-		com->no_irq = find_isadev(isa_devtab_tty, &siodriver,
-					  COM_MPMASTER(isdp))->id_irq == 0;
+		idev = find_isadev(isa_devtab_tty, &siodriver,
+				   COM_MPMASTER(isdp));  
+		com->no_irq = (idev == NULL) || (idev->id_irq == 0);
 	 }
 #endif /* COM_MULTIPORT */
 	if (unit == comconsole)


>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic