Catch various cases in libpayload where malloc() or memalign() return NULL

Signed-off-by: Stefan Reinauer <stepan@coresystems.de>

Index: include/usb/usb.h
===================================================================
--- include/usb/usb.h	(revision 4472)
+++ include/usb/usb.h	(working copy)
@@ -226,4 +226,6 @@
 
 void usb_detach_device(hci_t *controller, int devno);
 int usb_attach_device(hci_t *controller, int hubaddress, int port, int lowspeed);
+
+void usb_fatal(const char *message) __attribute__ ((noreturn));
 #endif
Index: libc/malloc.c
===================================================================
--- libc/malloc.c	(revision 4472)
+++ libc/malloc.c	(working copy)
@@ -309,6 +309,8 @@
 	if (size == 0) return 0;
 	if (align_regions == 0) {
 		align_regions = malloc(sizeof(struct align_region_t));
+		if (align_regions == NULL)
+			return NULL;
 		memset(align_regions, 0, sizeof(struct align_region_t));
 	}
 	struct align_region_t *reg = align_regions;
Index: libc/lar.c
===================================================================
--- libc/lar.c	(revision 4472)
+++ libc/lar.c	(working copy)
@@ -113,6 +113,10 @@
 	 * tear on the heap */
 
 	lar->headers = malloc(16 * sizeof(void *));
+
+	if (!lar->headers)
+		return NULL;
+
 	lar->alloc = 16;
 	lar->count = lar->eof = 0;
 	lar->cindex = 0;
Index: libc/readline.c
===================================================================
--- libc/readline.c	(revision 4472)
+++ libc/readline.c	(working copy)
@@ -55,6 +55,8 @@
 	if (!readline_buffer || !readline_bufferlen) {
 #define READLINE_BUFFERSIZE	256
 		readline_buffer = malloc(READLINE_BUFFERSIZE);
+		if (!readline_buffer)
+			return NULL;
 		readline_bufferlen = READLINE_BUFFERSIZE;
 		memset(readline_buffer, 0, readline_bufferlen);
 	}
Index: drivers/usb/usbhid.c
===================================================================
--- drivers/usb/usbhid.c	(revision 4472)
+++ drivers/usb/usbhid.c	(working copy)
@@ -169,6 +169,8 @@
 			boot_protos[interface->bInterfaceProtocol]);
 		if (interface->bInterfaceProtocol == hid_boot_proto_keyboard) {
 			dev->data = malloc (sizeof (usbhid_inst_t));
+			if (!dev->data)
+				usb_fatal("Not enough memory for USB HID device.\n");
 			printf ("  configuring...\n");
 			usb_hid_set_protocol(dev, interface, hid_proto_boot);
 			usb_hid_set_idle(dev, interface, 0);
Index: drivers/usb/uhci_rh.c
===================================================================
--- drivers/usb/uhci_rh.c	(revision 4472)
+++ drivers/usb/uhci_rh.c	(working copy)
@@ -157,6 +157,9 @@
 	uhci_rh_enable_port (dev, 1);
 	uhci_rh_enable_port (dev, 2);
 	dev->data = malloc (sizeof (rh_inst_t));
+	if (!dev->data)
+		usb_fatal ("Not enough memory for UHCI RH.\n");
+
 	RH_INST (dev)->port[0] = -1;
 	RH_INST (dev)->port[1] = -1;
 
Index: drivers/usb/uhci.c
===================================================================
--- drivers/usb/uhci.c	(revision 4472)
+++ drivers/usb/uhci.c	(working copy)
@@ -130,7 +130,13 @@
 	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 @@
 	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 @@
 	          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_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 @@
 	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;
Index: drivers/usb/usbhub.c
===================================================================
--- drivers/usb/usbhub.c	(revision 4472)
+++ drivers/usb/usbhub.c	(working copy)
@@ -128,6 +128,9 @@
 
 	dev->data = malloc (sizeof (usbhub_inst_t));
 
+	if (!dev->data)
+		usb_fatal("Not enough memory for USB hub.\n");
+
 	HUB_INST (dev)->descriptor =
 		(hub_descriptor_t *) get_descriptor (dev,
 						     gen_bmRequestType
@@ -137,6 +140,9 @@
 	HUB_INST (dev)->num_ports = HUB_INST (dev)->descriptor->bNbrPorts;
 	HUB_INST (dev)->ports =
 		malloc (sizeof (int) * (HUB_INST (dev)->num_ports + 1));
+	if (! HUB_INST (dev)->ports)
+		usb_fatal("Not enough memory for USB hub ports.\n");
+
 	for (i = 1; i <= HUB_INST (dev)->num_ports; i++)
 		HUB_INST (dev)->ports[i] = -1;
 	for (i = 1; i <= HUB_INST (dev)->num_ports; i++)
Index: drivers/usb/usb.c
===================================================================
--- drivers/usb/usb.c	(revision 4472)
+++ drivers/usb/usb.c	(working copy)
@@ -33,14 +33,16 @@
 hci_t *usb_hcs = 0;
 
 hci_t *
-new_controller ()
+new_controller (void)
 {
 	hci_t *controller = malloc (sizeof (hci_t));
 
-	/* atomic */
-	controller->next = usb_hcs;
-	usb_hcs = controller;
-	/* atomic end */
+	if (controller) {
+		/* atomic */
+		controller->next = usb_hcs;
+		usb_hcs = controller;
+		/* atomic end */
+	}
 
 	return controller;
 }
@@ -48,13 +50,13 @@
 void
 detach_controller (hci_t *controller)
 {
-	if (controller == 0)
+	if (controller == NULL)
 		return;
 	if (usb_hcs == controller) {
 		usb_hcs = controller->next;
 	} else {
 		hci_t *it = usb_hcs;
-		while (it != 0) {
+		while (it != NULL) {
 			if (it->next == controller) {
 				it->next = controller->next;
 				return;
@@ -386,3 +388,10 @@
 	newdev_t->init (newdev_t);
 	return newdev;
 }
+
+void
+usb_fatal (const char *message)
+{
+	printf(message);
+	for (;;) ;
+}
Index: drivers/usb/usbmsc.c
===================================================================
--- drivers/usb/usbmsc.c	(revision 4472)
+++ drivers/usb/usbmsc.c	(working copy)
@@ -346,6 +346,9 @@
 	}
 
 	dev->data = malloc (sizeof (usbmsc_inst_t));
+	if (!dev->data)
+		usb_fatal("Not enough memory for USB MSC device.\n");
+
 	MSC_INST (dev)->bulk_in = 0;
 	MSC_INST (dev)->bulk_out = 0;
 
