[systemd-devel] [PATCH] parse_boolean: require exact matches

Lennart Poettering lennart at poettering.net
Mon Aug 4 05:57:51 PDT 2014


On Sun, 27.07.14 15:19, Ansgar Burchardt (ansgar at debian.org) wrote:

> Require exact matches in all cases instead of treating strings
> starting with 't' ('f') as true (false).
> 
> This is required for config_parse_protect_system to parse ProtectSystem=full
> correctly: it uses parse_boolean and only tries a more specific parsing
> function if that did not return a valid result. Thus "full" was treated as
> "false" before.

Hmm, that sounds as if we also should change the order in which we parse
the string, no? I mean, first try to parse it as native enum, and only
if that doesn't work parse it as boolean?

> ---
>  src/shared/util.c    | 4 ++--
>  src/test/test-util.c | 1 +
>  2 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/src/shared/util.c b/src/shared/util.c
> index 4fda31c..49c17ef 100644
> --- a/src/shared/util.c
> +++ b/src/shared/util.c
> @@ -231,9 +231,9 @@ int unlink_noerrno(const char *path) {
>  int parse_boolean(const char *v) {
>          assert(v);
>  
> -        if (streq(v, "1") || v[0] == 'y' || v[0] == 'Y' || v[0] == 't' || v[0] == 'T' || strcaseeq(v, "on"))
> +        if (streq(v, "1") || strcaseeq(v, "yes") || strcaseeq(v, "y") || strcaseeq(v, "true") || strcaseeq(v, "t") || strcaseeq(v, "on"))
>                  return 1;
> -        else if (streq(v, "0") || v[0] == 'n' || v[0] == 'N' || v[0] == 'f' || v[0] == 'F' || strcaseeq(v, "off"))
> +        else if (streq(v, "0") || strcaseeq(v, "no") || strcaseeq(v, "n") || strcaseeq(v, "false") || strcaseeq(v, "f") || strcaseeq(v, "off"))
>                  return 0;
>  
>          return -EINVAL;
> diff --git a/src/test/test-util.c b/src/test/test-util.c
> index ed91a67..9a28ef9 100644
> --- a/src/test/test-util.c
> +++ b/src/test/test-util.c
> @@ -129,6 +129,7 @@ static void test_parse_boolean(void) {
>  
>          assert_se(parse_boolean("garbage") < 0);
>          assert_se(parse_boolean("") < 0);
> +        assert_se(parse_boolean("full") < 0);
>  }
>  
>  static void test_parse_pid(void) {


Lennart

-- 
Lennart Poettering, Red Hat


More information about the systemd-devel mailing list