[PATCH / request for votes] CHANGES: BUG: 2815: Display UTF-8 characters again

Bart Van Assche <[email protected]>
Newsgroups gmane.network.net-snmp.devel
Message-ID <[email protected]>
Before commit 7f05daa8e0e0 sprint_realloc_octet_string() used memcpy()
for ASCII strings. That caused the output to be truncated if a '\0' was
embedded in an octet string. Commit 7f05daa8e0e0 fixed that issue but
broke UTF-8 support. Restore UTF-8 support by only using
sprint_realloc_asciistring() if the octet string contains a '\0'.

Fixes: 7f05daa8e0e0 ("CHANGES: BUG: 3444939: BUG: 1796886: snmplib: Avoid that sprint_realloc_octet_string() embeds unprintable control characters or binary zeroes in its output. This behavior could cause truncated output in snmptrapd.")
---
 snmplib/mib.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/snmplib/mib.c b/snmplib/mib.c
index 6c72acf9326c..a16144065029 100644
--- a/snmplib/mib.c
+++ b/snmplib/mib.c
@@ -578,10 +578,20 @@ sprint_realloc_octet_string(u_char ** buf, size_t * buf_len,
                     break;
                 case 't': /* new in rfc 3411 */
                 case 'a':
+                    /* A string hint gives the max size - we may not need this much */
                     cnt = SNMP_MIN(width, ecp - cp);
-                    if (!sprint_realloc_asciistring(buf, buf_len, out_len,
-                                                    allow_realloc, cp, cnt))
+                    while ((*out_len + cnt + 1) > *buf_len) {
+                        if (!allow_realloc || !snmp_realloc(buf, buf_len))
+                            return 0;
+                    }
+                    if (memchr(cp, '\0', cnt) == NULL) {
+                        /* No embedded '\0' - use strlcpy() to preserve UTF-8 */
+                        strlcpy((char *)(*buf + *out_len), (char *)cp, cnt + 1);
+                        *out_len += cnt;
+                    } else if (!sprint_realloc_asciistring(buf, buf_len,
+                                     out_len, allow_realloc, cp, cnt)) {
                         return 0;
+                    }
                     cp += cnt;
                     break;
                 default:
-- 
2.16.3


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.