diff --git a/mongoose.c b/mongoose.c index b116409a689f391f443b5daf63eba86ee6811488..ce07eed3866752d7e07c8c08b308bb2225ea1649 100644 --- a/mongoose.c +++ b/mongoose.c @@ -1389,19 +1389,31 @@ int mg_vcasecmp(const struct mg_str *str1, const char *str2) { return r; } -struct mg_str mg_strdup(const struct mg_str s) WEAK; -struct mg_str mg_strdup(const struct mg_str s) { +static struct mg_str mg_strdup_common(const struct mg_str s, + int nul_terminate) { struct mg_str r = {NULL, 0}; if (s.len > 0 && s.p != NULL) { - r.p = (char *) MG_MALLOC(s.len); - if (r.p != NULL) { - memcpy((char *) r.p, s.p, s.len); + char *sc = (char *) MG_MALLOC(s.len + (nul_terminate ? 1 : 0)); + if (sc != NULL) { + memcpy(sc, s.p, s.len); + if (nul_terminate) sc[s.len] = '\0'; + r.p = sc; r.len = s.len; } } return r; } +struct mg_str mg_strdup(const struct mg_str s) WEAK; +struct mg_str mg_strdup(const struct mg_str s) { + return mg_strdup_common(s, 1 /* NUL-terminate */); +} + +struct mg_str mg_strdup_nul(const struct mg_str s) WEAK; +struct mg_str mg_strdup_nul(const struct mg_str s) { + return mg_strdup_common(s, 0 /* NUL-terminate */); +} + int mg_strcmp(const struct mg_str str1, const struct mg_str str2) WEAK; int mg_strcmp(const struct mg_str str1, const struct mg_str str2) { size_t i = 0; diff --git a/mongoose.h b/mongoose.h index 622923e33a35e5df0ad5102013ad843a2c6f0d19..76911e1c1bc841805143ddf97007abe2ddc58f2b 100644 --- a/mongoose.h +++ b/mongoose.h @@ -1789,7 +1789,15 @@ int mg_vcmp(const struct mg_str *str2, const char *str1); */ int mg_vcasecmp(const struct mg_str *str2, const char *str1); +/* Creates a copy of s (heap-allocated). */ struct mg_str mg_strdup(const struct mg_str s); + +/* + * Creates a copy of s (heap-allocated). + * Resulting string is NUL-terminated (but NUL is not included in len). + */ +struct mg_str mg_strdup_nul(const struct mg_str s); + int mg_strcmp(const struct mg_str str1, const struct mg_str str2); int mg_strncmp(const struct mg_str str1, const struct mg_str str2, size_t n);