]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Optimize t_strdup*()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 17 Sep 2021 13:02:10 +0000 (16:02 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 21 Sep 2021 07:12:53 +0000 (07:12 +0000)
Avoid zeroing the allocated data stack memory just before it's going to be
filled with the duplicated string anyway.

src/lib/strfuncs.c

index 68b67a2fb450ec60a6fcbb061ca882faf587d639..9c5d80eef0b6710e401ddfcd2f331cac74999846 100644 (file)
@@ -231,24 +231,46 @@ char *p_strconcat(pool_t pool, const char *str1, ...)
         return ret;
 }
 
+static void *t_memdup(const void *data, size_t size)
+{
+       void *mem = t_malloc_no0(size);
+       memcpy(mem, data, size);
+       return mem;
+}
+
 const char *t_strdup(const char *str)
 {
-       return p_strdup(unsafe_data_stack_pool, str);
+       return t_strdup_noconst(str);
 }
 
 char *t_strdup_noconst(const char *str)
 {
-       return p_strdup(unsafe_data_stack_pool, str);
+       if (str == NULL)
+               return NULL;
+       return t_memdup(str, strlen(str) + 1);
 }
 
 const char *t_strdup_empty(const char *str)
 {
-       return p_strdup_empty(unsafe_data_stack_pool, str);
+       if (str == NULL || *str == '\0')
+               return NULL;
+
+       return t_strdup(str);
 }
 
 const char *t_strdup_until(const void *start, const void *end)
 {
-       return p_strdup_until(unsafe_data_stack_pool, start, end);
+       char *mem;
+       size_t size;
+
+       i_assert((const char *) start <= (const char *) end);
+
+       size = (size_t)((const char *)end - (const char *)start);
+
+       mem = t_malloc_no0(size + 1);
+       memcpy(mem, start, size);
+       mem[size] = '\0';
+       return mem;
 }
 
 const char *t_strndup(const void *str, size_t max_chars)