[ipv6] Verify validity of IPv6 address in inet6_aton
authorMatthew Iselin <matthew@theiselins.net>
Thu, 2 Jun 2011 13:14:37 +0000 (23:14 +1000)
committerMarty Connor <mdc@etherboot.org>
Thu, 21 Jul 2011 00:49:39 +0000 (20:49 -0400)
Signed-off-by: Matthew Iselin <matthew@theiselins.net>
Signed-off-by: Marty Connor <mdc@etherboot.org>
src/net/ipv6.c

index 489db44..97665b8 100644 (file)
@@ -499,13 +499,34 @@ char * inet6_ntoa ( struct in6_addr in6 ) {
 int inet6_aton ( const char *cp, struct in6_addr *inp ) {
        char convbuf[40];
        char *tmp = convbuf, *next = convbuf;
-       size_t i = 0;
+       size_t i = 0, len = strlen ( cp );
+       int ok;
+       char c;
+       
+       /* Verify a valid address. */
+       if ( ! len ) {
+               return 0;
+       }
+       
+       for ( ; i < len; i++ ) {
+               c = cp[i];
+               
+               ok = c == ':';
+               ok = ok || ( ( c >= '0' ) && ( c <= '9' ) );
+               ok = ok || ( ( c >= 'a' ) && ( c <= 'f' ) );
+               ok = ok || ( ( c >= 'A' ) && ( c <= 'F' ) );
+               
+               if ( ! ok ) {
+                       return 0;
+               }
+       }
        
        strcpy ( convbuf, cp );
        
        DBG ( "ipv6 converting %s to an in6_addr\n", cp );
        
        /* Handle the first part of the address (or all of it if no zero-compression. */
+       i = 0;
        while ( ( next = strchr ( next, ':' ) ) ) {
                /* Cater for zero-compression. */
                if ( *tmp == ':' )