Commit 27c3f2cb9bf2112b82edac898094e0a39e6efca1
1 parent
a07cf92a
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
Showing
1 changed file
with
7 additions
and
3 deletions
vl.c
@@ -3283,8 +3283,8 @@ CPUState *cpu_gdbstub_get_env(void *opaque) | @@ -3283,8 +3283,8 @@ CPUState *cpu_gdbstub_get_env(void *opaque) | ||
3283 | 3283 | ||
3284 | int main_loop(void *opaque) | 3284 | int main_loop(void *opaque) |
3285 | { | 3285 | { |
3286 | - struct pollfd ufds[2], *pf, *serial_ufd, *net_ufd, *gdb_ufd; | ||
3287 | - int ret, n, timeout; | 3286 | + struct pollfd ufds[3], *pf, *serial_ufd, *net_ufd, *gdb_ufd; |
3287 | + int ret, n, timeout, serial_ok; | ||
3288 | uint8_t ch; | 3288 | uint8_t ch; |
3289 | CPUState *env = global_env; | 3289 | CPUState *env = global_env; |
3290 | 3290 | ||
@@ -3296,6 +3296,7 @@ int main_loop(void *opaque) | @@ -3296,6 +3296,7 @@ int main_loop(void *opaque) | ||
3296 | term_init(); | 3296 | term_init(); |
3297 | } | 3297 | } |
3298 | 3298 | ||
3299 | + serial_ok = 1; | ||
3299 | for(;;) { | 3300 | for(;;) { |
3300 | ret = cpu_x86_exec(env); | 3301 | ret = cpu_x86_exec(env); |
3301 | if (reset_requested) | 3302 | if (reset_requested) |
@@ -3310,7 +3311,7 @@ int main_loop(void *opaque) | @@ -3310,7 +3311,7 @@ int main_loop(void *opaque) | ||
3310 | /* poll any events */ | 3311 | /* poll any events */ |
3311 | serial_ufd = NULL; | 3312 | serial_ufd = NULL; |
3312 | pf = ufds; | 3313 | pf = ufds; |
3313 | - if (!(serial_ports[0].lsr & UART_LSR_DR)) { | 3314 | + if (serial_ok && !(serial_ports[0].lsr & UART_LSR_DR)) { |
3314 | serial_ufd = pf; | 3315 | serial_ufd = pf; |
3315 | pf->fd = 0; | 3316 | pf->fd = 0; |
3316 | pf->events = POLLIN; | 3317 | pf->events = POLLIN; |
@@ -3337,6 +3338,9 @@ int main_loop(void *opaque) | @@ -3337,6 +3338,9 @@ int main_loop(void *opaque) | ||
3337 | n = read(0, &ch, 1); | 3338 | n = read(0, &ch, 1); |
3338 | if (n == 1) { | 3339 | if (n == 1) { |
3339 | serial_received_byte(&serial_ports[0], ch); | 3340 | serial_received_byte(&serial_ports[0], ch); |
3341 | + } else { | ||
3342 | + /* Closed, stop polling. */ | ||
3343 | + serial_ok = 0; | ||
3340 | } | 3344 | } |
3341 | } | 3345 | } |
3342 | if (net_ufd && (net_ufd->revents & POLLIN)) { | 3346 | if (net_ufd && (net_ufd->revents & POLLIN)) { |