I agree with the concept of handling UTF-8, but I do not like this
implementation. We discussed this a couple of months ago,
https://sourceforge.net/p/net-snmp/mailman/message/36322758/

  Bill


On Mon, Jul 16, 2018 at 5:16 AM Josef Ridky <jri...@redhat.com> wrote:

> 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
>
------------------------------------------------------------------------------
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