/*
* Tries to prefix characters tagged in the <map> with the <escape>
- * character. The input <string> must be zero-terminated. The result will
+ * character. The input <string> is processed until string_stop
+ * is reached or NULL-byte is encountered. The result will
* be stored between <start> (included) and <stop> (excluded). This
* function will always try to terminate the resulting string with a '\0'
* before <stop>, and will return its position if the conversion
*/
char *escape_string(char *start, char *stop,
const char escape, const long *map,
- const char *string);
+ const char *string, const char *string_stop);
/*
* Tries to prefix characters tagged in the <map> with the <escape>
}
if (src && len) {
- if (++len > size)
- len = size;
+ /* escape_string and strlcpy2 will both try to add terminating NULL-byte
+ * to dst, so we need to make sure that extra byte will fit into dst
+ * before calling them
+ */
if (node->options & LOG_OPT_ESC) {
char *ret;
- ret = escape_string(dst, dst + len, '\\', rfc5424_escape_map, src);
+ ret = escape_string(dst, (dst + size - 1), '\\', rfc5424_escape_map, src, src + len);
if (ret == NULL || *ret != '\0')
return NULL;
len = ret - dst;
}
else {
+ if (++len > size)
+ len = size;
len = strlcpy2(dst, src, len);
}
if (size < 2)
return NULL;
*(dst++) = '-';
+ size -= 1;
}
if (node->options & LOG_OPT_QUOTE) {
/*
* Tries to prefix characters tagged in the <map> with the <escape>
- * character. The input <string> must be zero-terminated. The result will
+ * character. The input <string> is processed until string_stop
+ * is reached or NULL-byte is encountered. The result will
* be stored between <start> (included) and <stop> (excluded). This
* function will always try to terminate the resulting string with a '\0'
* before <stop>, and will return its position if the conversion
*/
char *escape_string(char *start, char *stop,
const char escape, const long *map,
- const char *string)
+ const char *string, const char *string_stop)
{
if (start < stop) {
stop--; /* reserve one byte for the final '\0' */
- while (start < stop && *string != '\0') {
+ while (start < stop && string < string_stop && *string != '\0') {
if (!ha_bit_test((unsigned char)(*string), map))
*start++ = *string;
else {