summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2006-06-04 19:34:16 +0000
committerchristos <christos@NetBSD.org>2006-06-04 19:34:16 +0000
commit03701dc24f6e342bc02b33280124155c1d2a3345 (patch)
treee8632567462b279686fe700cf9e5b01f9207746a /sys/dev
parent4de2a1c70edbeed0d06c9b9fc999263e88bcdd3e (diff)
Don't allocate 1K on the stack.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/usb/usb_subr.c16
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;
}