Subject: kern/30566: Bugs in various poll routines
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: None <ws@tools.de>
List: netbsd-bugs
Date: 06/20/2005 15:46:01
>Number: 30566
>Category: kern
>Synopsis: Bugs in various poll routines
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: kern-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Mon Jun 20 15:46:01 +0000 2005
>Originator: Wolfgang Solfrank
>Release: NetBSD 3.99.6
>Organization:
TooLs GmbH
>Environment:
System: NetBSD fred.tools.de 3.99.6 NetBSD 3.99.6 (fred) #9: Fri Jun 17 13:34:58 MEST 2005 ws@fred.tools.de:/src/obj/sys/arch/i386/compile/fred i386
Architecture: i386
Machine: i386
>Description:
The poll entry points in struct fileops, struct vnode, struct
cdevsw and struct linesw are not allowed to return error codes,
but should only return the events that are available on a
particular file. There are quite some places where this
protocol isn't honoured.
Most of these try to indicate an error by returning some E*
value from <sys/errno.h>. In some cases, the success of
a test is indicated by a 1 instead of the event being tested.
>How-To-Repeat:
Code inspection.
A coarse reading through the source reveals that at least the
following routines are affected (filename, routine):
arch/amiga/dev/mfc.c, mfcspoll
arch/amiga/dev/msc.c, mscpoll
arch/arm/ep93xx/epcom.c, epcompoll
arch/arm/iomd/console/console.c, physconpoll
arch/arm/ixp12x0/ixp12x0_com.c, ixpcompoll
arch/arm/s3c2xx0/sscom.c, sscompoll
arch/arm/sa11x0/sa11x0_com.c, sacompoll
arch/evbarm/dev/plcom.c, plcompoll
arch/mac68k/dev/ite_compat.c, itepoll
arch/mips/alchemy/dev/aucom.c, compoll
arch/pmax/dev/fb_usrreq.c, fbpoll
arch/sh5/dev/dtfcons.c, dtfconspoll
coda/coda_psdev.c, vc_nb_poll
dev/audio.c, audiopoll
dev/bluetooth/bthci.c, bthcipoll
dev/cons.c, cnpoll
dev/gpib/gpib.c, gpibpoll
dev/ic/com.c, compoll
dev/ir/cir.c, cirpoll
dev/ir/irframe.c, irframepoll
dev/midi.c, midipoll
dev/usb/ucom.c, ucompoll
dev/usb/ugen.c, ugenpoll
dev/usb/uhid.c, uhidpoll
dev/usb/usb.c, usbpoll
dev/usb/uscanner.c, uscannerpoll
dev/wscons/wsdisplay.c, wsdisplaypoll
dev/wscons/wskbd.c, wskbdpoll
dev/wscons/wsmouse.c, wsmousepoll
dev/wscons/wsmux.c, wsmuxpoll
kern/tty_conf.c, ttyerrpoll
kern/tty_pty.c, ptspoll
miscfs/portal/portal_vnops.c, portal_poll
miscfs/specfs/spec_vnops.c, spec_poll
net/if_tap.c, tap_dev_poll
netisdn/i4b_i4bdrv.c, isdnpoll
>Fix:
The various error cases need to return POLLERR or POLLHUP.
The return of a 1 needs to be replaced with the appropriate
bit from the events argument.