+ return new_ptr;
+}
+
+void *silc_smemdup(SilcStack stack, const void *ptr, SilcUInt32 size)
+{
+ unsigned char *addr;
+
+ if (!stack)
+ return silc_memdup(ptr, size);
+
+ addr = silc_stack_malloc(stack, size + 1);
+ if (silc_unlikely(!addr))
+ return NULL;
+ memcpy((void *)addr, ptr, size);
+ addr[size] = '\0';
+ return (void *)addr;
+}
+
+char *silc_sstrdup(SilcStack stack, const char *str)
+{
+ SilcInt32 size = strlen(str);
+ char *addr;
+
+ if (!stack)
+ return silc_memdup(str, size);
+
+ addr = silc_stack_malloc(stack, size + 1);
+ if (silc_unlikely(!addr))
+ return NULL;
+ memcpy((void *)addr, str, size);
+ addr[size] = '\0';
+ return addr;
+}