[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



Ok, I must agree here.

Simon Kuenzer <simon.kuenzer@xxxxxxxxx> writes:

> 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
>> 

-- 
Yuri Volchkov
Software Specialist

NEC Europe Ltd
Kurfürsten-Anlage 36
D-69115 Heidelberg

_______________________________________________
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®.