[Mesa-dev] [PATCH] util: implement strndup for WIN32

Samuel Iglesias Gonsálvez siglesias at igalia.com
Tue Sep 29 07:03:52 PDT 2015



On 29/09/15 15:21, Neil Roberts wrote:
> I think this implementation will have problems if the string being
> copied is not null terminated. It's not clear from the man pages whether
> that is an allowed way to use the function but a quick Google shows up a
> few similar patches where they have later been fixed by using strnlen.
> It looks like strnlen is available in MinGW so I think it would be worth
> doing.
> 

You are right. If string is not null-terminated, we would have an
undefined result from strlen().

> I notice that ralloc_strndup has a similar problem so maybe it would be
> worth fixing both of them in a separate patch.
> 

OK, I can write a patch this patch.

> I don't understand the reasoning for using calloc instead of malloc.
> Won't that just add redundant overhead?
>

Yes, it would add some overhead but we get rid of the null character we
would need add at the end, and calloc checks for overflow on
multiplication: if the total size of the requested block is too large
(like overflows size_t), calloc returns null pointer to indicate failure.

However, it's true this overflow is not very common.

> Sorry this review was too late to get in before the patch landed.
> 

No problem. Next time I will wait some time before pushing any patch.

Thanks,

Sam

> Regards,
> - Neil
> 
> Samuel Iglesias Gonsalvez <siglesias at igalia.com> writes:
> 
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92124
>> Cc: Jose Fonseca <jfonseca at vmware.com>
>> ---
>>
>> I tested it on MSVC but not MinGW. I hope I did not something wrong.
>>
>>  src/mesa/main/shader_query.cpp |  1 +
>>  src/util/Makefile.sources      |  1 +
>>  src/util/strndup.c             | 47 ++++++++++++++++++++++++++++++++++++++++++
>>  src/util/strndup.h             | 28 +++++++++++++++++++++++++
>>  4 files changed, 77 insertions(+)
>>  create mode 100644 src/util/strndup.c
>>  create mode 100644 src/util/strndup.h
>>
>> diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
>> index e020dce..0cada50 100644
>> --- a/src/mesa/main/shader_query.cpp
>> +++ b/src/mesa/main/shader_query.cpp
>> @@ -37,6 +37,7 @@
>>  #include "../glsl/program.h"
>>  #include "uniforms.h"
>>  #include "main/enums.h"
>> +#include "util/strndup.h"
>>  
>>  extern "C" {
>>  #include "shaderapi.h"
>> diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources
>> index afdd0cb..10f2c02 100644
>> --- a/src/util/Makefile.sources
>> +++ b/src/util/Makefile.sources
>> @@ -17,6 +17,7 @@ MESA_UTIL_FILES :=	\
>>  	set.c \
>>  	set.h \
>>  	simple_list.h \
>> +	strndup.c \
>>  	strtod.c \
>>  	strtod.h \
>>  	texcompress_rgtc_tmp.h \
>> diff --git a/src/util/strndup.c b/src/util/strndup.c
>> new file mode 100644
>> index 0000000..6e5bb22
>> --- /dev/null
>> +++ b/src/util/strndup.c
>> @@ -0,0 +1,47 @@
>> +/*
>> + * Copyright (c) 2015 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + */
>> +
>> +#if defined(_WIN32)
>> +#include <stdlib.h>
>> +#include "strndup.h"
>> +
>> +char *
>> +strndup(const char *str, size_t max)
>> +{
>> +   size_t n;
>> +   char *ptr;
>> +
>> +   if (str == NULL)
>> +      return NULL;
>> +
>> +   n = strlen(str);
>> +   if (n > max)
>> +      n = max;
>> +
>> +   ptr = (char *) malloc((n + 1) * sizeof(char));
>> +   memcpy(ptr, str, n);
>> +   ptr[n] = '\0';
>> +   return ptr;
>> +}
>> +
>> +#endif
>> diff --git a/src/util/strndup.h b/src/util/strndup.h
>> new file mode 100644
>> index 0000000..dc8cdd2
>> --- /dev/null
>> +++ b/src/util/strndup.h
>> @@ -0,0 +1,28 @@
>> +/*
>> + * Copyright (c) 2015 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + */
>> +
>> +#if defined(_WIN32)
>> +
>> +extern char *strndup(const char *str, size_t max);
>> +
>> +#endif
>> -- 
>> 2.1.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list