aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-09-30 21:40:47 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-09-30 21:40:47 +0000
commit27c3f2cb9bf2112b82edac898094e0a39e6efca1 (patch)
tree8448e0a8f68446e656d857558e9edf1f99c00a73
parenta07cf92aed58a1fbf03d9010e6a81258300be642 (diff)
buffer overflow fix - handle case where stdin is closed (Rusty Russell)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@397 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--vl.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/vl.c b/vl.c
index ddb622c1af..89a9e06d55 100644
--- a/vl.c
+++ b/vl.c
@@ -3283,8 +3283,8 @@ CPUState *cpu_gdbstub_get_env(void *opaque)
int main_loop(void *opaque)
{
- struct pollfd ufds[2], *pf, *serial_ufd, *net_ufd, *gdb_ufd;
- int ret, n, timeout;
+ struct pollfd ufds[3], *pf, *serial_ufd, *net_ufd, *gdb_ufd;
+ int ret, n, timeout, serial_ok;
uint8_t ch;
CPUState *env = global_env;
@@ -3296,6 +3296,7 @@ int main_loop(void *opaque)
term_init();
}
+ serial_ok = 1;
for(;;) {
ret = cpu_x86_exec(env);
if (reset_requested)
@@ -3310,7 +3311,7 @@ int main_loop(void *opaque)
/* poll any events */
serial_ufd = NULL;
pf = ufds;
- if (!(serial_ports[0].lsr & UART_LSR_DR)) {
+ if (serial_ok && !(serial_ports[0].lsr & UART_LSR_DR)) {
serial_ufd = pf;
pf->fd = 0;
pf->events = POLLIN;
@@ -3337,6 +3338,9 @@ int main_loop(void *opaque)
n = read(0, &ch, 1);
if (n == 1) {
serial_received_byte(&serial_ports[0], ch);
+ } else {
+ /* Closed, stop polling. */
+ serial_ok = 0;
}
}
if (net_ufd && (net_ufd->revents & POLLIN)) {