From: Ruben Kerkhof Date: Tue, 1 Mar 2016 10:28:16 +0000 (+0100) Subject: Merge branch 'collectd-5.5' X-Git-Tag: collectd-5.6.0~462 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=6a1a62048b6d0d2ddf5c17295609d3ebf010f40b;p=collectd.git Merge branch 'collectd-5.5' --- 6a1a62048b6d0d2ddf5c17295609d3ebf010f40b diff --cc src/daemon/utils_subst.c index 43634df2,3e554973..cfa1c764 --- a/src/daemon/utils_subst.c +++ b/src/daemon/utils_subst.c @@@ -30,61 -30,35 +30,62 @@@ #include "collectd.h" #include "common.h" + #include "utils_subst.h" -char *subst (char *buf, size_t buflen, const char *string, int off1, int off2, +char *subst (char *buf, size_t buflen, const char *string, size_t off1, size_t off2, const char *replacement) { - char *buf_ptr = buf; - size_t len = buflen; + char *out = buf; - if ((NULL == buf) || (0 >= buflen) || (NULL == string) - || (0 > off1) || (0 > off2) || (off1 > off2) - || (NULL == replacement)) + char const *front; + char const *back; + size_t front_len; + size_t replacement_len; + size_t back_len; + + if ((NULL == buf) || (0 == buflen) || (NULL == string) || (NULL == replacement)) return NULL; - sstrncpy (buf_ptr, string, - ((size_t)off1 + 1 > buflen) ? buflen : (size_t)off1 + 1); - buf_ptr += off1; - len -= off1; + size_t string_len = strlen (string); + if ((off1 > string_len) || (off2 > string_len) || (off1 > off2)) + return NULL; - if (0 >= len) - return buf; + front = string; + back = string + off2; + front_len = off1; + replacement_len = strlen (replacement); + back_len = strlen (back); + + if (front_len >= buflen) { + front_len = buflen - 1; + replacement_len = 0; + back_len = 0; + } else if ((front_len + replacement_len) >= buflen) { + replacement_len = buflen - (front_len + 1); + back_len = 0; + } else if ((front_len + replacement_len + back_len) >= buflen) { + back_len = buflen - (front_len + replacement_len + 1); + } else { + buflen = front_len + replacement_len + back_len + 1; + } + assert ((front_len + replacement_len + back_len) == (buflen - 1)); - sstrncpy (buf_ptr, replacement, len); - buf_ptr += strlen (replacement); - len -= strlen (replacement); + if (front_len != 0) { + sstrncpy (out, front, front_len + 1); + out += front_len; + } - if (0 >= len) - return buf; + if (replacement_len != 0) { + sstrncpy (out, replacement, replacement_len + 1); + out += replacement_len; + } - sstrncpy (buf_ptr, string + off2, len); + if (back_len != 0) { + sstrncpy (out, back, back_len + 1); + out += back_len; + } + + out[0] = 0; return buf; } /* subst */