util: require debug options to be separated by commas

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)
This commit is contained in:
Marek Olšák 2011-01-24 23:41:51 +01:00
parent 0657fc00dd
commit c7c733545a
1 changed files with 38 additions and 1 deletions

View File

@ -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;
}
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;
}