From 20f9b0d9c66039a766f36dc8b9bbeb2fd75b24e7 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Wed, 12 Dec 2018 14:35:11 +0100 Subject: [PATCH] byte: add bytes to string w/o allocation --- src/util-byte.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/util-byte.h | 1 + 2 files changed, 49 insertions(+) diff --git a/src/util-byte.c b/src/util-byte.c index 81efe1973c..db33a4ba5d 100644 --- a/src/util-byte.c +++ b/src/util-byte.c @@ -27,6 +27,7 @@ #include "util-byte.h" #include "util-unittest.h" #include "util-debug.h" +#include "util-validate.h" /** \brief Turn byte array into string. * @@ -71,6 +72,53 @@ char *BytesToString(const uint8_t *bytes, size_t nbytes) return string; } +/** \brief Turn byte array into string. + * + * All non-printables are copied over, except for '\0', which is + * turned into literal \0 in the string. + * + * \param bytes byte array + * \param nbytes number of bytes + * \param outstr[out] buffer to fill + * \param outlen size of outstr. Must be at least 2 * nbytes + 1 in size + */ +void BytesToStringBuffer(const uint8_t *bytes, size_t nbytes, char *outstr, size_t outlen) +{ + DEBUG_VALIDATE_BUG_ON(outlen < (nbytes * 2 + 1)); + + size_t n = nbytes + 1; + size_t nulls = 0; + + size_t u; + for (u = 0; u < nbytes; u++) { + if (bytes[u] == '\0') + nulls++; + } + n += nulls; + + char string[n]; + + if (nulls == 0) { + /* no nulls */ + memcpy(string, bytes, nbytes); + string[nbytes] = '\0'; + } else { + /* nulls present */ + char *dst = string; + for (u = 0; u < nbytes; u++) { + if (bytes[u] == '\0') { + *dst++ = '\\'; + *dst++ = '0'; + } else { + *dst++ = bytes[u]; + } + } + *dst = '\0'; + } + + strlcpy(outstr, string, outlen); +} + int ByteExtractUint64(uint64_t *res, int e, uint16_t len, const uint8_t *bytes) { uint64_t i64; diff --git a/src/util-byte.h b/src/util-byte.h index aca846ac2b..08986ea504 100644 --- a/src/util-byte.h +++ b/src/util-byte.h @@ -81,6 +81,7 @@ * \return string nul-terminated string or NULL on error */ char *BytesToString(const uint8_t *bytes, size_t nbytes); +void BytesToStringBuffer(const uint8_t *bytes, size_t nbytes, char *outstr, size_t outlen); /** * Extract bytes from a byte string and convert to a unint64_t.