Skip to content

bug in writerBinary method of class JsonWriter #274

@ghost

Description

Current implementation

	public final void writeBinary(final byte[] value) {
		if (position + (value.length << 1) + 2 >= buffer.length) {
			enlargeOrFlush(position, (value.length << 1) + 2);
		}
		buffer[position++] = '"';
		position += Base64.encodeToBytes(value, buffer, position);
		buffer[position++] = '"';
	}

it produces in my tests at times the exception java.lang.IndexOutOfBoundsException: Range [0, 0 + 513) out of bounds for length 512.

The calculation of the space needed in the buffer for encoding the binary data to Base64 in the current implementation seems incorrect. The formula (value.length << 1) + 2 suggests that each byte in the binary array requires at most two bytes in the Base64-encoded form, which falls short when the array has length one. In this case we need 6 bytes and not 4

Here's the corrected version of the code:

public final void writeBinary(final byte[] value) {
    int neededSize = (int) Math.ceil((double) length / 3) * 4 + 2;
    if (position + neededSize >= buffer.length) {
        enlargeOrFlush(position, neededSize);
    }
    buffer[position++] = '"';
    position += Base64.encodeToBytes(value, buffer, position);
    buffer[position++] = '"';
}

After this change, all my test passes.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions