from the unit tests: // duplicate always returns a big-endian buffer. b.order(ByteOrder.BIG_ENDIAN); assertEquals(ByteOrder.BIG_ENDIAN, b.duplicate().order()); b.order(ByteOrder.LITTLE_ENDIAN); assertEquals(ByteOrder.BIG_ENDIAN, b.duplicate().order());
allocate/allocateDirect/map/wrap/duplicate/slice always return a big- endian buffer. asXBuffer (asCharBuffer et cetera) always returns a buffer with the same endian as the source. ...except for asReadOnlyBuffer, which always returns a big-endian buffer. (note that this is broken in Honeycomb; ICS gets it right.) the API's sufficiently unfriendly that any time you make a new Buffer you should probably call order(ByteOrder), just to preserve your own sanity. (or only ever run your code on a big-endian device, which is presumably how the API ended up this way... SPARC lives!) --elliott On Apr 28, 2:59 pm, MichaelEGR <foun...@egrsoftware.com> wrote: > CRITICAL NIO FLAW FOUND > > And I did the leg work again here and put in ~4 hours to reduce the > bug to a most fundamental example that should be a unit test in > Android. That it is not and this bug made it to production / shipping > is amazing. > > On all Java platforms 1.4, 5.0, 6.0 and Android OS version 1.0 - 2.3 > the value of index 1 of buffer & buffer2 is 0x10000 (65535). On > Android 3.0 / Honeycomb index 1 of buffer is 65535 and buffer 2 is > 256.. Clearly a major if not critical flaw in Honeycomb for usage of > the NIO API and calling duplicate() on a Buffer. Any code using NIO > and duplicate() will likely break on Honeycomb. > > Being that this is a critical flaw.. Do you guys offer rewards or is > that only security flaws? I'll take my $1,337 check or a Google I/O > ticket. > > You guys do understand that the 4 hours I did to reduce this critical > bug to an easily demonstrable level I'd charge more than a Google I/O > ticket on an invoice. > > To run on Android simply call com.egrsoftware.niotest.NIOTest.test() > from onCreate() of any Activity and check system output via adb logcat > or ddms. > > --------------------------------------------------------------------------- > ----------- > > package com.egrsoftware.niotest; > > import java.nio.ByteBuffer; > import java.nio.ByteOrder; > import java.nio.IntBuffer; > > /** > * NIOTest - Extremely simple unit test that Google should include in > Android because it catches a bug in NIO that is > * found in Android 3.0 / Honeycomb. This is a really nefarious bug as > the affected code could be networking code, any > * native JNI code, or in my case 3D rendering via the Android OpenGL > ES API. Any code using NIO and "duplicate()" is > * broken. > * > * On all Java platforms with NIO and Android versions 1.0 to 2.3 both > buffers should print out 65535. On Android / > * Honeycomb the 1st value in buffer 1 is 65535 and buffer 2 is > 256!!!! Clearly a bug that any simple unit testing > * should have found. This bug affects _ALL_ code that uses the NIO > duplicate() method on a Buffer. The fall out of > * this is immense! This is a critical bug! > */ > public class NIOTest > { > private static int s_SIZE_OF_INT = 4; > > public static void test() > { > IntBuffer buffer = ByteBuffer.allocateDirect(1 * > s_SIZE_OF_INT).order( > ByteOrder.nativeOrder()).asIntBuffer(); > > IntBuffer buffer2 = ByteBuffer.allocateDirect(1 * > s_SIZE_OF_INT).order( > ByteOrder.nativeOrder()).asIntBuffer(); > > IntBuffer bufferWrite2 = buffer2.duplicate(); > > buffer.put(0, 0x10000); //put 65535 > bufferWrite2.put(0, 0x10000); > > System.err.println("NIOTest ----------"); > System.err.println("buffer.get(): " +buffer.get()); > System.err.println("buffer2.get(): " +buffer2.get()); > } > > public static void main(String args[]) > { > test(); > } > > > > > > > > } -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en