[Mesa-dev] [PATCH] main: replace str*dup() by str*cpy() to be compliant with C89, C99.

Jose Fonseca jfonseca at vmware.com
Mon Sep 28 04:34:08 PDT 2015


On 28/09/15 09:09, Samuel Iglesias Gonsalvez wrote:
> Fix SCons MinGW build error:
>
> Compiling src/mesa/main/shader_query.cpp ...
> src/mesa/main/shader_query.cpp: In function ‘char* get_top_level_name(const char*)’:
> src/mesa/main/shader_query.cpp:841:34: error: ‘strndup’ was not declared in this scope
>      return strndup(name, name_size);
>                                    ^
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92124
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>

Thanks for looking into this.

> ---
>   src/mesa/main/shader_query.cpp | 19 ++++++++++++++-----
>   1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
> index e020dce..7eecb39 100644
> --- a/src/mesa/main/shader_query.cpp
> +++ b/src/mesa/main/shader_query.cpp
> @@ -838,18 +838,27 @@ get_top_level_name(const char *name)
>      else
>         name_size = first_square_bracket - name;
>
> -   return strndup(name, name_size);
> +   char *result = (char *) malloc((name_size + 1) * sizeof(char));
> +   strncpy(result, name, name_size);
> +   result[name_size] = '\0';
> +   return result;

I think we should add a strndup inline implementation in a shared header 
somewhere.  We should avoid having the strndup reimplemented repeatedly, 
as that is error prone.

And that implementation should malloc the length of the resulting string 
plus one, not the max_size + 1 to avoid wasting memory if later strndup 
is invoked with a max_size much larger than the incoming string.

>   }
>
>   static char*
>   get_var_name(const char *name)
>   {
>      const char *first_dot = strchr(name, '.');
> +   char *result;
>
> -   if (!first_dot)
> -      return strdup(name);
> -

Both MinGW and MSVC have strdup. They just lack strndup.

> -   return strndup(first_dot+1, strlen(first_dot) - 1);

I think we could just return `strdup(first_dot)`.


> +   if (!first_dot) {
> +      result = (char *) malloc(strlen(name) * sizeof(char));
> +      return strcpy(result, name);
> +   }
> +   int var_name_size = strlen(first_dot) - 1;
> +   result = (char *) malloc((var_name_size + 1) * sizeof(char));
> +   strncpy(result, first_dot+1, var_name_size);
> +   result[var_name_size] = '\0';
> +   return result;
>   }
>
>   static GLint
>


Jose


More information about the mesa-dev mailing list