summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@android.com>2011-04-04 10:49:05 -0700
committerAndroid Code Review <code-review@android.com>2011-04-04 10:49:05 -0700
commit9907d161584415c81de1099678f160da172fd1a6 (patch)
tree30922026a0c2364d1b214979a88edeb202703c2f
parent2ed72048828cf9f617da971e5d2b8a062de08e5b (diff)
parent36aa8839d5509d12323a6025329d6913cbaa353b (diff)
downloadframeworks_base-9907d161584415c81de1099678f160da172fd1a6.zip
frameworks_base-9907d161584415c81de1099678f160da172fd1a6.tar.gz
frameworks_base-9907d161584415c81de1099678f160da172fd1a6.tar.bz2
Merge "Fix data corruption when writing to Bluetooth socket"
-rw-r--r--core/jni/android_bluetooth_BluetoothSocket.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/core/jni/android_bluetooth_BluetoothSocket.cpp b/core/jni/android_bluetooth_BluetoothSocket.cpp
index 31ebf8c..a62537d 100644
--- a/core/jni/android_bluetooth_BluetoothSocket.cpp
+++ b/core/jni/android_bluetooth_BluetoothSocket.cpp
@@ -448,7 +448,7 @@ static jint writeNative(JNIEnv *env, jobject obj, jbyteArray jb, jint offset,
#ifdef HAVE_BLUETOOTH
LOGV(__FUNCTION__);
- int ret;
+ int ret, total;
jbyte *b;
int sz;
struct asocket *s = get_socketData(env, obj);
@@ -471,15 +471,21 @@ static jint writeNative(JNIEnv *env, jobject obj, jbyteArray jb, jint offset,
return -1;
}
- ret = asocket_write(s, &b[offset], length, -1);
- if (ret < 0) {
- jniThrowIOException(env, errno);
- env->ReleaseByteArrayElements(jb, b, JNI_ABORT);
- return -1;
+ total = 0;
+ while (length > 0) {
+ ret = asocket_write(s, &b[offset], length, -1);
+ if (ret < 0) {
+ jniThrowIOException(env, errno);
+ env->ReleaseByteArrayElements(jb, b, JNI_ABORT);
+ return -1;
+ }
+ offset += ret;
+ total += ret;
+ length -= ret;
}
env->ReleaseByteArrayElements(jb, b, JNI_ABORT); // no need to commit
- return (jint)ret;
+ return (jint)total;
#endif
jniThrowIOException(env, ENOSYS);