diff mbox

[1/2] qemu-socket: allow hostnames starting with a digit

Message ID f873876770d40238ba1103ce9ba09c5e354ed4d1.1370274768.git.jtomko@redhat.com
State New
Headers show

Commit Message

Ján Tomko June 3, 2013, 3:54 p.m. UTC
According to RFC 1123 [1], hostnames can start with a digit too.

[1] http://tools.ietf.org/html/rfc1123#page-13

Signed-off-by: Ján Tomko <jtomko@redhat.com>
---
 util/qemu-sockets.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

Comments

Paolo Bonzini June 18, 2013, 9:42 a.m. UTC | #1
Il 03/06/2013 17:54, Ján Tomko ha scritto:
> According to RFC 1123 [1], hostnames can start with a digit too.
> 
> [1] http://tools.ietf.org/html/rfc1123#page-13
> 
> Signed-off-by: Ján Tomko <jtomko@redhat.com>
> ---
>  util/qemu-sockets.c | 13 ++++---------
>  1 file changed, 4 insertions(+), 9 deletions(-)
> 
> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> index fdd8dc4..727dafa 100644
> --- a/util/qemu-sockets.c
> +++ b/util/qemu-sockets.c
> @@ -24,7 +24,6 @@
>  
>  #include "monitor/monitor.h"
>  #include "qemu/sockets.h"
> -#include "qemu-common.h" /* for qemu_isdigit */
>  #include "qemu/main-loop.h"
>  
>  #ifndef AI_ADDRCONFIG
> @@ -511,19 +510,15 @@ InetSocketAddress *inet_parse(const char *str, Error **errp)
>              goto fail;
>          }
>          addr->ipv6 = addr->has_ipv6 = true;
> -    } else if (qemu_isdigit(str[0])) {
> -        /* IPv4 addr */
> -        if (2 != sscanf(str, "%64[0-9.]:%32[^,]%n", host, port, &pos)) {
> -            error_setg(errp, "error parsing IPv4 address '%s'", str);
> -            goto fail;
> -        }
> -        addr->ipv4 = addr->has_ipv4 = true;
>      } else {
> -        /* hostname */
> +        /* hostname or IPv4 addr */
>          if (2 != sscanf(str, "%64[^:]:%32[^,]%n", host, port, &pos)) {
>              error_setg(errp, "error parsing address '%s'", str);
>              goto fail;
>          }
> +        if (strcspn(host, "0123456789.") == 0) {

I think what you want here is:

        if (host[strspn(host, "0123456789.")] == '\0') {

Otherwise, you're still basically testing

	qemu_isdigit(str[0]) || str[0] == '.'

Paolo

> +            addr->ipv4 = addr->has_ipv4 = true;
> +        }
>      }
>  
>      addr->host = g_strdup(host);
>
Ján Tomko June 18, 2013, 11:29 a.m. UTC | #2
On 06/18/2013 11:42 AM, Paolo Bonzini wrote:
> Il 03/06/2013 17:54, Ján Tomko ha scritto:
>> According to RFC 1123 [1], hostnames can start with a digit too.
>>
>> [1] http://tools.ietf.org/html/rfc1123#page-13
>>
>> Signed-off-by: Ján Tomko <jtomko@redhat.com>
>> ---

>>      } else {
>> -        /* hostname */
>> +        /* hostname or IPv4 addr */
>>          if (2 != sscanf(str, "%64[^:]:%32[^,]%n", host, port, &pos)) {
>>              error_setg(errp, "error parsing address '%s'", str);
>>              goto fail;
>>          }
>> +        if (strcspn(host, "0123456789.") == 0) {
> 
> I think what you want here is:
> 
>         if (host[strspn(host, "0123456789.")] == '\0') {
> 

Yes, thank you for catching that.

Jan

> Otherwise, you're still basically testing
> 
> 	qemu_isdigit(str[0]) || str[0] == '.'
> 
> Paolo
> 
>> +            addr->ipv4 = addr->has_ipv4 = true;
>> +        }
>>      }
>>  
>>      addr->host = g_strdup(host);
>>
> 
>
diff mbox

Patch

diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index fdd8dc4..727dafa 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -24,7 +24,6 @@ 
 
 #include "monitor/monitor.h"
 #include "qemu/sockets.h"
-#include "qemu-common.h" /* for qemu_isdigit */
 #include "qemu/main-loop.h"
 
 #ifndef AI_ADDRCONFIG
@@ -511,19 +510,15 @@  InetSocketAddress *inet_parse(const char *str, Error **errp)
             goto fail;
         }
         addr->ipv6 = addr->has_ipv6 = true;
-    } else if (qemu_isdigit(str[0])) {
-        /* IPv4 addr */
-        if (2 != sscanf(str, "%64[0-9.]:%32[^,]%n", host, port, &pos)) {
-            error_setg(errp, "error parsing IPv4 address '%s'", str);
-            goto fail;
-        }
-        addr->ipv4 = addr->has_ipv4 = true;
     } else {
-        /* hostname */
+        /* hostname or IPv4 addr */
         if (2 != sscanf(str, "%64[^:]:%32[^,]%n", host, port, &pos)) {
             error_setg(errp, "error parsing address '%s'", str);
             goto fail;
         }
+        if (strcspn(host, "0123456789.") == 0) {
+            addr->ipv4 = addr->has_ipv4 = true;
+        }
     }
 
     addr->host = g_strdup(host);