Attached are two patches
* one checking the return code of various malloc and memalign calls
* another one fixes a bug in the keyboard driver and a bug in the video
driver
Stefan
--
coresystems GmbH • Brahmsstr. 16 • D-79104 Freiburg i. Br.
Tel.: +49 761 7668825 • Fax: +49 761 7664613
Email: [email protected] • http://www.coresystems.de/
Registergericht: Amtsgericht Freiburg • HRB 7656
Geschäftsführer: Stefan Reinauer • Ust-IdNr.: DE245674866
* drop duplicate prototype for lib_get_sysinfo()
* fix delay handling in tiny curses keyboard driver
* fix off by one error in video driver
Signed-off-by: Stefan Reinauer <[email protected]>
Index: include/sysinfo.h
===================================================================
--- include/sysinfo.h (revision 4472)
+++ include/sysinfo.h (working copy)
@@ -54,7 +54,6 @@
};
extern struct sysinfo_t lib_sysinfo;
-void lib_get_sysinfo(void);
#endif
Index: curses/keyboard.c
===================================================================
--- curses/keyboard.c (revision 4472)
+++ curses/keyboard.c (working copy)
@@ -179,7 +179,7 @@
break;
if (delay > 0) {
- mdelay(100);
+ mdelay(1);
delay--;
}
@@ -195,15 +195,17 @@
{
int delay = -1;
- if (_halfdelay || win->_delay)
- delay = win->_delay ? 0 : _halfdelay;
+ if (_halfdelay)
+ delay = _halfdelay;
+ else
+ delay = win->_delay;
return curses_getchar(delay);
}
int nodelay(WINDOW *win, NCURSES_BOOL flag)
{
- win->_delay = flag ? 1 : 0;
+ win->_delay = flag ? 0 : -1;
return 0;
}
Index: drivers/video/video.c
===================================================================
--- drivers/video/video.c (revision 4472)
+++ drivers/video/video.c (working copy)
@@ -66,7 +66,7 @@
if (cursory < 0)
cursory = 0;
- if (cursorx > VIDEO_COLS) {
+ if (cursorx >= VIDEO_COLS) {
cursorx = 0;
cursory++;
}
Catch various cases in libpayload where malloc() or memalign() return NULL
Signed-off-by: Stefan Reinauer <[email protected]>
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;
--
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot