]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
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 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))
        {