aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/core/utils.h2
-rw-r--r--src/utils.c27
-rw-r--r--tests/utils/utils_test.c10
-rw-r--r--tests/utils/utils_test.ok2
4 files changed, 10 insertions, 31 deletions
diff --git a/include/osmocom/core/utils.h b/include/osmocom/core/utils.h
index 16159d3d..e3728cd0 100644
--- a/include/osmocom/core/utils.h
+++ b/include/osmocom/core/utils.h
@@ -137,7 +137,7 @@ bool osmo_identifier_valid(const char *str);
bool osmo_separated_identifiers_valid(const char *str, const char *sep_chars);
const char *osmo_escape_str(const char *str, int len);
-const char *osmo_escape_str_buf(const char *str, int in_len, char *buf, size_t bufsize);
+char *osmo_escape_str_buf(const char *str, int in_len, char *buf, size_t bufsize);
const char *osmo_quote_str(const char *str, int in_len);
const char *osmo_quote_str_buf(const char *str, int in_len, char *buf, size_t bufsize);
diff --git a/src/utils.c b/src/utils.c
index 2d5bcb0e..019e7338 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -538,14 +538,14 @@ bool osmo_identifier_valid(const char *str)
return osmo_separated_identifiers_valid(str, NULL);
}
-/*! Return the string with all non-printable characters escaped.
+/*! Return the string with all non-printable characters escapeda, in user-supplied buffer.
* \param[in] str A string that may contain any characters.
* \param[in] len Pass -1 to print until nul char, or >= 0 to force a length.
* \param[inout] buf string buffer to write escaped characters to.
* \param[in] bufsize size of \a buf.
- * \returns buf containing an escaped representation, possibly truncated, or str itself.
+ * \returns buf containing an escaped representation, possibly truncated.
*/
-const char *osmo_escape_str_buf(const char *str, int in_len, char *buf, size_t bufsize)
+char *osmo_escape_str_buf(const char *str, int in_len, char *buf, size_t bufsize)
{
int in_pos = 0;
int next_unprintable = 0;
@@ -567,9 +567,10 @@ const char *osmo_escape_str_buf(const char *str, int in_len, char *buf, size_t b
&& str[next_unprintable] != '\\';
next_unprintable++);
- if (next_unprintable == in_len
- && in_pos == 0)
- return str;
+ if (next_unprintable == in_len && in_pos == 0) {
+ osmo_strlcpy(buf, str, bufsize);
+ return buf;
+ }
while (in_pos < next_unprintable && out_pos < out_len)
out[out_pos++] = str[in_pos++];
@@ -633,25 +634,13 @@ const char *osmo_escape_str(const char *str, int in_len)
*/
const char *osmo_quote_str_buf(const char *str, int in_len, char *buf, size_t bufsize)
{
- const char *res;
int l;
if (!str)
return "NULL";
if (bufsize < 3)
return "<buf-too-small>";
buf[0] = '"';
- res = osmo_escape_str_buf(str, in_len, buf + 1, bufsize - 2);
- /* if osmo_escape_str_buf() returned the str itself, we need to copy it to buf to be able to
- * quote it. */
- if (res == str) {
- /* max_len = bufsize - two quotes - nul term */
- int max_len = bufsize - 2 - 1;
- if (in_len >= 0)
- max_len = OSMO_MIN(in_len, max_len);
- /* It is not allowed to pass unterminated strings into osmo_strlcpy() :/ */
- strncpy(buf + 1, str, max_len);
- buf[1 + max_len] = '\0';
- }
+ osmo_escape_str_buf(str, in_len, buf + 1, bufsize - 2);
l = strlen(buf);
buf[l] = '"';
buf[l+1] = '\0'; /* both osmo_escape_str_buf() and max_len above ensure room for '\0' */
diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c
index d592fe04..711d6e12 100644
--- a/tests/utils/utils_test.c
+++ b/tests/utils/utils_test.c
@@ -545,7 +545,7 @@ static void str_escape_test(void)
printf("- passthru:\n");
res = osmo_escape_str(printable, -1);
- if (res != printable)
+ if (strcmp(res, printable))
printf("NOT passed through! \"%s\"\n", res);
else
printf("passed through unchanged \"%s\"\n", res);
@@ -560,14 +560,6 @@ static void str_escape_test(void)
memset(out_buf, 0x7f, sizeof(out_buf));
printf("\"%s\"\n", osmo_escape_str_buf((const char *)in_buf, sizeof(in_buf), out_buf, 10));
OSMO_ASSERT(out_buf[10] == 0x7f);
-
- printf("- passthrough without truncation when no escaping needed:\n");
- memset(in_buf, 'x', sizeof(in_buf));
- in_buf[19] = 'E';
- in_buf[20] = '\0';
- memset(out_buf, 0x7f, sizeof(out_buf));
- printf("\"%s\"\n", osmo_escape_str_buf((const char *)in_buf, -1, out_buf, 10));
- OSMO_ASSERT(out_buf[0] == 0x7f);
}
static void str_quote_test(void)
diff --git a/tests/utils/utils_test.ok b/tests/utils/utils_test.ok
index 1215ddd1..8fce9f13 100644
--- a/tests/utils/utils_test.ok
+++ b/tests/utils/utils_test.ok
@@ -232,8 +232,6 @@ passed through unchanged "printable"
""
- truncation when too long:
"\axxxxxxE"
-- passthrough without truncation when no escaping needed:
-"xxxxxxxxxxxxxxxxxxxE"
Testing string quoting
- all chars from 0 to 255 in batches of 16: