diff options
| author | christos <christos@NetBSD.org> | 2006-06-04 19:34:16 +0000 |
|---|---|---|
| committer | christos <christos@NetBSD.org> | 2006-06-04 19:34:16 +0000 |
| commit | 03701dc24f6e342bc02b33280124155c1d2a3345 (patch) | |
| tree | e8632567462b279686fe700cf9e5b01f9207746a /sys/dev | |
| parent | 4de2a1c70edbeed0d06c9b9fc999263e88bcdd3e (diff) | |
Don't allocate 1K on the stack.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/usb/usb_subr.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/dev/usb/usb_subr.c b/sys/dev/usb/usb_subr.c index 0fac364e352..ed079fd0fe8 100644 --- a/sys/dev/usb/usb_subr.c +++ b/sys/dev/usb/usb_subr.c @@ -1,4 +1,4 @@ -/* $NetBSD: usb_subr.c,v 1.131 2005/11/23 08:54:48 augustss Exp $ */ +/* $NetBSD: usb_subr.c,v 1.132 2006/06/04 19:34:16 christos Exp $ */ /* $FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $ */ /* @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.131 2005/11/23 08:54:48 augustss Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.132 2006/06/04 19:34:16 christos Exp $"); #include "opt_usbverbose.h" @@ -791,7 +791,7 @@ usbd_probe_and_attach(device_ptr_t parent, usbd_device_handle dev, int found, i, confi, nifaces; usbd_status err; device_ptr_t dv; - usbd_interface_handle ifaces[256]; /* 256 is the absolute max */ + usbd_interface_handle *ifaces; #if defined(__FreeBSD__) /* @@ -857,12 +857,17 @@ usbd_probe_and_attach(device_ptr_t parent, usbd_device_handle dev, } nifaces = dev->cdesc->bNumInterface; uaa.configno = dev->cdesc->bConfigurationValue; + ifaces = malloc(nifaces * sizeof(*ifaces), M_USB, M_NOWAIT); + if (ifaces == NULL) + goto nomem; for (i = 0; i < nifaces; i++) ifaces[i] = &dev->ifaces[i]; uaa.ifaces = ifaces; uaa.nifaces = nifaces; dev->subdevs = malloc((nifaces+1) * sizeof dv, M_USB,M_NOWAIT); if (dev->subdevs == NULL) { + free(ifaces, M_USB); +nomem: #if defined(__FreeBSD__) device_delete_child(parent, bdev); #endif @@ -888,6 +893,8 @@ usbd_probe_and_attach(device_ptr_t parent, usbd_device_handle dev, if (!bdev) { printf("%s: Device creation failed\n", USBDEVNAME(dev->bus->bdev)); + free(ifaces, M_USB); + free(dev->subdevs, M_USB); return (USBD_NORMAL_COMPLETION); } device_quiet(bdev); @@ -899,8 +906,11 @@ usbd_probe_and_attach(device_ptr_t parent, usbd_device_handle dev, /* remove the last created child again; it is unused */ device_delete_child(parent, bdev); #endif + free(ifaces, M_USB); + free(dev->subdevs, M_USB); return (USBD_NORMAL_COMPLETION); } + free(ifaces, M_USB); free(dev->subdevs, M_USB); dev->subdevs = 0; } |
