X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdaemon%2Futils_subst.c;h=1bc28f724ea22e927e6981b09d28fd0d8de2bf8c;hb=4d86011a91b7fe05fd5f4d84fa88c19d8c031110;hp=2f28eb9b141fabbdaf452b227727dfa3f1b40bd5;hpb=6258e772d808f4e76ea8e23d9e2750cfc7e6c60d;p=collectd.git diff --git a/src/daemon/utils_subst.c b/src/daemon/utils_subst.c index 2f28eb9b..1bc28f72 100644 --- a/src/daemon/utils_subst.c +++ b/src/daemon/utils_subst.c @@ -29,35 +29,64 @@ */ #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; + + 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; - if ((NULL == buf) || (0 >= buflen) || (NULL == string) - || (0 > off1) || (0 > off2) || (off1 > off2) - || (NULL == replacement)) + size_t string_len = strlen (string); + if ((off1 > string_len) || (off2 > string_len) || (off1 > off2)) return NULL; - sstrncpy (buf_ptr, string, - ((size_t)off1 + 1 > buflen) ? buflen : (size_t)off1 + 1); - buf_ptr += off1; - len -= off1; + 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)); - if (0 >= len) - return buf; + if (front_len != 0) { + sstrncpy (out, front, front_len + 1); + out += front_len; + } - sstrncpy (buf_ptr, replacement, len); - buf_ptr += strlen (replacement); - len -= strlen (replacement); + if (replacement_len != 0) { + sstrncpy (out, replacement, replacement_len + 1); + out += replacement_len; + } - if (0 >= len) - return buf; + if (back_len != 0) { + sstrncpy (out, back, back_len + 1); + out += back_len; + } - sstrncpy (buf_ptr, string + off2, len); + out[0] = 0; return buf; } /* subst */ @@ -74,7 +103,7 @@ char *asubst (const char *string, int off1, int off2, const char *replacement) len = off1 + strlen (replacement) + strlen (string) - off2 + 1; - buf = (char *)malloc (len); + buf = malloc (len); if (NULL == buf) return NULL; @@ -87,7 +116,6 @@ char *asubst (const char *string, int off1, int off2, const char *replacement) char *subst_string (char *buf, size_t buflen, const char *string, const char *needle, const char *replacement) { - char *temp; size_t needle_len; size_t i; @@ -95,19 +123,13 @@ char *subst_string (char *buf, size_t buflen, const char *string, || (needle == NULL) || (replacement == NULL)) return (NULL); - temp = (char *) malloc (buflen); - if (temp == NULL) - { - ERROR ("subst_string: malloc failed."); - return (NULL); - } - needle_len = strlen (needle); - strncpy (buf, string, buflen); + sstrncpy (buf, string, buflen); /* Limit the loop to prevent endless loops. */ for (i = 0; i < buflen; i++) { + char temp[buflen]; char *begin_ptr; size_t begin; @@ -141,7 +163,6 @@ char *subst_string (char *buf, size_t buflen, const char *string, i, string, needle, replacement); } - sfree (temp); return (buf); } /* char *subst_string */