Net-SNMP isn't able to handle double byte characters like UTF-8. Though it can handle single byte characters (US-ASCII characters) properly, UTF-8 and ShiftJIS characters are displays as "........."
Steps to Reproduce: - Edit /etc/snmp/snmptrapd.conf and add or uncomment the following line. authCommunity log,execute,net public Start snmptrapd service. # systemctl start snmptrapd Run following command. # snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.2.1.3 .1.3.6.1.4.1.8072.2.1.3 s "データ" Check the /var/log/messages or journalctl Following patch brings support for double byte characters (UTF-8). All comments are welcome. --- diff -urNp old/snmplib/mib.c new/snmplib/mib.c --- old/snmplib/mib.c 2017-10-18 09:47:39.345569965 +0200 +++ new/snmplib/mib.c 2017-10-18 14:05:11.237452328 +0200 @@ -370,7 +371,31 @@ sprint_realloc_hexstring(u_char ** buf, return 1; } +/** + * Check, if given character contains value specific for UTF-8 encoding. + * + * @param cp character to check + * + * @return 0 on failure, 2 for two-byte character, 3 for three-byte character + * and 4 for four-byte character + */ +int +isUTF8MultiByte(const u_char cp) +{ + if(cp >= 0xC2 && cp <= 0xDF){ + return 2; + } + + if(cp >= 0xE0 && cp <= 0xEF){ + return 3; + } + if(cp >= 0xF2 && cp <= 0xFF){ + return 4; + } + + return 0; +} /** * Prints an ascii string into a buffer. @@ -396,22 +421,36 @@ sprint_realloc_asciistring(u_char ** buf size_t * out_len, int allow_realloc, const u_char * cp, size_t len) { - int i; + int i, j, multibyte; for (i = 0; i < (int) len; i++) { - if (isprint(*cp) || isspace(*cp)) { - if (*cp == '\\' || *cp == '"') { + if (isprint(*cp) || isspace(*cp) || isUTF8MultiByte(*cp) > 0) { + + multibyte = isUTF8MultiByte(*cp); + + if(multibyte > 0){ + for(j = 0; j < multibyte; j++, i++) { + if ((*out_len >= *buf_len) && + !(allow_realloc && snmp_realloc(buf, buf_len))) { + return 0; + } + *(*buf + (*out_len)++) = *cp++; + + } + } else { + if (*cp == '\\' || *cp == '"') { + if ((*out_len >= *buf_len) && + !(allow_realloc && snmp_realloc(buf, buf_len))) { + return 0; + } + *(*buf + (*out_len)++) = '\\'; + } if ((*out_len >= *buf_len) && !(allow_realloc && snmp_realloc(buf, buf_len))) { return 0; } - *(*buf + (*out_len)++) = '\\'; - } - if ((*out_len >= *buf_len) && - !(allow_realloc && snmp_realloc(buf, buf_len))) { - return 0; + *(*buf + (*out_len)++) = *cp++; } - *(*buf + (*out_len)++) = *cp++; } else { if ((*out_len >= *buf_len) && !(allow_realloc && snmp_realloc(buf, buf_len))) { --- Regards Josef Ridky Associate Software Engineer Core Services Team Red Hat Czech, s.r.o. ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Net-snmp-coders mailing list Net-snmp-coders@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/net-snmp-coders