From 267285898210514f19e812e6aaf0cf8dfd681989 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Thu, 17 Dec 2015 16:55:20 -0500 Subject: [PATCH] GH-236: EmbeddedHeadersMessageConverter Multibyte Fixes #236 Buffer overflow when converting multi-byte characters from Unicode to UTF-8. --- .../EmbeddedHeadersMessageConverter.java | 4 ++-- .../stream/binder/MessageConverterTests.java | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/EmbeddedHeadersMessageConverter.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/EmbeddedHeadersMessageConverter.java index d0b77f8c1..02fe1d61c 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/EmbeddedHeadersMessageConverter.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/EmbeddedHeadersMessageConverter.java @@ -63,9 +63,9 @@ public class EmbeddedHeadersMessageConverter { : original.get(header); if (value != null) { String json = this.objectMapper.toJson(value); - headerValues[n++] = json.getBytes("UTF-8"); + headerValues[n] = json.getBytes("UTF-8"); headerCount++; - headersLength += header.length() + json.length(); + headersLength += header.length() + headerValues[n++].length; } else { headerValues[n++] = null; diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/MessageConverterTests.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/MessageConverterTests.java index 8fcb74e94..a69ed3e92 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/MessageConverterTests.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/MessageConverterTests.java @@ -53,6 +53,24 @@ public class MessageConverterTests { assertEquals("quxx", extracted.get("baz")); } + @Test + public void testUnicodeHeader() throws Exception { + EmbeddedHeadersMessageConverter converter = new EmbeddedHeadersMessageConverter(); + Message message = MessageBuilder.withPayload("Hello".getBytes()) + .setHeader("foo", "bar") + .setHeader("baz", "ØØØØØØØØ") + .build(); + byte[] embedded = converter.embedHeaders(new MessageValues(message), "foo", "baz"); + assertEquals(0xff, embedded[0] & 0xff); + assertEquals("\u0002\u0003foo\u0000\u0000\u0000\u0005\"bar\"\u0003baz\u0000\u0000\u0000\u0012\"ØØØØØØØØ\"Hello", + new String(embedded, "UTF-8").substring(1)); + + MessageValues extracted = converter.extractHeaders(MessageBuilder.withPayload(embedded).build(), false); + assertEquals("Hello", new String((byte[])extracted.getPayload())); + assertEquals("bar", extracted.get("foo")); + assertEquals("ØØØØØØØØ", extracted.get("baz")); + } + @Test public void testHeaderEmbeddingMissingHeader() throws Exception { EmbeddedHeadersMessageConverter converter = new EmbeddedHeadersMessageConverter();