diff options
-rw-r--r-- | src/misc.c | 27 |
1 files changed, 14 insertions, 13 deletions
@@ -1797,29 +1797,29 @@ err: * @param[in] replace String to be replaced is stored in replace. * * @returns src_replaced a pointer that points to the replaced string. - * NULL if allocation fails. + * NULL if allocation fails or if src is NULL. */ char *ssh_strreplace(char *src, const char *pattern, const char *replace) { char *p = NULL; char *src_replaced = NULL; - size_t len_replaced; + + if (src == NULL) { + return NULL; + } if (pattern == NULL || replace == NULL) { - return src; + return strdup(src); } - if ((p = strstr(src, pattern)) != NULL) { + p = strstr(src, pattern); + + if (p != NULL) { size_t offset = p - src; - size_t len = strlen(src); size_t pattern_len = strlen(pattern); size_t replace_len = strlen(replace); - - if (replace_len != pattern_len) { - len_replaced = strlen(src) + replace_len - pattern_len + 1; - } else { - len_replaced = strlen(src) + 1; - } + size_t len = strlen(src); + size_t len_replaced = len + replace_len - pattern_len + 1; src_replaced = (char *)malloc(len_replaced); @@ -1831,9 +1831,10 @@ char *ssh_strreplace(char *src, const char *pattern, const char *replace) memcpy(src_replaced, src, offset); memcpy(src_replaced + offset, replace, replace_len); memcpy(src_replaced + offset + replace_len, src + offset + pattern_len, len - offset - pattern_len); + return src_replaced; /* free in the caller */ + } else { + return strdup(src); } - - return src_replaced; /* free in the caller */ } /** @} */ |