Use strict String->byte[] conversion 83/101883/1
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 28 Jul 2022 18:15:30 +0000 (20:15 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 28 Jul 2022 18:16:45 +0000 (20:16 +0200)
Improve defensiveness around constant encoding: the strings are expected
to be be ASCII-only, so enforce that by using a properly-configured
coder.

Change-Id: I991640d6ad6e4c928b64fdabcbe7f0b60418c7af
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/MessageParts.java

index a077671c7f22591bc49a567ddc820ce9af0fbed4..fb21b7f8c2a956d545062e42ef75aa3d1deee04a 100644 (file)
@@ -7,8 +7,11 @@
  */
 package org.opendaylight.netconf.nettyutil.handler;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
-
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.CodingErrorAction;
+import java.nio.charset.StandardCharsets;
 import org.opendaylight.netconf.util.messages.NetconfMessageConstants;
 
 /**
@@ -17,11 +20,27 @@ import org.opendaylight.netconf.util.messages.NetconfMessageConstants;
  * @author Thomas Pantelis
  */
 final class MessageParts {
-    static final byte[] END_OF_MESSAGE = NetconfMessageConstants.END_OF_MESSAGE.getBytes(UTF_8);
-    static final byte[] START_OF_CHUNK = NetconfMessageConstants.START_OF_CHUNK.getBytes(UTF_8);
-    static final byte[] END_OF_CHUNK = NetconfMessageConstants.END_OF_CHUNK.getBytes(UTF_8);
+    static final byte[] END_OF_MESSAGE = asciiBytes(NetconfMessageConstants.END_OF_MESSAGE);
+    static final byte[] START_OF_CHUNK = asciiBytes(NetconfMessageConstants.START_OF_CHUNK);
+    static final byte[] END_OF_CHUNK = asciiBytes(NetconfMessageConstants.END_OF_CHUNK);
 
     private MessageParts() {
         // Hidden on purpose
     }
+
+    private static byte[] asciiBytes(final String str) {
+        final ByteBuffer buf;
+        try {
+            buf = StandardCharsets.US_ASCII.newEncoder()
+                .onMalformedInput(CodingErrorAction.REPORT)
+                .onUnmappableCharacter(CodingErrorAction.REPORT)
+                .encode(CharBuffer.wrap(str));
+        } catch (CharacterCodingException e) {
+            throw new ExceptionInInitializerError(e);
+        }
+
+        final byte[] ret = new byte[buf.remaining()];
+        buf.get(ret);
+        return ret;
+    }
 }