[Mesa-dev] [PATCH] util: require debug options to be separated by commas

José Fonseca jfonseca at vmware.com
Wed Jan 26 03:17:05 PST 2011


On Mon, 2011-01-24 at 20:52 -0800, Marek Olšák wrote:
> Let's assume there are two options with names such that one is a substring
> of another. Previously, if we only specified the longer one as a debug option,
> the shorter one would be considered specified as well (because of strstr).
> This commit fixes it by checking that each option is surrounded by commas.
> 
> (a regexp would be nicer, but this is not a performance critical code)
> ---
>  src/gallium/auxiliary/util/u_debug.c |   39 +++++++++++++++++++++++++++++++++-
>  1 files changed, 38 insertions(+), 1 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/util/u_debug.c b/src/gallium/auxiliary/util/u_debug.c
> index 59b7613..8cf7660 100644
> --- a/src/gallium/auxiliary/util/u_debug.c
> +++ b/src/gallium/auxiliary/util/u_debug.c
> @@ -180,6 +180,43 @@ debug_get_num_option(const char *name, long dfault)
>     return result;
>  }
>  
> +static boolean str_has_option(const char *str, const char *name)
> +{
> +   const char *substr;
> +
> +   /* OPTION=all */
> +   if (!util_strcmp(str, "all")) {
> +      return TRUE;
> +   }
> +
> +   /* OPTION=name */
> +   if (!util_strcmp(str, name)) {
> +      return TRUE;
> +   }
> +
> +   substr = util_strstr(str, name);
> +
> +   if (substr) {
> +      unsigned name_len = strlen(name);
> +
> +      /* OPTION=name,... */
> +      if (substr == str && substr[name_len] == ',') {
> +         return TRUE;
> +      }
> +
> +      /* OPTION=...,name */
> +      if (substr+name_len == str+strlen(str) && substr[-1] == ',') {
> +         return TRUE;
> +      }
> +
> +      /* OPTION=...,name,... */
> +      if (substr[-1] == ',' && substr[name_len] == ',') {
> +         return TRUE;
> +      }
> +   }
> +
> +   return FALSE;
> +}

Marek,

The intention is good -- it would be nice to get options obeyed properly
--, but this will fail to find "foo" in "OPTION=prefixfoosuffix,foo", so
it's replacing a bug with another.

I'd prefer we stop using strstr completely, and instead do:
1 - find the first ',' or '\0' in the string
2 - compare the previous characters with the option being searched, and
return TRUE if matches
3 - if it was ',' go back to 1, but starting from character after ','.
4 - otherwise return FALSE

It should be robust and almost the same amount of code.

Jose

>  unsigned long
>  debug_get_flags_option(const char *name, 
> @@ -207,7 +244,7 @@ debug_get_flags_option(const char *name,
>     else {
>        result = 0;
>        while( flags->name ) {
> -	 if (!util_strcmp(str, "all") || util_strstr(str, flags->name ))
> +	 if (str_has_option(str, flags->name))
>  	    result |= flags->value;
>  	 ++flags;
>        }




More information about the mesa-dev mailing list