summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorn_hibma <n_hibma@FreeBSD.org>1999-08-12 18:55:41 +0000
committern_hibma <n_hibma@FreeBSD.org>1999-08-12 18:55:41 +0000
commit97c2576051eae8d800ad2b6dcc254c6a028c98a2 (patch)
tree02d67845b061402c9bfe1b810cf0d0ce7519d883
parent28a96b82355be00c7c216e2451bbf2c1484262df (diff)
downloadFreeBSD-src-97c2576051eae8d800ad2b6dcc254c6a028c98a2.zip
FreeBSD-src-97c2576051eae8d800ad2b6dcc254c6a028c98a2.tar.gz
Protect the file interface against disconnects.
-rw-r--r--sys/dev/usb/ugen.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/sys/dev/usb/ugen.c b/sys/dev/usb/ugen.c
index c62cc8a..f217f03 100644
--- a/sys/dev/usb/ugen.c
+++ b/sys/dev/usb/ugen.c
@@ -358,7 +358,8 @@ ugenclose(dev, flag, mode, p)
int dir;
DPRINTFN(5, ("ugenclose: flag=%d, mode=%d\n", flag, mode));
- if (sc->sc_disconnected)
+
+ if (!sc || sc->sc_disconnected)
return (EIO);
if (endpt == USB_CONTROL_ENDPOINT) {
@@ -401,7 +402,7 @@ ugenread(dev, uio, flag)
{
USB_GET_SC(ugen, UGENUNIT(dev), sc);
int endpt = UGENENDPOINT(dev);
- struct ugen_endpoint *sce = &sc->sc_endpoints[endpt][IN];
+ struct ugen_endpoint *sce;
u_int32_t n, tn;
char buf[UGEN_BBSIZE];
usbd_request_handle reqh;
@@ -411,9 +412,11 @@ ugenread(dev, uio, flag)
u_char buffer[UGEN_CHUNK];
DPRINTFN(5, ("ugenread: %d:%d\n", UGENUNIT(dev), UGENENDPOINT(dev)));
- if (sc->sc_disconnected)
+ if (!sc || sc->sc_disconnected)
return (EIO);
+ sce = &sc->sc_endpoints[endpt][IN];
+
#ifdef DIAGNOSTIC
if (!sce->edesc) {
printf("ugenread: no edesc\n");
@@ -501,16 +504,18 @@ ugenwrite(dev, uio, flag)
{
USB_GET_SC(ugen, UGENUNIT(dev), sc);
int endpt = UGENENDPOINT(dev);
- struct ugen_endpoint *sce = &sc->sc_endpoints[endpt][OUT];
+ struct ugen_endpoint *sce;
size_t n;
int error = 0;
char buf[UGEN_BBSIZE];
usbd_request_handle reqh;
usbd_status r;
- if (sc->sc_disconnected)
+ if (!sc || sc->sc_disconnected)
return (EIO);
+ sce = &sc->sc_endpoints[endpt][OUT];
+
#ifdef DIAGNOSTIC
if (!sce->edesc) {
printf("ugenwrite: no edesc\n");
@@ -721,7 +726,7 @@ ugenioctl(dev, cmd, addr, flag, p)
u_int8_t conf, alt;
DPRINTFN(5, ("ugenioctl: cmd=%08lx\n", cmd));
- if (sc->sc_disconnected)
+ if (!sc || sc->sc_disconnected)
return (EIO);
switch (cmd) {
@@ -963,7 +968,7 @@ ugenpoll(dev, events, p)
int revents = 0;
int s;
- if (sc->sc_disconnected)
+ if (!sc || sc->sc_disconnected)
return (EIO);
sce = &sc->sc_endpoints[UGENENDPOINT(dev)][IN];
OpenPOWER on IntegriCloud