diff --git a/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/AbstractSnmpValue.java b/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/AbstractSnmpValue.java index 97b9d876bf45..663f40581853 100644 --- a/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/AbstractSnmpValue.java +++ b/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/AbstractSnmpValue.java @@ -30,12 +30,30 @@ import java.nio.charset.Charset; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.CharUtils; public abstract class AbstractSnmpValue implements SnmpValue { public static boolean allBytesPlainAscii(final byte[] bytes) { - return StringUtils.isAsciiPrintable(new String(bytes, Charset.defaultCharset())); + if (bytes == null) { + return false; + } + + final String str = new String(bytes, Charset.defaultCharset()); + final int sz = str.length(); + + for(int i = 0; i < sz; ++i) { + // check whether character is between 31 and 127 + final boolean isDisplayable = CharUtils.isAsciiPrintable(str.charAt(i)); + // check for null terminated string + final boolean isNullTerminated = str.charAt(i) == 0 && i == sz-1; + + if (!isDisplayable && !isNullTerminated) { + return false; + } + } + + return true; } public static boolean allBytesDisplayable(final byte[] bytes) { diff --git a/core/snmp/impl-mock/src/main/java/org/opennms/netmgt/snmp/mock/MockSnmpValue.java b/core/snmp/impl-mock/src/main/java/org/opennms/netmgt/snmp/mock/MockSnmpValue.java index 92fd460414bc..f8a78bc1e8ee 100644 --- a/core/snmp/impl-mock/src/main/java/org/opennms/netmgt/snmp/mock/MockSnmpValue.java +++ b/core/snmp/impl-mock/src/main/java/org/opennms/netmgt/snmp/mock/MockSnmpValue.java @@ -101,7 +101,7 @@ public String toHexString() { @Override public boolean isDisplayable() { - return allBytesDisplayable(getBytes()); + return allBytesPlainAscii(getBytes()); } } diff --git a/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/mock/SnmpValueTest.java b/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/mock/SnmpValueTest.java index 0b54faa9a1db..0512de96dff6 100644 --- a/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/mock/SnmpValueTest.java +++ b/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/mock/SnmpValueTest.java @@ -291,7 +291,7 @@ public void testOtherAddressOctetString() { final SnmpValue value = factory.getOctetString(rawBytes); assertArrayEquals(className + ": getOctetString bytes should match", rawBytes, value.getBytes()); - assertTrue(className + ": getOctetString displayable should be true", value.isDisplayable()); + assertFalse(className + ": getOctetString displayable should be false", value.isDisplayable()); assertEquals(className + ": getOctetString to String should return " + stringBytes, stringBytes, value.toString()); assertEquals(className + ": getOctetString to DisplayString should return " + stringBytes, stringBytes, value.toDisplayString()); assertEquals(className + ": getOctetString to HexString should return " + hexString, hexString, value.toHexString());