Fix for inet from Tom H.
authorBruce Momjian
Mon, 12 Oct 1998 15:56:34 +0000 (15:56 +0000)
committerBruce Momjian
Mon, 12 Oct 1998 15:56:34 +0000 (15:56 +0000)
src/backend/utils/adt/inet_net_pton.c

index 5944327402e5c5269a0b8732866009eb30e8487f..92a3de8885c383a215892deea58eb8f25d6abeda 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id: inet_net_pton.c,v 1.3 1998/10/12 01:30:26 momjian Exp $";
+static const char rcsid[] = "$Id: inet_net_pton.c,v 1.4 1998/10/12 15:56:34 momjian Exp $";
 
 #endif
 
@@ -105,7 +105,8 @@ inet_net_pton_ipv4(const char *src, u_char *dst, size_t size)
        /* Hexadecimal: Eat nybble string. */
        if (size <= 0)
            goto emsgsize;
-       *dst = 0, dirty = 0;
+       tmp = 0;
+       dirty = 0;
        src++;                  /* skip x or X. */
        while ((ch = *src++) != '\0' &&
               isascii(ch) && isxdigit(ch))
@@ -114,16 +115,20 @@ inet_net_pton_ipv4(const char *src, u_char *dst, size_t size)
                ch = tolower(ch);
            n = strchr(xdigits, ch) - xdigits;
            assert(n >= 0 && n <= 15);
-           *dst |= n;
-           if (!dirty++)
-               *dst <<= 4;
-           else if (--size > 0)
-               *++dst = 0, dirty = 0;
-           else
+           tmp = (tmp << 4) | n;
+           if (++dirty == 2) {
+               if (size-- <= 0)
+                   goto emsgsize;
+               *dst++ = (u_char) tmp;
+               tmp = 0, dirty = 0;
+           }
+       }
+       if (dirty) {
+           if (size-- <= 0)
                goto emsgsize;
+           tmp <<= 4;
+           *dst++ = (u_char) tmp;
        }
-       if (dirty)
-           size--;
    }
    else if (isascii(ch) && isdigit(ch))
    {