qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2] sockets: fix parsing of ipv4/ipv6 opts in pa


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH v2] sockets: fix parsing of ipv4/ipv6 opts in parse_socket_addr
Date: Fri, 26 Jan 2018 12:05:43 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2

On 25/01/2018 18:14, Daniel P. Berrangé wrote:
> From: "Daniel P. Berrange" <address@hidden>
> 
> The inet_parse() function looks for 'ipv4' and 'ipv6' flags, but only
> treats them as bare bool flags. The normal QemuOpts parsing would allow
> on/off values to be set too.
> 
> This updates inet_parse() so that its handling of the 'ipv4' and 'ipv6'
> flags matches that done by QemuOpts.
> 
> This impacts the NBD block driver parsing the legacy filename syntax and
> the migration code parsing the socket scheme.
> 
> Signed-off-by: Daniel P. Berrange <address@hidden>
> ---
>  util/qemu-sockets.c | 44 ++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 40 insertions(+), 4 deletions(-)
> 
> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> index d6a1e1759e..300ebce795 100644
> --- a/util/qemu-sockets.c
> +++ b/util/qemu-sockets.c
> @@ -554,6 +554,33 @@ err:
>  }
>  
>  /* compatibility wrapper */
> +static int inet_parse_flag(const char *flagname, const char *optstr, bool 
> *val,
> +                           Error **errp)
> +{
> +    char *end;
> +    size_t len;
> +
> +    end = strstr(optstr, ",");
> +    if (end) {
> +        if (end[1] == ',') { /* Reject 'ipv6=on,,foo' */
> +            error_setg(errp, "error parsing '%s' flag '%s'", flagname, 
> optstr);
> +            return -1;
> +        }
> +        len = end - optstr;
> +    } else {
> +        len = strlen(optstr);
> +    }
> +    if (len == 0 || (len == 3 && strncmp(optstr, "=on", len) == 0)) {
> +        *val = true;
> +    } else if ((len == 4) && strncmp(optstr, "=off", len) == 0) {
> +        *val = false;
> +    } else {
> +        error_setg(errp, "error parsing '%s' flag '%s'", flagname, optstr);
> +        return -1;
> +    }
> +    return 0;
> +}
> +
>  int inet_parse(InetSocketAddress *addr, const char *str, Error **errp)
>  {
>      const char *optstr, *h;
> @@ -561,6 +588,7 @@ int inet_parse(InetSocketAddress *addr, const char *str, 
> Error **errp)
>      char port[33];
>      int to;
>      int pos;
> +    char *begin;
>  
>      memset(addr, 0, sizeof(*addr));
>  
> @@ -602,11 +630,19 @@ int inet_parse(InetSocketAddress *addr, const char 
> *str, Error **errp)
>          addr->has_to = true;
>          addr->to = to;
>      }
> -    if (strstr(optstr, ",ipv4")) {
> -        addr->ipv4 = addr->has_ipv4 = true;
> +    begin = strstr(optstr, ",ipv4");
> +    if (begin) {
> +        if (inet_parse_flag("ipv4", begin + 5, &addr->ipv4, errp) < 0) {
> +            return -1;
> +        }
> +        addr->has_ipv4 = true;
>      }
> -    if (strstr(optstr, ",ipv6")) {
> -        addr->ipv6 = addr->has_ipv6 = true;
> +    begin = strstr(optstr, ",ipv6");
> +    if (begin) {
> +        if (inet_parse_flag("ipv6", begin + 5, &addr->ipv6, errp) < 0) {
> +            return -1;
> +        }
> +        addr->has_ipv6 = true;
>      }
>      return 0;
>  }
> 

Applied with Eric's suggested change.

Paolo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]