diff options
author | Stefan Reinauer <stepan@coresystems.de> | 2009-07-31 11:39:55 +0000 |
---|---|---|
committer | Stefan Reinauer <stepan@openbios.org> | 2009-07-31 11:39:55 +0000 |
commit | 5fe6e23c61bf1fde7a1a0568b38d32c4e625f0ef (patch) | |
tree | 74ab1bde640908166368985f9598517756df3199 /payloads/libpayload/drivers/usb/uhci.c | |
parent | 131c0070a3b224e8ec2c817444f1ae4cf2419193 (diff) | |
download | coreboot-5fe6e23c61bf1fde7a1a0568b38d32c4e625f0ef.tar.xz |
Catch various cases in libpayload where malloc() or memalign() return NULL
Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Peter Stuge <peter@stuge.se>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4474 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'payloads/libpayload/drivers/usb/uhci.c')
-rw-r--r-- | payloads/libpayload/drivers/usb/uhci.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/payloads/libpayload/drivers/usb/uhci.c b/payloads/libpayload/drivers/usb/uhci.c index 198b6c0846..def6b45084 100644 --- a/payloads/libpayload/drivers/usb/uhci.c +++ b/payloads/libpayload/drivers/usb/uhci.c @@ -130,7 +130,13 @@ uhci_init (pcidev_t addr) int i; hci_t *controller = new_controller (); + if (!controller) + usb_fatal("Could not create USB controller instance.\n"); + controller->instance = malloc (sizeof (uhci_t)); + if(!controller->instance) + usb_fatal("Not enough memory creating USB controller instance.\n"); + controller->start = uhci_start; controller->stop = uhci_stop; controller->reset = uhci_reset; @@ -157,6 +163,9 @@ uhci_init (pcidev_t addr) pci_write_config32 (controller->bus_address, 0xc0, 0x8f00); UHCI_INST (controller)->framelistptr = memalign (0x1000, 1024 * sizeof (flistp_t *)); /* 4kb aligned to 4kb */ + if (! UHCI_INST (controller)->framelistptr) + usb_fatal("Not enough memory for USB frame list pointer.\n"); + memset (UHCI_INST (controller)->framelistptr, 0, 1024 * sizeof (flistp_t)); @@ -168,6 +177,8 @@ uhci_init (pcidev_t addr) for some reason. Not a problem now. */ td_t *antiberserk = memalign(16, sizeof(td_t)); + if (!antiberserk) + usb_fatal("Not enough memory for chipset workaround.\n"); memset(antiberserk, 0, sizeof(td_t)); UHCI_INST (controller)->qh_prei = memalign (16, sizeof (qh_t)); @@ -175,6 +186,12 @@ uhci_init (pcidev_t addr) UHCI_INST (controller)->qh_data = memalign (16, sizeof (qh_t)); UHCI_INST (controller)->qh_last = memalign (16, sizeof (qh_t)); + if (! UHCI_INST (controller)->qh_prei || + ! UHCI_INST (controller)->qh_intr || + ! UHCI_INST (controller)->qh_data || + ! UHCI_INST (controller)->qh_last) + usb_fatal ("Not enough memory for USB controller queues.\n"); + UHCI_INST (controller)->qh_prei->headlinkptr.ptr = virt_to_phys (UHCI_INST (controller)->qh_intr); UHCI_INST (controller)->qh_prei->headlinkptr.queue_head = 1; @@ -508,11 +525,16 @@ uhci_create_intr_queue (endpoint_t *ep, int reqsize, int reqcount, int reqtiming td_t *tds = memalign(16, sizeof(td_t) * reqcount); qh_t *qh = memalign(16, sizeof(qh_t)); + if (!data || !tds || !qh) + usb_fatal ("Not enough memory to create USB intr queue prerequisites.\n"); + qh->elementlinkptr.ptr = virt_to_phys(tds); qh->elementlinkptr.queue_head = 0; qh->elementlinkptr.terminate = 0; intr_q *q = malloc(sizeof(intr_q)); + if (!q) + usb_fatal ("Not enough memory to create USB intr queue.\n"); q->qh = qh; q->tds = tds; q->data = data; |