diff options
author | Brad Fitzpatrick <bradfitz@android.com> | 2011-04-04 15:25:39 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-04-04 15:25:39 -0700 |
commit | 5851b8662dc95372d68df293cb13c59da0cf8582 (patch) | |
tree | 75ef8fb3fa3dd373602e99dc3b03fdd1277d106f /core/jni/android_bluetooth_BluetoothSocket.cpp | |
parent | e511fb33d33f0ba83ce437f615fa236f369b5ade (diff) | |
parent | 27e00544ea08d25e8e9b1b94264205f9d53030fb (diff) | |
download | frameworks_base-5851b8662dc95372d68df293cb13c59da0cf8582.zip frameworks_base-5851b8662dc95372d68df293cb13c59da0cf8582.tar.gz frameworks_base-5851b8662dc95372d68df293cb13c59da0cf8582.tar.bz2 |
am 27e00544: am 9907d161: Merge "Fix data corruption when writing to Bluetooth socket"
* commit '27e00544ea08d25e8e9b1b94264205f9d53030fb':
Fix data corruption when writing to Bluetooth socket
Diffstat (limited to 'core/jni/android_bluetooth_BluetoothSocket.cpp')
-rw-r--r-- | core/jni/android_bluetooth_BluetoothSocket.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/core/jni/android_bluetooth_BluetoothSocket.cpp b/core/jni/android_bluetooth_BluetoothSocket.cpp index b87f7c4..d09c4e9 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("%s", __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); |