aboutsummaryrefslogtreecommitdiffstats
path: root/android/hw-qemud.c
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@android.com>2011-03-21 17:50:20 +0100
committerDavid 'Digit' Turner <digit@android.com>2011-04-11 18:18:53 +0200
commitbb1f432421288dae208c7189356643023ccbffbc (patch)
tree1df51627d90ee27310f028a0553bea41ba8ff825 /android/hw-qemud.c
parent8805b422dfaa568213c0909da6da48d24837324f (diff)
downloadexternal_qemu-bb1f432421288dae208c7189356643023ccbffbc.zip
external_qemu-bb1f432421288dae208c7189356643023ccbffbc.tar.gz
external_qemu-bb1f432421288dae208c7189356643023ccbffbc.tar.bz2
qemud: prevent recursive closure of clients.
+ add android/hw-qemud-pipe.h Change-Id: Icf7b316137cd9f1ce46e4c3642addccea6222a24
Diffstat (limited to 'android/hw-qemud.c')
-rw-r--r--android/hw-qemud.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/android/hw-qemud.c b/android/hw-qemud.c
index e1cd119..e91ec78 100644
--- a/android/hw-qemud.c
+++ b/android/hw-qemud.c
@@ -532,7 +532,7 @@ qemud_serial_send( QemudSerial* s,
}
/* packetize the payload for the serial MTU */
- while (len > 0)
+ while (len > 0)
{
avail = len;
if (avail > MAX_SERIAL_PAYLOAD)
@@ -600,6 +600,7 @@ struct QemudClient {
/* framing support */
int framing;
ABool need_header;
+ ABool closing;
QemudSink header[1];
uint8_t header0[FRAME_HEADER_SIZE];
QemudSink payload[1];
@@ -661,7 +662,7 @@ qemud_client_recv( void* opaque, uint8_t* msg, int msglen )
if (len >= 0 && msglen == len + FRAME_HEADER_SIZE) {
if (c->clie_recv)
- c->clie_recv( c->clie_opaque,
+ c->clie_recv( c->clie_opaque,
msg+FRAME_HEADER_SIZE,
msglen-FRAME_HEADER_SIZE, c );
return;
@@ -724,6 +725,11 @@ qemud_client_disconnect( void* opaque )
{
QemudClient* c = opaque;
+ if (c->closing) { /* recursive call, exit immediately */
+ return;
+ }
+ c->closing = 1;
+
/* remove from current list */
qemud_client_remove(c);