diff options
author | Bruce Momjian <bruce@momjian.us> | 1998-10-12 15:56:34 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 1998-10-12 15:56:34 +0000 |
commit | a643d97f2941a4c0e8825233311ac92289874889 (patch) | |
tree | 5cc9d620393e4eeab61731d68fea900ad51dfee3 /src/backend/utils/adt/inet_net_pton.c | |
parent | 5d79f26e5b810f963ba4fb5abb0f4c45320bdb39 (diff) | |
download | postgresql-a643d97f2941a4c0e8825233311ac92289874889.tar.gz postgresql-a643d97f2941a4c0e8825233311ac92289874889.zip |
Fix for inet from Tom H.
Diffstat (limited to 'src/backend/utils/adt/inet_net_pton.c')
-rw-r--r-- | src/backend/utils/adt/inet_net_pton.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/backend/utils/adt/inet_net_pton.c b/src/backend/utils/adt/inet_net_pton.c index 5944327402e..92a3de8885c 100644 --- a/src/backend/utils/adt/inet_net_pton.c +++ b/src/backend/utils/adt/inet_net_pton.c @@ -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)) { |