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

Reply via email to