Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 Nov 2002 14:24:51 +1030 (CST)
From:      grog@lemis.com (Greg 'groggy' Lehey)
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/45579: Panic from USB stack after device detach
Message-ID:  <20021122035451.1224D51915@wantadilla.lemis.com>

next in thread | raw e-mail | index | archive | help

>Number:         45579
>Category:       kern
>Synopsis:       Panic from USB stack after device detach
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Nov 21 20:00:05 PST 2002
>Closed-Date:
>Last-Modified:
>Originator:     Greg Lehey
>Release:        FreeBSD 4.7-STABLE i386
>Organization:
LEMIS SA Pty Ltd
>Environment:
System: FreeBSD ler.ri.cox.net 4.7-STABLE FreeBSD 4.7-STABLE #8: Thu Nov 21 19:19:36 EST 2002 root@ler.ri.cox.net:/usr/o
bj/usr/src/sys/usbkern i386

        Standard install of 4.7, probably not release-specific.

>Description:
        The USB stack removes devices without checking whether they
        are still open.  If a process subsequently accesses the
        device, it will crash on dereferencing the devsw.
            
>How-To-Repeat:

        This occurs while testing the pilot-xfer port.  In the case in
        point, I set a breakpoint in code which reads from a Palm
        Pilot.  During this process, the device timed out and was
        removed.  On resumption of the program, we get the following
        backtrace:

        (kgdb) bt
        #0  dumpsys () at /usr/src/sys/kern/kern_shutdown.c:487
        #1  0xc0148f7f in boot (howto=256) at /usr/src/sys/kern/kern_shutdown.c:316
        #2  0xc01493a4 in poweroff_wait (junk=0xc0276fcc, howto=-1071158545) at /usr/src/sys/kern/kern_shutdown.c:595
        #3  0xc023f026 in trap_fatal (frame=0xc610acfc, eva=20) at /usr/src/sys/i386/i386/trap.c:974
        #4  0xc023ecf9 in trap_pfault (frame=0xc610acfc, usermode=0, eva=20) at /usr/src/sys/i386/i386/trap.c:867
        #5  0xc023e8e3 in trap (frame={tf_fs = -1064173552, tf_es = 16, tf_ds = 16, tf_edi = 4, tf_esi = -1063855872,
              tf_ebp = -971985580, tf_isp = -971985624, tf_ebx = -971985540, tf_edx = -971985540, tf_ecx = 18, tf_eax =
0,
              tf_trapno = 12, tf_err = 0, tf_eip = -1072162193, tf_cs = 8, tf_eflags = 66195, tf_esp = -1063855872,
              tf_ss = 64}) at /usr/src/sys/i386/i386/trap.c:466
        #6  0xc0181a6f in spec_poll (ap=0xc610ad7c) at /usr/src/sys/miscfs/specfs/spec_vnops.c:323
        #7  0xc0181775 in spec_vnoperate (ap=0xc610ad7c) at /usr/src/sys/miscfs/specfs/spec_vnops.c:119
        #8  0xc01f5315 in ufs_vnoperatespec (ap=0xc610ad7c) at /usr/src/sys/ufs/ufs/ufs_vnops.c:2440
        #9  0xc017e09b in vn_poll (fp=0xc09e8680, events=64, cred=0xc09cf800, p=0xc5736a00) at vnode_if.h:458
        #10 0xc0158a53 in selscan (p=0xc5736a00, ibits=0xc610ae1c, obits=0xc610ae10, nfd=5) at /usr/src/sys/sys/file.h:1
92
        #11 0xc01587ad in select (p=0xc5736a00, uap=0xc610af80) at /usr/src/sys/kern/sys_generic.c:746
        #12 0xc023f2d5 in syscall2 (frame={tf_fs = 47, tf_es = 47, tf_ds = 47, tf_edi = 10, tf_esi = 0, tf_ebp = -107794
1216,
              tf_isp = -971984940, tf_ebx = 671701380, tf_edx = 5, tf_ecx = 0, tf_eax = 93, tf_trapno = 10, tf_err = 2,
              tf_eip = 672352128, tf_cs = 31, tf_eflags = 519, tf_esp = -1077941452, tf_ss = 47})
            at /usr/src/sys/i386/i386/trap.c:1175

        (kgdb) f 6
        #6  0xc0181a6f in spec_poll (ap=0xc610ad7c) at /usr/src/sys/miscfs/specfs/spec_vnops.c:323
        323             return (*devsw(dev)->d_poll)(dev, ap->a_events, ap->a_p);
        (kgdb) p/x *dev
        $4 = {
          si_flags = 0x0,
          si_udev = 0x8a80,
          si_hash = {
            le_next = 0xc0964400,
            le_prev = 0xc02a23fc
          },
          si_hlist = {
            slh_first = 0xc6064600
          },
          si_name = {0x75, 0x63, 0x6f, 0x6d, 0x30, 0x0 <repeats 11 times>},
          si_drv1 = 0x0,
          si_drv2 = 0x0,
          si_devsw = 0x0,
          si_iosize_max = 0x10000,
          __si_u = {
            __si_tty = {
              __sit_tty = 0xc09f8900
            },
            __si_disk = {
              __sid_disk = 0xc09f8900,
              __sid_mountpoint = 0x0,
              __sid_bsize_phys = 0x0,
              __sid_bsize_best = 0x0
            }
          }
        }

>Fix:
        Maintain a per-device open flag and check it before detaching
        the devices.  Set sc_dying in any case, and check this flag
        before any I/O operation.
>Release-Note:
>Audit-Trail:
>Unformatted:
 Panic from USB stack after device detach
 From: Greg Lehey <groggy>
 Reply-To: Greg Lehey <grog@lemis.coM>
 cc:
 X-send-pr-version: 3.113
 X-GNATS-Notify:
 
   

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?20021122035451.1224D51915>