diff options
-rw-r--r-- | boot/ChangeLog | 13 | ||||
-rw-r--r-- | boot/boot.c | 36 |
2 files changed, 44 insertions, 5 deletions
diff --git a/boot/ChangeLog b/boot/ChangeLog index 57cf1677..e39de84f 100644 --- a/boot/ChangeLog +++ b/boot/ChangeLog @@ -1,3 +1,16 @@ +2000-12-21 Marcus Brinkmann <marcus@gnu.org> + + * boot.c (main): If malloc or realloc fails, print diagnostic + message and exit. + (queue_read): Change return type from void to kern_return_t. + If malloc fails, return D_NO_MEMORY, otherwise D_SUCCESS (to simplify + code flow, malloc before acquiring the queuelock). + (ds_device_read): New variable err (local to the block in which it is used). + If queue_read fails, pass through error. + (ds_device_read_inband): Likewise. + (S_io_read): Likewise. + Reported by Igor Khavkine <i_khavki@alcor.concordia.ca>. + 2000-03-17 Roland McGrath <roland@baalperazim.frob.com> * boot.c (S_io_reauthenticate): Check mach_port_insert_right result diff --git a/boot/boot.c b/boot/boot.c index dc5ea083..c3277816 100644 --- a/boot/boot.c +++ b/boot/boot.c @@ -540,6 +540,7 @@ main (int argc, char **argv, char **envp) { char *p, *line; static const char filemsg[] = "Can't open boot script\n"; + static const char memmsg[] = "Not enough memory\n"; int amt, fd, err; fd = open (bootscript, O_RDONLY, 0); @@ -549,6 +550,11 @@ main (int argc, char **argv, char **envp) host_exit (1); } p = buf = malloc (500); + if (!buf) + { + write (2, memmsg, sizeof (memmsg)); + host_exit (1); + } len = 500; amt = 0; while (1) @@ -564,6 +570,11 @@ main (int argc, char **argv, char **envp) len += 500; newbuf = realloc (buf, len); + if (!newbuf) + { + write (2, memmsg, sizeof (memmsg)); + host_exit (1); + } p = newbuf + (p - buf); buf = newbuf; } @@ -850,7 +861,7 @@ struct qr struct qr *qrhead, *qrtail; /* Queue a read for later reply. */ -void +kern_return_t queue_read (enum read_type type, mach_port_t reply_port, mach_msg_type_name_t reply_type, @@ -858,9 +869,12 @@ queue_read (enum read_type type, { struct qr *qr; + qr = malloc (sizeof (struct qr)); + if (!qr) + return D_NO_MEMORY; + spin_lock (&queuelock); - qr = malloc (sizeof (struct qr)); qr->type = type; qr->reply_port = reply_port; qr->reply_type = reply_type; @@ -872,6 +886,7 @@ queue_read (enum read_type type, qrhead = qrtail = qr; spin_unlock (&queuelock); + return D_SUCCESS; } /* TRUE if there's data available on stdin, which should be used to satisfy @@ -1194,8 +1209,12 @@ ds_device_read (device_t device, } else { + kern_return_t err; + unlock_readlock (); - queue_read (DEV_READ, reply_port, reply_type, bytes_wanted); + err = queue_read (DEV_READ, reply_port, reply_type, bytes_wanted); + if (err) + return err; return MIG_NO_REPLY; } } @@ -1244,8 +1263,12 @@ ds_device_read_inband (device_t device, } else { + kern_return_t err; + unlock_readlock (); - queue_read (DEV_READI, reply_port, reply_type, bytes_wanted); + err = queue_read (DEV_READI, reply_port, reply_type, bytes_wanted); + if (err) + return err; return MIG_NO_REPLY; } } @@ -1515,8 +1538,11 @@ S_io_read (mach_port_t object, } else { + kern_return_t err; unlock_readlock (); - queue_read (IO_READ, reply_port, reply_type, amount); + err = queue_read (IO_READ, reply_port, reply_type, amount); + if (err) + return err; return MIG_NO_REPLY; } } |