[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [UNIKRAFT PATCH v2 02/10] lib/nolibc: Add strdup function



SIZE_MAX is the biggest value of size_t and the datatype size_t is sized for storing the theoretical maximum possible size of an object on your architecture (size_t is 32bits on 32bits and 64bits on 64bits). So, we are fully compliant by using strndup() with SIZE_MAX to implement strdup(). There is no truncation possible. The only thing that could happen is that you stop instead of having an infinite loop if you have nowhere a 0-byte in your fully mapped 16EB address space. If you want to have this as your defined behavior you are still free to use newlib or musl instead of nolibc.

I suggested to prefer strndup() in nolibc because it should be anyways be best practice to use this variant instead in your code. You could save implementing strdup() by wrapping it around strndup() as I suggested.

On 28.08.2018 14:33, Yuri Volchkov wrote:
Hey,

that would be incorrect behavior of strdup. There is no mention about
any length limit in the "man strdup". I checked the musl's
implementation - it does not have any limitation either.

So in case of improbable event that the source string is longer then
SIZE_MAX, the duplicate will be a truncated copy. Happy debugging :)

- Yuri

Simon Kuenzer <simon.kuenzer@xxxxxxxxx> writes:

Hey,

On 23.08.2018 12:59, Costin Lupu wrote:
Shamelessly taken from Mini-OS.

Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
---
   lib/nolibc/include/string.h |  1 +
   lib/nolibc/string.c         | 17 +++++++++++++++++
   2 files changed, 18 insertions(+)

diff --git a/lib/nolibc/include/string.h b/lib/nolibc/include/string.h
index 677f528..8674c77 100644
--- a/lib/nolibc/include/string.h
+++ b/lib/nolibc/include/string.h
@@ -57,6 +57,7 @@ size_t strlen(const char *str);
   const char *strchr(const char *str, int c);
   int strncmp(const char *str1, const char *str2, size_t len);
   int strcmp(const char *str1, const char *str2);
+char *strdup(const char *str);
#ifdef __cplusplus
   }
diff --git a/lib/nolibc/string.c b/lib/nolibc/string.c
index bf89106..bf4ab50 100644
--- a/lib/nolibc/string.c
+++ b/lib/nolibc/string.c
@@ -33,6 +33,7 @@
    * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
    */
+#include <stdlib.h>
   #include <stdint.h>
   #include <string.h>
   #include <limits.h>
@@ -166,3 +167,19 @@ int strcmp(const char *str1, const char *str2)
return __res;
   }
+
+char *strdup(const char *str)
+{
+       char *__res;
+       int __len;
+
+       __len = strlen(str);
+
+       __res = malloc(__len + 1);
+       if (!__res)
+               return NULL;
+
+       memcpy(__res, str, __len + 1);
+
+       return __res;
+}


Could you provide an strndup() instead and make strdup() use it? This
way we would cover both libc variants with one patch.

I mean, you would do something like:

char *strdup(const char *str)
{
        return strndup(str, SIZE_MAX);
}

Cheers,

Simon


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.