diff options
author | Brad Fitzpatrick <bradfitz@android.com> | 2011-04-04 10:49:05 -0700 |
---|---|---|
committer | Android Code Review <code-review@android.com> | 2011-04-04 10:49:05 -0700 |
commit | 9907d161584415c81de1099678f160da172fd1a6 (patch) | |
tree | 30922026a0c2364d1b214979a88edeb202703c2f /core | |
parent | 2ed72048828cf9f617da971e5d2b8a062de08e5b (diff) | |
parent | 36aa8839d5509d12323a6025329d6913cbaa353b (diff) | |
download | frameworks_base-9907d161584415c81de1099678f160da172fd1a6.zip frameworks_base-9907d161584415c81de1099678f160da172fd1a6.tar.gz frameworks_base-9907d161584415c81de1099678f160da172fd1a6.tar.bz2 |
Merge "Fix data corruption when writing to Bluetooth socket"
Diffstat (limited to 'core')
-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 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); |