From 51aceed49d7edcf1ce385d6d97f0acb7067a6608 Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Mon, 8 Aug 2016 11:23:02 +0300 Subject: [PATCH] lib: Add binary-safe tabescape --- src/lib/strescape.c | 23 +++++++++++++++++++---- src/lib/strescape.h | 1 + 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/lib/strescape.c b/src/lib/strescape.c index 75641c21e3..e0a1cb7d25 100644 --- a/src/lib/strescape.c +++ b/src/lib/strescape.c @@ -101,10 +101,14 @@ int str_unescape_next(const char **str, const char **unescaped_r) return 0; } -void str_append_tabescaped(string_t *dest, const char *src) +void str_append_tabescaped_n(string_t *dest, const unsigned char *src, size_t src_size) { - for (; *src != '\0'; src++) { - switch (*src) { + for (size_t i = 0; i < src_size; i++) { + switch (src[i]) { + case '\000': + str_append_c(dest, '\001'); + str_append_c(dest, '0'); + break; case '\001': str_append_c(dest, '\001'); str_append_c(dest, '1'); @@ -122,12 +126,17 @@ void str_append_tabescaped(string_t *dest, const char *src) str_append_c(dest, 'n'); break; default: - str_append_c(dest, *src); + str_append_c(dest, src[i]); break; } } } +void str_append_tabescaped(string_t *dest, const char *src) { + str_append_tabescaped_n(dest, (const unsigned char*)src, strlen(src)); +} + + const char *str_tabescape(const char *str) { string_t *tmp; @@ -161,6 +170,9 @@ void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size) i++; if (i < src_size) { switch (src_c[i]) { + case '0': + str_append_c(dest, '\000'); + break; case '1': str_append_c(dest, '\001'); break; @@ -203,6 +215,9 @@ char *str_tabunescape(char *str) if (*str == '\0') break; switch (*str) { + case '0': + *dest++ = '\000'; + break; case '1': *dest++ = '\001'; break; diff --git a/src/lib/strescape.h b/src/lib/strescape.h index 550e3adfac..acf7cba67d 100644 --- a/src/lib/strescape.h +++ b/src/lib/strescape.h @@ -21,6 +21,7 @@ int str_unescape_next(const char **str, const char **unescaped_r); using \001. */ const char *str_tabescape(const char *str); void str_append_tabescaped(string_t *dest, const char *src); +void str_append_tabescaped_n(string_t *dest, const unsigned char *src, size_t src_size); void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size); char *str_tabunescape(char *str); const char *t_str_tabunescape(const char *str);