summaryrefslogtreecommitdiffstats
path: root/core/jni/android_bluetooth_BluetoothSocket.cpp
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@android.com>2011-04-04 15:25:39 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2011-04-04 15:25:39 -0700
commit5851b8662dc95372d68df293cb13c59da0cf8582 (patch)
tree75ef8fb3fa3dd373602e99dc3b03fdd1277d106f /core/jni/android_bluetooth_BluetoothSocket.cpp
parente511fb33d33f0ba83ce437f615fa236f369b5ade (diff)
parent27e00544ea08d25e8e9b1b94264205f9d53030fb (diff)
downloadframeworks_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.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 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);