aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2013-09-09 16:33:06 +0200
committerGerd Hoffmann <kraxel@redhat.com>2013-09-16 11:02:31 +0200
commit26014a242f78e69091dadfb9e8eb8c88579ff09f (patch)
tree0d2be6bc16acdfa36f3101e21f40475efa9387ea
parent6375ffd667dce57bee62b2f424bf9bef30eb2432 (diff)
downloadseabios-26014a242f78e69091dadfb9e8eb8c88579ff09f.zip
seabios-26014a242f78e69091dadfb9e8eb8c88579ff09f.tar.gz
seabios-26014a242f78e69091dadfb9e8eb8c88579ff09f.tar.bz2
ahci: add missing check for allocation failure
Triggerable by creating a virtual machine with *lots* of ahci controllers and disks. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> (cherry picked from commit ce12eaf2044d6aae08795403ecbb888d2b6527ff)
-rw-r--r--src/ahci.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/ahci.c b/src/ahci.c
index 879a991..f2cc71b 100644
--- a/src/ahci.c
+++ b/src/ahci.c
@@ -381,12 +381,26 @@ ahci_port_alloc(struct ahci_ctrl_s *ctrl, u32 pnr)
return port;
}
+static void ahci_port_release(struct ahci_port_s *port)
+{
+ ahci_port_reset(port->ctrl, port->pnr);
+ free(port->list);
+ free(port->fis);
+ free(port->cmd);
+ free(port);
+}
+
static struct ahci_port_s* ahci_port_realloc(struct ahci_port_s *port)
{
struct ahci_port_s *tmp;
u32 cmd;
tmp = malloc_fseg(sizeof(*port));
+ if (!tmp) {
+ warn_noalloc();
+ ahci_port_release(port);
+ return NULL;
+ }
*tmp = *port;
free(port);
port = tmp;
@@ -410,15 +424,6 @@ static struct ahci_port_s* ahci_port_realloc(struct ahci_port_s *port)
return port;
}
-static void ahci_port_release(struct ahci_port_s *port)
-{
- ahci_port_reset(port->ctrl, port->pnr);
- free(port->list);
- free(port->fis);
- free(port->cmd);
- free(port);
-}
-
#define MAXMODEL 40
/* See ahci spec chapter 10.1 "Software Initialization of HBA" */
@@ -554,6 +559,8 @@ ahci_port_detect(void *data)
ahci_port_release(port);
else {
port = ahci_port_realloc(port);
+ if (port == NULL)
+ return;
dprintf(1, "AHCI/%d: registering: \"%s\"\n", port->pnr, port->desc);
if (!port->atapi) {
// Register with bcv system.