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

index 882dc4b48b7d736347990ff9e5e1da44ba56d3ce..1ccff39f29b329154db0ec5a7087076dd059dec1 100644 (file)
@@ -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))
        {