When a message is sent with a message bundler (in TP), the output buffer in TP.BaseBundler is reused for all messages of a given bundle (say m1 and m2).
This works for TCP and UDP because a write blocks and - when it returns - we're guaranteed that the buffer has been copied into an OS buffer (TCP's send window).
However, this is different with TCP_NIO2: an async write always returns immediately, irrespective of whether the data was written completely, partially, or not at all !
If a write only writes a part of its data, on returning from the write, the message bundler reuses the output buffer and can thus overwrite and corrupt buffers that are in transit, waiting to be written.
A quick check where buffers were copied fixed the problem.
TODO: see where we need to copy data when using a bundler. Possibly only copy if a write didn't write all of the data.