aboutsummaryrefslogtreecommitdiffstats
path: root/android
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@android.com>2010-06-25 12:46:24 -0700
committerDavid 'Digit' Turner <digit@android.com>2010-06-25 12:46:24 -0700
commit83f82216024e9b5623d9f2b3b90e9c2e954412e9 (patch)
tree6623a60bf0b33f8338426903446ff9544ec5e16f /android
parent13682a07edb28985ab337f5796dba6cbda205f91 (diff)
downloadexternal_qemu-83f82216024e9b5623d9f2b3b90e9c2e954412e9.zip
external_qemu-83f82216024e9b5623d9f2b3b90e9c2e954412e9.tar.gz
external_qemu-83f82216024e9b5623d9f2b3b90e9c2e954412e9.tar.bz2
Fix a memory corruption bug that can happen if a qemud service decides to
close the connection during a clie_recv() call. Change-Id: I5cedde24c5b15081453c1537c679ca1f9c697ad9
Diffstat (limited to 'android')
-rw-r--r--android/hw-qemud.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/android/hw-qemud.c b/android/hw-qemud.c
index efe6a99..2100ce6 100644
--- a/android/hw-qemud.c
+++ b/android/hw-qemud.c
@@ -573,6 +573,8 @@ qemud_client_recv( void* opaque, uint8_t* msg, int msglen )
#endif
while (msglen > 0) {
+ uint8_t *data;
+
/* read the header */
if (c->need_header) {
int frame_size;
@@ -603,13 +605,16 @@ qemud_client_recv( void* opaque, uint8_t* msg, int msglen )
break;
c->payload->buff[c->payload->size] = 0;
+ c->need_header = 1;
+ data = c->payload->buff;
-
+ /* Technically, calling 'clie_recv' can destroy client object 'c'
+ * if it decides to close the connection, so ensure we don't
+ * use/dereference it after the call. */
if (c->clie_recv)
c->clie_recv( c->clie_opaque, c->payload->buff, c->payload->size, c );
- AFREE(c->payload->buff);
- c->need_header = 1;
+ AFREE(data);
}
}